ssheduardo / sermepa

Clase para utilizar la pasarela de pagos redsys, sermepa.
MIT License
191 stars 59 forks source link

Problemas con devoluciones #98

Closed manuweb closed 7 months ago

manuweb commented 8 months ago

Buenos días y Feliz Año!!

Estoy intentando hacer una devolución usando el siguiente código:

include 'Sermepa/Tpv/Tpv.php';

$key = 'sq7HjrUOBfKmC576ILgskD5srU870gJ7'; // no esta, mi Key válida

$redsys = new Sermepa\Tpv\Tpv();
$redsys->setAmount('2.55');
$redsys->setOrder('2024XVRCJ7Y0'); // este pedido existe y por ese importe
$redsys->setMerchantcode('999008881'); //no este, mi Merchantcode correcto
$redsys->setCurrency('978');
$redsys->setTransactiontype('3');
$redsys->setTerminal('1');
$redsys->setEnvironment('live'); 

$signature = $redsys->generateMerchantSignature($key);
$redsys->setMerchantSignature($signature);

try {
    $response = $redsys->send();
    $response = json_decode($response, true);
    $parameters = $redsys->getMerchantParameters($response['Ds_MerchantParameters']);
    $DsResponse = $parameters['Ds_Response'] ?? 99999999999;
    $DsResponse += 0;
    if ($redsys->check($key, $response) and ($DsResponse <= 99 or $DsResponse == 900 or $DsResponse == 400)) {
        //Si es todo correcto 
        print_r($parameters);
    } else {
        //acciones a realizar si ha sido erroneo
    }
} catch (Exception $e) {
echo $e;
}

No me funciona y me está volviendo loco.

¿Alguna forma de hacerlo distinta a esta?

Gracias.

ssheduardo commented 8 months ago

Esta solución la propuso el compañero @alphp https://github.com/ssheduardo/sermepa/issues/93#issuecomment-1866079688

¿Pero que error te esta dando?

manuweb commented 8 months ago

Esta solución la propuso el compañero @alphp https://github.com/ssheduardo/sermepa/issues/93#issuecomment-1866079688

¿Pero que error te esta dando?

@ssheduardo muchas gracias por contestar.

Precisamente es el código de @alphp el que estoy usando.

Me da error en $parameters = $redsys->getMerchantParameters($response['Ds_MerchantParameters']);

Puse para ver que pasaba un print_r($response); y la consola del navegador parecía volverse loca.

Para un pago normal me funciona correctamente.

¿Podría ser algo que el banco no tenga configurado para devoluciones?, porque desde https://canales.redsys.es si puedo hacer la devolución manualmente.

Gracias.

ssheduardo commented 8 months ago

Entiendo que la devolución lo estas probando primero en el entorno de desarrollo?. Intenta guardar el print_r en algún archivo.

manuweb commented 8 months ago

Entiendo que la devolución lo estas probando primero en el entorno de desarrollo?. Intenta guardar el print_r en algún archivo.

Pues es un entorno de desarrollo pero lo estoy intentado en 'live' porque ya estoy haciendo pruebas para real y tengo el terminal del banco en modo real.

Voy a intentar guardar el print_r para ver que guarda.

Gracias

alphp commented 8 months ago

Me da error en $parameters = $redsys->getMerchantParameters($response['Ds_MerchantParameters']);

Creo recordar que una vez realizada una devolución si intentabas otra con el mismo número de orden te daba un error y no devolvía en response el Ds_MerchantParameters. Hablo de memoria y con las fiestas no me fiaría demasiado. Puedes guardar la respuesta de la petición para ver qué está pasando realmente añadiendo dos líneas, una para guardar la respuesta en "raw" y otra "decodificada":

    $response = $redsys->send();
    file_put_contents('response_raw.json', $response);
    $response = json_decode($response, true);
    file_put_contents('response_decoded.txt', print_r($response, true));
    $parameters = $redsys->getMerchantParameters($response['Ds_MerchantParameters']);
alphp commented 8 months ago

Acabo de ver el error, el entorno para la devolución tiene que ser restLive, no live:

$redsys->setEnvironment('restLive');
ssheduardo commented 8 months ago

Acabo de ver el error, el entorno para la devolución tiene que ser restLive, no live:

$redsys->setEnvironment('restLive');

Genial, solo era eso. Si eso tratare de agregar ese ejemplo al README.

manuweb commented 8 months ago

Acabo de ver el error, el entorno para la devolución tiene que ser restLive, no live:

$redsys->setEnvironment('restLive');

¡¡Pues era eso, logrado la devolución!!

$redsys->setEnvironment('restLive');

Muchas gracias @alphp y @ssheduardo