ssheduardo / sermepa

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

Call to undefined method Sermepa\Tpv\Tpv::send() #80

Closed ChicoDeLosGatos closed 2 years ago

ChicoDeLosGatos commented 2 years ago

Buenas, estoy intentando realizar un cobro por suscripción.

Sigo las instrucciones de la documentación, aquí mi código:

$key = 'sq7HjrUOBfKmC576ILgskD5srU870gJ7';

$redsys = new Tpv();
$redsys->setAmount($amount);
$redsys->setOrder($order);
$redsys->setMerchantcode($merchantcode);
$redsys->setCurrency($currency);
$redsys->setTransactiontype($type);
$redsys->setTerminal("1");
$redsys->setMethod('T');
$redsys->setIdentifier($platform_code); //Contiene el token de la tarjeta recogido por redirección la primera vez que se paga 
$redsys->setEnvironment('test'); // He puesto 'test' porque 'restTest' no me lo reconocía. 
$redsys->setMerchantCofIni(false);
$redsys->setMerchantCofType('R');

$response = json_decode($redsys->send(), true);
$parameters = $redsys->getMerchantParameters($response['Ds_MerchantParameters']);
$DsResponse = $parameters["Ds_Response"];
$DsResponse += 0;

if ($redsys->check($key, $response) && $DsResponse <= 99) {
    //Si es todo correcto ya podemos hacer lo que necesitamos, para este ejemplo solo mostramos los datos.
    dd($parameters);
} else {
    //acciones a realizar si ha sido erroneo
}

El caso es que cuando ejecuto la función send() me salta un error que dice Call to undefined method Sermepa\Tpv\Tpv::send().

He probado con otras funciones como la de createForm() y en esas no hay ningún error, pero yo necesito usar la de send() ya que quiero hacerlo por webservice sin interacción del usuario para cobrar las mensualidades automáticamente.

Por qué puede estar pasando?

Gracias de antemano :)

ssheduardo commented 2 years ago

Que versión estas usando de la librería?

ChicoDeLosGatos commented 2 years ago

Estoy usando el paquete de ssheduardo/redsys-laravel: ~1.4.0

ssheduardo commented 2 years ago

Que raro la verdad que te diga que no existe el método. De todas formas mira que tienes que enviar al entorno test de Rest.

$redsys->setEnvironment('restTest'); //Rest entorno test

ssheduardo commented 2 years ago

Igualmente mira este issue de esta otra persona que le salta un error pero por parte del banco y también esta realizando un pago recurrente por REST.

https://github.com/ssheduardo/sermepa/issues/81

ChicoDeLosGatos commented 2 years ago

Que raro la verdad que te diga que no existe el método. De todas formas mira que tienes que enviar al entorno test de Rest.

$redsys->setEnvironment('restTest'); //Rest entorno test

He vuelto a poner restTest y me salta este mensaje

Add test or live

Aquí tienes el código

$key = 'sq7HjrUOBfKmC576ILgskD5srU870gJ7';
$redsys = new Tpv();
$redsys->setAmount($amount);
$redsys->setOrder(time());
$redsys->setMerchantcode($merchantcode); //Reemplazar por el código que proporciona el banco
$redsys->setCurrency('978');
$redsys->setTransactiontype('0');
$redsys->setTerminal('1');
$redsys->setIdentifier($subscription->payment_platform_code);
$redsys->setVersion('HMAC_SHA256_V1');
$redsys->setEnvironment('restTest'); //Rest entorno test
$redsys->setMerchantCofIni(false);
$redsys->setMerchantCofTxnid($data->ds_merchant_cof_txnid);

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

$response = json_decode($redsys->send(), true);

$parameters = $redsys->getMerchantParameters($response['Ds_MerchantParameters']);
$DsResponse = $parameters["Ds_Response"];
$DsResponse += 0;
if ($redsys->check($key, $response) && $DsResponse <= 99) {
   //Si es todo correcto ya podemos hacer lo que necesitamos, para este ejemplo solo mostramos los datos.
   dd($parameters);
} else {
   //acciones a realizar si ha sido erroneo
}
ChicoDeLosGatos commented 2 years ago

Probé a realizarlo "a mano" reproducidendo lo que veía que hacía la función de send en el código, al principio me salía el mismo error que le salía al del problema #81, por lo que les escribí al banco y me dijeron esto:

En primer lugar, aclararle que es necesario que se envíen 2 peticiones. Una primera petición vía REST solicitando la operación y luego una segunda petición para gestionarla, en este caso la trataPeticion.

El error que están presentando se debe a que están intentando realizar la operación de trataPetición sin enviar la primera y es por ello que la misma no se puede completar.

Estuve intentando realizar esto pero me da muchos problemas porque cuando llego al formulario para la segunda operación me dice que la clave está mal, por lo que he vuelto a la primera opción que era usar este paquete porque para realizar los pagos normales con la pasarela me va bien, el problema lo tengo con los de rest.

ChicoDeLosGatos commented 2 years ago

Que raro la verdad que te diga que no existe el método. De todas formas mira que tienes que enviar al entorno test de Rest. $redsys->setEnvironment('restTest'); //Rest entorno test

He vuelto a poner restTest y me salta este mensaje

Add test or live

Aquí tienes el código

$key = 'sq7HjrUOBfKmC576ILgskD5srU870gJ7';
$redsys = new Tpv();
$redsys->setAmount($amount);
$redsys->setOrder(time());
$redsys->setMerchantcode($merchantcode); //Reemplazar por el código que proporciona el banco
$redsys->setCurrency('978');
$redsys->setTransactiontype('0');
$redsys->setTerminal('1');
$redsys->setIdentifier($subscription->payment_platform_code);
$redsys->setVersion('HMAC_SHA256_V1');
$redsys->setEnvironment('restTest'); //Rest entorno test
$redsys->setMerchantCofIni(false);
$redsys->setMerchantCofTxnid($data->ds_merchant_cof_txnid);

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

$response = json_decode($redsys->send(), true);

$parameters = $redsys->getMerchantParameters($response['Ds_MerchantParameters']);
$DsResponse = $parameters["Ds_Response"];
$DsResponse += 0;
if ($redsys->check($key, $response) && $DsResponse <= 99) {
   //Si es todo correcto ya podemos hacer lo que necesitamos, para este ejemplo solo mostramos los datos.
   dd($parameters);
} else {
   //acciones a realizar si ha sido erroneo
}

Edito, tras realizar un composer update ya me deja realizar el send() y ya no me sale el mensaje de add test or live.

Tras eso, me encuentro en el mismo caso que aquí

Probé a realizarlo "a mano" reproducidendo lo que veía que hacía la función de send en el código, al principio me salía el mismo error que le salía al del problema #81, por lo que les escribí al banco y me dijeron esto:

En primer lugar, aclararle que es necesario que se envíen 2 peticiones. Una primera petición vía REST solicitando la operación y luego una segunda petición para gestionarla, en este caso la trataPeticion. El error que están presentando se debe a que están intentando realizar la operación de trataPetición sin enviar la primera y es por ello que la misma no se puede completar.

Estuve intentando realizar esto pero me da muchos problemas porque cuando llego al formulario para la segunda operación me dice que la clave está mal, por lo que he vuelto a la primera opción que era usar este paquete porque para realizar los pagos normales con la pasarela me va bien, el problema lo tengo con los de rest.

ya que me sale el mensaje SIS0218 y, después de haber hablado con los del banco sé que es porque se tiene que hacer en dos pasos, existe algun procedimiento anterior que haya que hacer antes de lanzar el código que te he citado? (Teninendo en cuenta, que antes el cliente ya habia pagado la primera vez y yo ya habia recogido el token de su tarjeta y su CofTxnid)

ssheduardo commented 2 years ago

Ya he visto el error, esta en el ejemplo de la documentación. Voy a actualizarlo.

En el ejemplo que has puesto cambia y agrega esto: Cambia $redsys->setMerchantCofIni('N'); Y agrega $redsys->setMerchantDirectPayment(true);

Al ejecutarlo ya devuelve:

Array
(
    [Ds_Amount] => 7500
    [Ds_Currency] => 978
    [Ds_Order] => 1646648966
    [Ds_MerchantCode] => xxxxxx
    [Ds_Terminal] => 1
    [Ds_Response] => 0000
    [Ds_AuthorisationCode] => 504411
    [Ds_TransactionType] => 0
    [Ds_SecurePayment] => 0
    [Ds_Language] => 1
    [Ds_Merchant_Identifier] => xxxxxxxxxxxxxxxxxxx
    [Ds_MerchantData] => 
    [Ds_Card_Country] => 724
    [Ds_Card_Brand] => 1
    [Ds_Merchant_Cof_Txnid] => xxxxxxxxx
    [Ds_ProcessedPayMethod] => 3
    [Ds_Control_1646648950200] => 1646648950200
)

Ya me dices si te ha funcionado.

ChicoDeLosGatos commented 2 years ago

Perfecto, ahora sí que me funciona, era eso! Muchas gracias!

ssheduardo commented 2 years ago

Genial.

ChicoDeLosGatos commented 2 years ago

Eso sí, en el entorno live funcionará igual de bien no? No hay que ponerle restLive?

ssheduardo commented 2 years ago

Se debe poner restLive dado que lo estas enviando por Rest.

ChicoDeLosGatos commented 2 years ago

Vale perfecto, gracias por la ayuda! :)

josuelmm commented 4 days ago

Mismo problema pero siempre devuelve error 0195 Requiere autenticación SCA