• Stars
    star
    191
  • Rank 202,877 (Top 4 %)
  • Language
    PHP
  • License
    MIT License
  • Created almost 13 years ago
  • Updated 9 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Clase para utilizar la pasarela de pagos redsys, sermepa.

Redsys

Latest Version on Packagist Software License Total Downloads Run Tests


Visual Studio Code 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
)

Obtener un array de los datos devueltos por Ds_MerchantParameters

$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! 馃槈

paypal