ssheduardo / sermepa

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

Comprobación del pago #38

Closed lowels closed 7 years ago

lowels commented 8 years ago

Hola,

Desde la actualización a sha-256 el método getMerchantParameters() no me funciona correctamente.

En el momento de llamar $decodec = $this->decodeParameters($parameters); el resultado para $decodec es: "{"Ds_Date":"18%2F07%2F2016","Ds_Hour":"18%3A41","Ds_SecurePayment":"1","Ds_Card_Country":"724","Ds_Amount":"950","Ds_Currency":"978","Ds_Order":"160718124025","Ds_MerchantCode":"0619XXXXX","Ds_Terminal":"001","Ds_Response":"0000","Ds_MerchantData":"16","Ds_TransactionType":"0","Ds_ConsumerLanguage":"1","Ds_AuthorisationCode":"3927"

Luego al llamar a $decodec_array=$this->JsonToArray($decodec); el resultado es nulo, con lo que la posterior comprobación del pago siempre es negativa

¿Alguna sugerencia?

Muchas gracias

ssheduardo commented 8 years ago

Hola, No se la lógica que estas usando para procesar la notificación online, lo acabo de probar y funciona correctamente.

Te adjunto el código que utilizo.


include_once('TU-RUTA-AL-FICHERO/Tpv.php');
$fichero = 'notifi.log';

if(isset($_POST['Ds_MerchantParameters']))
{   
    try{
        $redsys = new Sermepa\Tpv\Tpv();
        $key = 'sq7HjrUOBfKmC576ILgskD5srU870gJ7';

        $parameters = $redsys->getMerchantParameters($_POST["Ds_MerchantParameters"]);
        $DsResponse = $parameters["Ds_Response"];
        $DsResponse += 0;
        if ($redsys->check($key, $_POST) && $DsResponse <= 99) {
            file_put_contents($fichero, print_r($parameters,true), FILE_APPEND | LOCK_EX);
        } else {
            //acciones a realizar si ha sido erroneo
        }
    }
    catch(Exception $e){
        echo $e->getMessage();
    }
}

Esto te devuelve en tu archivo noti.log el siguiente valor:

Array
(
    [Ds_Date] => 20/07/2016
    [Ds_Hour] => 08:33
    [Ds_SecurePayment] => 1
    [Ds_Card_Number] => 454881******0004
    [Ds_Card_Country] => 724
    [Ds_Amount] => 4400
    [Ds_Currency] => 978
    [Ds_Order] => 1468996372
    [Ds_MerchantCode] => 999008881
    [Ds_Terminal] => 001
    [Ds_Response] => 0000
    [Ds_TransactionType] => 0
    [Ds_ConsumerLanguage] => 1
    [Ds_AuthorisationCode] => 916611
)

Y por otro lado el ok.php muestra esto:

Pay success

Array
(
    [Ds_SignatureVersion] => HMAC_SHA256_V1
    [Ds_MerchantParameters] => eyJEc19EYXRlIjoiMjAlMkYwNyUyRjIwMTYiLCJEc19Ib3VyIjoiMDglM0EzMyIsIkRzX1NlY3VyZVBheW1lbnQiOiIxIiwiRHNfQW1vdW50IjoiNDQwMCIsIkRzX0N1cnJlbmN5IjoiOTc4IiwiRHNfT3JkZXIiOiIxNDY4OTk2MzcyIiwiRHNfTWVyY2hhbnRDb2RlIjoiOTk5MDA4ODgxIiwiRHNfVGVybWluYWwiOiIwMDEiLCJEc19SZXNwb25zZSI6IjAwMDAiLCJEc19UcmFuc2FjdGlvblR5cGUiOiIwIiwiRHNfTWVyY2hhbnREYXRhIjoic3NoLmVkdWFyZG8lNDBnbWFpbC5jb21fMTBfNjQ0NTVfRGVzY3JpcGNpb25fZGVsX3BlZGlkbyIsIkRzX0F1dGhvcmlzYXRpb25Db2RlIjoiOTE2NjExIiwiRHNfQ2FyZF9OdW1iZXIiOiI0NTQ4ODEqKioqKiowMDA0IiwiRHNfQ29uc3VtZXJMYW5ndWFnZSI6IjEiLCJEc19DYXJkX0NvdW50cnkiOiI3MjQifQ==
    [Ds_Signature] => 3_UBzqK0Utvex_v53vT38Qj_0EAqXlDIQdqcFjVPmiQ=
)

Espero te sea de utilidad.

lowels commented 8 years ago

Gracias por tu respuesta,

Compruebo la notificación basándome en la documentación que facilitas. Esto es lo que hago:

` try{ $redsys = new Sermepa\Tpv\Tpv(); $redsys->setEnviroment($app["config"]["redsys"]["env"]);

$parameters = $redsys->getMerchantParameters($request->request->get("Ds_MerchantParameters"));
$DsResponse = $parameters["Ds_Response"];
$DsResponse += 0;

if ($redsys->check($app["config"]["redsys"]["key"], $request->request->all()) && $DsResponse <= 99)
{
    ...
}

} catch(Exception $e){ echo $e->getMessage(); } `

Las partes de código del comentario anterior son del método getMerchantParameters.

Al ver que siempre recibía un nulo, me fijé en lo que pasaba en ese método, que es lo que expongo en el comentario anterior. ¿Puede ser error de redsys?

Muchas gracias

ssheduardo commented 8 years ago

Yo he probado hace nada en el entorno de pruebas, con los datos que facilita Redsys y funciona. Te pasa lo mismo?