Como implementar una pasarela de pago mediante tarjeta de crédito utilizando PHP

En este artículo vamos a ver como implementar una pasarela de pago mediante tarjeta de crédito con PHP empleando el Servidor Integrado de Redsys (Servidor del TPV Virtual) (SIS).

Aunque en la mayoría de gestores de contenido y plataformas de Ecommerce ya disponen de un plugin o módulo con esta implementación, siempre puede ser interesante realizar una pasarela de pago a medida sin necesidad de utilizar ningún gestor de contenido ni plataforma de Ecommerce.

Existe varias formas de implementar una pasarela de pago con tarjeta de crédito utilizando PHP. Nos centraremos en explicar como desarrollar una forma muy sencilla utilizando una programación orientada a objetos con el objetivo de realizar una integración con el TPV Virtual mediante conexión por redirección del navegador del cliente comprador.

Esta forma de conexión permite trasladar la sesión del cliente final al TPV Virtual, de forma que la selección del medio de pago y la introducción de datos se llevan a cabo en el entorno seguro del servidor del TPV Virtual y fuera de la responsabilidad del comercio. Además de la sencillez de implementación para el comercio y la tranquilidad respecto a la responsabilidad de los datos de pago, este modo de conexión da cabida a la utilización de mecanismos de autenticación como el 3D Secure, donde el banco de la tarjeta solicita directamente al titular un dato secreto que permite dotar de más seguridad a las compras.

Antes de ponerte a programar, si aún no lo tienes, es necesario que contrates un servicio TPV Virtual de cualquier banco que trabaje con Redsys y recibir los parámetros necesario para conectar con dicho TPV.

Cuando se ha contratado el servicio de TPV Virtual nos deben facilitar la siguiente información que será imprescindible para realizar la integración:

  • Nombre del comercio
  • Código del comercio
  • Clave secreta SHA-256

En el ejemplo que se ilustra en este artículo hemos decidido crear un formulario donde el usuario decide que cantidad quiere pagar y al pulsar en “pagar” se construyen los parámetros necesarios para mandar al Servidor del TPV Virtual.

Nuestro formulario inicial será tan simple como lo siguiente:

<form class="form-amount" action="index.php" method="post">
    <div class="form-group">
        <label for="amount">Cantidad</label>
        <input type="text" id="amount" name="amount" class="form-control" placeholder="Por ejemplo: 50.00">
    </div>
    <input class="btn btn-lg btn-primary btn-block" name="submitPayment" type="submit" value="Pagar">
</form>

Tan solo es un formulario con un campo para escribir la cantidad a pagar y un botón para enviar.

A continuación mostramos el código que debe ejecutarse al enviar la cantidad que se desea pagar:

<?php
if ($_POST['submitPayment']) {
    include "api/apiRedsys.php";  
    $miObj = new RedsysAPI;
 
    $amount = $_POST['amount'];    
    $url_tpv = 'https://sis.redsys.es/sis/realizarPago';
    $version = "HMAC_SHA256_V1"; 
    $clave = 'TU CLAVE DE COMERCIO'; //poner la clave SHA-256 facilitada por el banco
    $name = 'TU NOMBRE DE COMERCIO';
    $code = 'TU CODIGO DE COMERCIO';
    $terminal = '1';
    $order = date('ymdHis');
    $amount = $amount * 100;
    $currency = '978';
    $consumerlng = '001';
    $transactionType = '0';
    $urlMerchant = 'http://your-domain.com/';
    $urlweb_ok = 'http://your-domain.com/tpv_ok.php';
    $urlweb_ko = 'http://your-domain.com/tpv_ko.php';
 
    $miObj->setParameter("DS_MERCHANT_AMOUNT", $amount);
    $miObj->setParameter("DS_MERCHANT_CURRENCY", $currency);
    $miObj->setParameter("DS_MERCHANT_ORDER", $order);
    $miObj->setParameter("DS_MERCHANT_MERCHANTCODE", $code);
    $miObj->setParameter("DS_MERCHANT_TERMINAL", $terminal);
    $miObj->setParameter("DS_MERCHANT_TRANSACTIONTYPE", $transactionType);
    $miObj->setParameter("DS_MERCHANT_MERCHANTURL", $urlMerchant);
    $miObj->setParameter("DS_MERCHANT_URLOK", $urlweb_ok);      
    $miObj->setParameter("DS_MERCHANT_URLKO", $urlweb_ko);
    $miObj->setParameter("DS_MERCHANT_MERCHANTNAME", $name); 
    $miObj->setParameter("DS_MERCHANT_CONSUMERLANGUAGE", $consumerlng);    
 
    $params = $miObj->createMerchantParameters();
    $signature = $miObj->createMerchantSignature($clave);
    ?>
    <form id="realizarPago" action="<?php echo $url_tpv; ?>" method="post">
        <input type='hidden' name='Ds_SignatureVersion' value='<?php echo $version; ?>'> 
        <input type='hidden' name='Ds_MerchantParameters' value='<?php echo $params; ?>'> 
        <input type='hidden' name='Ds_Signature' value='<?php echo $signature; ?>'> 
    </form>
    <script>
    $(document).ready(function () {
        $("#realizarPago").submit();
    });
    </script>
<?php
}  
?>

En este caso, tenemos un condicional que verifica la pulsación del botón “pagar”. Cuando se pulsa en este botón estamos:

  • Incluyendo en nuestro script la clase de la API. En la página oficial de Redsys puedes encontrar ayuda y descargar los archivos de la API para PHP entre otros lenguajes.
  • Creando un objeto de la API.
  • Guardando la cantidad a pagar en nuestra variable $amount.
  • Declarando la url del tpv en la variable $url_tpv. En el ejemplo está en real. Para ponerlo en modo pruebas debes poner: https://sis-t.redsys.es:25443/sis/realizarPago
  • Declarando la versión de la firma en la variable $version.
  • Declarando la clave SHA-256 en la variable $clave.
  • Declarando el nombre de comercio en la variable $name, facilitado por el banco.
  • Declarando el código de comercio en la variable $code, facilitado por el banco.
  • Declarando el terminal en la variable $terminal, suele ser 1 casi siempre.
  • Declarando la fecha del pago en la variable $order con el formato específico para que el TPV Virtual lo sepa interpretar.
  • Declarando la cantidad a pagar en $amount. La cantidad que escribe el usuario se debe multiplicar por 100 para enviarla al TPV.
  • Declarando la moneda en la variable $currency con valor “978” = Euro.
  • Declarando el idioma en la variable $consumerlng. En el ejemplo estamos poniendo “001” para que aparezca el TPV en español.
  • Declarando el tipo de transacción en la variable $transactionType con valor “0”.
  • Declarando la url del comerciante en la variable $urlMerchant. Debe ser la url para enviar las notificaciones desde el TPV Virtual.
  • Declarando la url para los pagos correctos en la variable $urlweb_ok. Debes crear una página para informar al usuario de que el pago se ha realizado correctamente.
  • Declarando la url para los pagos cancelados o incorrectos en la variable $urlweb_ko. Debes crear una página para informar al usuario de que su pago ha sido erróneo.

Seguidamente usamos la función setParameter() de la clase de la API Redys para establecer los parámetros necesarios para que la conexión con el TPV Virtual tenga éxito. Se crean los parámetros utilizando la función createMerchantParameters(). Y finalmente se genera la firma con la clave SHA-256.

Toda esta información se deposita en los correspondientes inputs ocultos dentro de otro formulario que se envía automáticamente al TPV Virtual con Javascript.

En principio debe funcionar con cualquier banco que disponga del servicio de TPV Virtual con Redsys. En el ejemplo estamos trabajando con ING DIRECT.

tpv-virtual-ingdirect

Envía un pago ahora

1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (2 votos, promedio: 5,00 de 5)
Cargando…

Comparte en las redes sociales

Escrito por Jose Aguilar - Experto programador Prestashop y Wordpress.

9 comentarios para “Como implementar una pasarela de pago mediante tarjeta de crédito utilizando PHP

  • aDesigns dice:

    Justo me viene perfecto este artículo, pues en una pagina que tengo lo tenia con el viejo cifrado SHA-1 y me enviaron un aviso del banco de que habia que actualizarlo antes de octubre por que habia cambiado el cifrado a SHA256. ¿Los archivos de la API en php que hay en la pagina de redsys hay que descargarlos para que funcione o simplemente con lo que has puesto aqui funcionaria sin necesidad de esos archivos?

    Un saludo y gracias de antemano!

    • Jose Aguilar dice:

      Hola,

      Los archivos de la API se deben descargar e incluir en el proyecto para usarlos.

      Saludos

      • aDesigns dice:

        He estado probando, tanto de la forma que lo haces aqui, como en el ejemplo de la api (con el archivo ejemploGeneraPet.php) pero no lo he conseguido de ninguna de las maneras, he heho un print_r a $miObj para ver si enviaba los datos, y si que los envia (esto son parte de los datos del print_r RedsysAPI Object ( [vars_pay] => Array ( [DS_MERCHANT_AMOUNT] => 145 [DS_MERCHANT_ORDER] => ) la cuestion es que en cambio me sale como que no se ha enviado el importe, he probado de varias maneras a ver, y sinceramente no se donde puede estar el fallo (adjunto captura de pantalla de lo que me sale en la pagina de realizar el pago http://prnt.sc/cjw6uq ) ¿Alguna idea de que podria estar mal? (el codigo como ya he dicho antes es el del ejemplo que viene en la api en el archivo ejemploGeneraPet.php )

        Muchas gracias por adelantado

  • Hola Jose.
    Implemento lo que me dices, pero a la hora de ejecutar, se me va a: http://midominio.com/pago-con-tarjeta-2/index.php y por tanto es un error 404.
    He cargado la api de redsis en el directorio /api/apiredsys.php pero nada, no se que puede estar saliendo mal.
    Saludos y gracias de antemano

  • Rafa dice:

    Muy buen tutorial, como enviar datos como nombre, email, etc de vuelta a la pagina de OK?, para desde aqui avisar de que se ha abonado el importe con esos datos

    • Jose Aguilar dice:

      Hola buenos días,

      Quizás una solución sea registrar toda esa información en la base de datos con un identificador del pago que se debería recibir en la vuelta del tpv.

      Saludos

  • Javier dice:

    muy bien tutorial este, pero me gustaria saber como se podria mandar el enlace de pago mediante correo electronico.

    La verdad que seria muy util poner el precio, el e-mail y nombre del destinataria, y la otra persona solo pulsar en el enlace y hacer el pago.

    Espero alguna solucion.

    Gracias.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*