ssheduardo / sermepa

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

No obtiene datos desde API REST #64

Closed danijmurcia closed 5 years ago

danijmurcia commented 5 years ago

Buenas, he integrado con tu librería la pasarela de pago y va todo bien, el problema viene cuando intento hacer la comprobación del pago, en mi api rest tengo:

try{ $key = config('redsys.key'); $parameters = Redsys::getMerchantParameters($request->input('Ds_MerchantParameters')); $DsResponse = $parameters["Ds_Response"]; $DsResponse += 0; if ($redsys->check($key, $_POST) && $DsResponse <= 99) { $user = new User(); $user->password = '1234'; $user->email = 'asd@asd.com'; $user->rol_id = '1'; $user->save(); $user->success = true; $user->msg = 'Usuario insertado correctamente'; } else { $user = new User(); $user->password = '1234'; $user->email = 'asd@asd.com'; $user->rol_id = '1'; $user->save(); $user->success = true; $user->msg = 'Usuario insertado correctamente'; } } catch (\Exception $e) { echo $e->getMessage(); }

y lo pongo en : $redsys->setNotification('http://127.0.0.1:8000/api/payment/comprobar'); //Url de notificacion La ruta de la api es tengo esas dos por si acaso: Route::get('comprobar', 'RedsysController@comprobar'); Route::post('comprobar', 'RedsysController@comprobar');

y cuando cancelo un pago no me genera el usuario en la db, alguna idea de por que puede ser ?

NilLlisterri commented 5 years ago

Buenas DaniMujica, Redsys nunca notificará a una URL que no sea públicamente accesible. Para recibirla necesitas un dominio.

ssheduardo commented 5 years ago

Efectivamente lo que comenta @NilLlisterri, redsys necesita una URL publica para hacer el llamado, no puede hacerlo sobre la dirección 127.0.0.1 que es tu localhost. Espero te sirva @DaniJmurcia

danijmurcia commented 5 years ago

No lo tengo subido a localhost, lo tengo subido a un servidor, perdón por la url de localhost, copié el archivo que tenia en local pero sigue devolviéndome lo mismo

danijmurcia commented 5 years ago

Este es el metodo que llamo en:
$redsys->setNotification('https://.../api/public/api/payment/comprobar'); //Url de notificacion

    public function comprobar(Request $request)
    {
        try{
            $key = config('redsys.key');
            $parameters = Redsys::getMerchantParameters($request->input('Ds_MerchantParameters'));
            $DsResponse = $parameters["Ds_Response"];
            $DsResponse += 0;
            if (Redsys::check($key, $request->input()) && $DsResponse <=99) {
                $user = new User();
                $user->password = '1234';
                $user->email = 'asd@asd.com';
                $user->rol_id = '1';
                $user->save();
                $user->success = true;
                $user->msg = 'Usuario insertado correctamente';
            } else {
                $user = new User();
                $user->password = '1234';
                $user->email = 'asd@asd.com';
                $user->rol_id = '1';
                $user->save();
                $user->success = true;
                $user->msg = 'Usuario insertado correctamente';
            }

        } catch (\Exception $e) {
            echo $e->getMessage();
        }
    }
dgome commented 5 years ago

Hola, ¿has probado a poner el $user->save(); después de $user->msg = 'Usuario insertado correctamente'; ?

danijmurcia commented 5 years ago

Hola, al parecer ya he solucionado el problema es que estaba usando esta librería https://github.com/ssheduardo/sermepa en vez de https://github.com/ssheduardo/redsys-laravel o eso o tenia mal la URL de la notificación.

Lo que si tengo una pregunta en la URL de notificación como recojo la cantidad pagada ? $parameters->amount ? o $request->amount en la documentación de la pasarela de pago no dicen nada o no lo he encontrado

Un saludo

dgome commented 5 years ago

Creo que podrías recogerla con esto:

$DsAmount = $parameters["Ds_Amount"];

Edito: Si el precio es 34€ cuando recibes el array $parameters[] viene expresado como 'Ds_Amount' => '3400'

danijmurcia commented 5 years ago

Muchas gracias !!

danijmurcia commented 5 years ago

@palote2015 No hay ninguna manera de pasear el precio cuando lo recibo del array ? si hago un casting no tiene sentido por que la variable no son decimales lo devuelve entero, si hago un rtrim tampoco por que si introduce 1000 euros solo coge 1 y no se me ocurre nada.. gracias de antemano

ssheduardo commented 5 years ago

Hola @DaniJmurcia , efectivamente te devuelve un entero, pero lo que puedes hacer es dividirlo entre 100 Si vez esta parte de código:

$amount = intval(strval($amount * 100));

Dicho valor se pasa a entero, creo que con dividirlo, obtienes el valor inicial.