Redsys
This project is friendly supported by Visual Studio Code!
Historia
Esta clase nace porque no encontraba una clase de pasarela de pagos (TPV) que se pueda integrar directamente en una web. Existen muchas pero para varios CMS y no me serv铆an, solo quer铆a montar algo f谩cil que pueda usar. Los ejemplos que vienen en la documentaci贸n oficial eran muy simples as铆 que decidi realizar esta clase y ahora lo comparto con todos.
V谩lido para Sermepa y Redsys.
Introducci贸n
La clase sermepa
actualmente Redsys
sirve para generar el formulario que se comunicar谩 con la pasarela de pagos que usan muchos bancos, como Santander, Sabadell, Lacaixa, etc.
Es una versi贸n que ir谩 creciendo y actualiz谩ndose poco a poco y mejor谩ndolo. Si lo usas en alg煤n proyecto y te ayudo en algo no dudes en dec铆rmelo
Requerimientos m铆nimos
PHP 5 >= 5.3.0, PHP 7.1, 8.0
Cr茅ditos
Clase creada por Eduardo Diaz, Madrid 2012 Twitter: @eduardo_dx
Actualizaci贸n
- Agregado namespace.
- Se actualiza para trabajar con sha256, que ha sido un requisito del banco.
- Se cambian todos los nombres de la clases a ingles.
- Se crean nuevos m茅todos.
- Para facilitar la integraci贸n usamos funciones ya creadas.
- Rest.
Instalaci贸n
Si usas composer tienes 2 opciones
1.- Por l铆nea de comandos
composer require sermepa/sermepa
2.- Creas o agregas a tu archivo composer.json la siguiente dependencia:
{
"require": {
"sermepa/sermepa": "^1.3.2"
}
}
Luego ejecutas:
composer update
Si en caso contrario no usas composer, bastar谩 con clonar el repositorio
git clone https://github.com/ssheduardo/sermepa.git
驴C贸mo usar la clase?
Ejemplo:
//Si usas composer
//include_once('vendor/autoload.php');
//Si clonaste la clase
//include_once('sermepa/src/Sermepa/Tpv/Tpv.php');
try{
//Key de ejemplo
$key = 'sq7HjrUOBfKmC576ILgskD5srU870gJ7';
$redsys = new Sermepa\Tpv\Tpv();
$redsys->setAmount(rand(10,600));
$redsys->setOrder(time());
$redsys->setMerchantcode('999008881'); //Reemplazar por el c贸digo que proporciona el banco
$redsys->setCurrency('978');
$redsys->setTransactiontype('0');
$redsys->setTerminal('1');
$redsys->setMethod('C'); //Solo pago con tarjeta, no mostramos iupay
$redsys->setNotification('http://localhost/noti.php'); //Url de notificacion
$redsys->setUrlOk('http://localhost/ok.php'); //Url OK
$redsys->setUrlKo('http://localhost/ko.php'); //Url KO
$redsys->setVersion('HMAC_SHA256_V1');
$redsys->setTradeName('Tienda S.L');
$redsys->setTitular('Pedro Risco');
$redsys->setProductDescription('Compras varias');
$redsys->setEnvironment('test'); //Entorno test
$signature = $redsys->generateMerchantSignature($key);
$redsys->setMerchantSignature($signature);
$form = $redsys->createForm();
} catch (\Sermepa\Tpv\TpvException $e) {
echo $e->getMessage();
}
echo $form;
Con esto generamos el form para la comunicaci贸n con la pasarela de pagos.
Nota
Con la integraci贸n del pago con referencia, ahora el importe puede ser 0. Seg煤n la documentaci贸n, si se quiere generar dicho identificador, se puede pasar el importe a 0 para obtener dicho valor, si en caso contrario no se utiliza el pago con referencia y se pasa el importe en 0, el banco nos mostrar谩 un error.
Enviar datos de la tarjeta
Si queremos enviar los datos de la tarjeta para que no nos lo solicite la pasarela de pagos, podemos hacerlo de la siguiente forma.
try{
$key = 'sq7HjrUOBfKmC576ILgskD5srU870gJ7';
$redsys = new Sermepa\Tpv\Tpv();
$redsys->setAmount(rand(10,600));
$redsys->setOrder(time());
$redsys->setMerchantcode('999008881'); //Reemplazar por el c贸digo que proporciona el banco
$redsys->setCurrency('978');
$redsys->setTransactiontype('0');
$redsys->setTerminal('1');
$redsys->setMethod('C'); //Solo pago con tarjeta, no mostramos iupay
$redsys->setNotification('http://localhost/noti.php'); //Url de notificacion
$redsys->setUrlOk('http://localhost/ok.php'); //Url OK
$redsys->setUrlKo('http://localhost/ko.php'); //Url KO
$redsys->setVersion('HMAC_SHA256_V1');
$redsys->setTradeName('Tienda S.L');
$redsys->setTitular('Pedro Risco');
$redsys->setPan('4548812049400004'); //N煤mero de la tarjeta
$redsys->setExpiryDate('2012'); //AAMM (a帽o y mes)
$redsys->setCVV2('123'); //CVV2 de la tarjeta
$redsys->setEnvironment('test'); //Entorno test
$signature = $redsys->generateMerchantSignature($key);
$redsys->setMerchantSignature($signature);
$form = $redsys->createForm();
} catch (\Sermepa\Tpv\TpvException $e) {
echo $e->getMessage();
}
echo $form;
Pago con referencia
Esta operativa nos permite guardar los datos de la tarjeta. SIS almacena la tarjeta y devuelve la referencia que deber谩 ser almacenada por el comercio.
Imaginemos que en el ejemplo anterior, queremos guardar los datos de la tarjeta, solo bastar谩 con agregar el m茅todo setIdentifier()
. Cuando se haga el llamado a la url de notificaci贸n, 茅ste nos devolver谩 Ds_Merchant_Identifier
y Ds_ExpiryDate
.
//Para una nueva referencia agregar este m茅todo al ejemplo anterior
$redsys->setIdentifier();
//En la url de notificaci贸n nos devolver谩 algo como esto
Array
(
[Ds_Date] => 17%2F02%2F2022
[Ds_Hour] => 23%3A25
[Ds_SecurePayment] => 1
[Ds_Card_Number] => 491801******4602
[Ds_ExpiryDate] => 3212
[Ds_Merchant_Identifier] => 2214a9c5ac0bd6e0fg476e6b3468ac4fa38a592c
[Ds_Card_Country] => 724
[Ds_Amount] => 0
[Ds_Currency] => 978
[Ds_Order] => 1645136683
[Ds_MerchantCode] => 999008881
[Ds_Terminal] => 001
[Ds_Response] => 0000
[Ds_MerchantData] =>
[Ds_TransactionType] => 0
[Ds_ConsumerLanguage] => 1
[Ds_AuthorisationCode] => 005090
[Ds_Card_Brand] => 1
[Ds_Merchant_Cof_Txnid] => 2202172334011
[Ds_ProcessedPayMethod] => 1
[Ds_Control_1645136701458] => 1645136701458
)
Ahora bien, si queremos realizar otro cobro sin que nos pidan los datos de la tarjeta para ese mismo usuario, bastar谩 con pasar el Ds_Merchant_Identifier
anterior en el m茅todo setIdentifier()
.
Cada banco tiene un sistema de seguridad a trav茅s de un c贸digo de SMS, tarjeta de coordenadas, etc. que se mostrar谩 para completar la transacci贸n.
$redsys->setIdentifier(2214a9c5ac0bd6e0fg476e6b3468ac4fa38a592c);
//En la url de notificaci贸n nos devolver谩 algo como esto
Array
(
[Ds_Date] => 17%2F02%2F2022
[Ds_Hour] => 23%3A28
[Ds_SecurePayment] => 1
[Ds_Card_Number] => 491801******4602
[Ds_Merchant_Identifier] => 2214a9c5ac0bd6e0fg476e6b3468ac4fa38a592c
[Ds_Card_Country] => 724
[Ds_Amount] => 12000
[Ds_Currency] => 978
[Ds_Order] => 1645136909
[Ds_MerchantCode] => 999008881
[Ds_Terminal] => 001
[Ds_Response] => 0000
[Ds_MerchantData] =>
[Ds_TransactionType] => 0
[Ds_ConsumerLanguage] => 1
[Ds_AuthorisationCode] => 078737
[Ds_Card_Brand] => 1
[Ds_Merchant_Cof_Txnid] => 2202172334011
[Ds_ProcessedPayMethod] => 1
[Ds_Control_1645136925978] => 1645136925978
)
Si no queremos que nos muestre ninguna pantalla y directamente realice el pago debemos hacer uso del m茅todo setMerchantDirectPayment()
:
$redsys->setMerchantDirectPayment(true);
Tambi茅n podemos hacer los cobros recurrentes a traves de Rest.
try{
//Key de ejemplo
$key = 'sq7HjrUOBfKmC576ILgskD5srU870gJ7';
$redsys = new Sermepa\Tpv\Tpv();
$redsys->setAmount(rand(20,80));
$redsys->setOrder(time());
$redsys->setMerchantcode('999008881'); //Reemplazar por el c贸digo que proporciona el banco
$redsys->setCurrency('978');
$redsys->setTransactiontype('0');
$redsys->setTerminal('1');
$redsys->setIdentifier('2214a9c5ac0bd6e0fg476e6b3468ac4fa38a592c');
$redsys->setVersion('HMAC_SHA256_V1');
$redsys->setEnvironment('restTest'); //Rest entorno test
$redsys->setMerchantCofIni('N');
$redsys->setMerchantDirectPayment(true);
$redsys->setMerchantCofTxnid(2202172334011);
$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.
print_r($parameters);
} else {
//acciones a realizar si ha sido erroneo
}
} catch (\Sermepa\Tpv\TpvException $e) {
echo $e->getMessage();
}
Redirecci贸n autom谩tica
Podemos forzar la redirecci贸n sin pasar por el m茅todo createForm()
(gracias a la colaboraci贸n de jaumecornado)
$redsys->executeRedirection();
Este m茅todo llamar铆a a createForm()
y lanzar铆a el submit por javascript.
Comprobaci贸n de Pago
Podemos comprobar si se ha realizado el pago correctamente (gracias a la colaboraci贸n de markitosgv). Para ello necesitamos setear la clave del banco y pasar la variable $_POST
que nos devuelve en la URL de notificaci贸n o de retorno. Tener en cuenta que debemos realizar esta comprobaci贸n en la url de notificaci贸n. Por ejemplo, en el fichero que es llamado por la URL de retorno:
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) {
//acciones a realizar si es correcto, por ejemplo validar una reserva, mandar un mail de OK, guardar en bbdd o contactar con mensajer铆a para preparar un pedido
} else {
//acciones a realizar si ha sido erroneo
}
} catch (\Sermepa\Tpv\TpvException $e) {
echo $e->getMessage();
}
Nota
Por defecto se conecta por la pasarela de pruebas. Para cambiar a un entorno real, usar el m茅todo setEnvironment('live')
, con esto ya estar谩 activo.
Los entornos que tenemos son:
- test
- live
- restLive
- restTest
M茅todos 煤tiles
Asignar par谩metros
Este m茅todo recibe un array asociativo con los nuevos valores a asignar.
Ejemplo:
$parameters = ['DS_MERCHANT_CHARGEEXPIRYDATE' => '2020', 'DS_MERCHANT_COF_INI' => 'S'];
$redsys->setParameters($parameters);
Asignar nombre a id y name del formulario
$redsys->setNameForm('nombre_formulario');
$redsys->setIdForm('id_formulario');
Cambiar el idioma de la pasarela de pago
//Esto mostrar铆a la pasarela de pago en ingl茅s
$redsys->setLanguage('002');
C贸digos de idiomas disponibles:
- 001: Castellano
- 002: Ingl茅s
- 003: Catal谩n
- 004: Franc茅s
- 005: Alem谩n
- 006: Holand茅s
- 007: Italiano
- 008: Sueco
- 009: Portugu茅s
- 010: Valenciano
- 011: Polaco
- 012: Gallego
- 013: Euskera
Asignar nombre, id, value y style (css) al bot贸n submit
$redsys->setAttributesSubmit('btn_submit', 'btn_id', 'Enviar', 'font-size:14px; color:#ff00c1');
Si us谩is redirecci贸n pod茅is ocultar el bot贸n con display:none
Generar formulario
$redsys->createForm();
Obtener un array con todos los datos asignados
$redsys->getParameters();
Por ejemplo, esto nos devuelve:
Array
(
[DS_MERCHANT_AMOUNT] => 1700
[DS_MERCHANT_ORDER] => 160224230429
[DS_MERCHANT_MERCHANTCODE] => XXXXXX
[DS_MERCHANT_CURRENCY] => 978
[DS_MERCHANT_TRANSACTIONTYPE] => 0
[DS_MERCHANT_TERMINAL] => 1
[DS_MERCHANT_PAYMETHODS] => C
[DS_MERCHANT_MERCHANTURL] => http://demo.com/notificacion.php
[DS_MERCHANT_URLOK] => http://demo.com/accept
[DS_MERCHANT_URLKO] => http://demo.com/cancel
[DS_MERCHANT_MERCHANTNAME] => Tu empresa
[DS_MERCHANT_TITULAR] => Usuario
[DS_MERCHANT_PRODUCTDESCRIPTION] => Tu descripci贸n
)
Ds_MerchantParameters
Obtener un array de los datos devueltos por $redsys->getMerchantParameters($_POST["Ds_MerchantParameters"]);
Esto nos devuelve:
[Ds_Date] => 12/11/2015
[Ds_Hour] => 14:04
[Ds_SecurePayment] => 1
[Ds_Card_Number] => 454881******0004
[Ds_Card_Country] => 724
[Ds_Amount] => 7300
[Ds_Currency] => 978
[Ds_Order] => 1447333990
[Ds_MerchantCode] => 999008881
[Ds_Terminal] => 001
[Ds_Response] => 0000
[Ds_MerchantData] =>
[Ds_TransactionType] => 0
[Ds_ConsumerLanguage] => 1
[Ds_AuthorisationCode] => 906611
Obtener Versi贸n
$redsys->getVersion()
Devuelve el valor asignado en setVersion()
, por ejemplo: HMAC_SHA256_V1
;
Obtener MerchantSignature
$redsys->getMerchantSignature()
Devuelve el valor asignado en setMerchantSignature()
, por ejemplo: Cia90trhTPGxtJDmK6WDhqXzU+98LbuKZKAKYHMjtMs=
Change log
Please see CHANGELOG for more information about what has changed recently.
Licencia
The MIT License (MIT). Please see License File for more information.
Donaci贸n
驴Te gustar铆a apoyarme? 驴Aprecias mi trabajo? 驴Lo usas en proyectos comerciales?
隆Si茅ntete libre de hacer una peque帽a donaci贸n!