VINX Programación Web, Barcelona
669 344 302   vinx@vinx.info

Lunes, 24 de Abril de 2017

Cómo desarrollar un sistema de suscripciones o pagos recurrentes vía web

Utilizando el principal TPV virtual del mercado español, el de RedSys, con su api y su webservice

Cómo desarrollar un sistema de suscripciones o pagos recurrentes vía web

En internet existe mucha información sobre cómo integrar el TPV virtual de RedSys, sin embargo la mayoría hacen referencia a su forma más sencilla y utilizada: la del cobro instantáneo de un determinado importe. Eso es lo que habitualmente precisan la mayoría de páginas webs eCommerce: el usuario hace su pedido en la web, y para finalizarlo lo enviamos a la página del TPV virtual que habremos contratado con nuestro banco para que allí se realice el pago, librándonos a nosotros de almacenar cualquier informacion sensible cómo los datos de la tarjeta, ya que de eso justamente se encarga el TPV virtual. A nosotros tan sólo nos queda recoger la respuesta del TPV y marcar eventualmente el pedido como pagado.

Hoy vamos a darle una vuelta de tuerca más y veremos cómo desarrollar un sistema de suscripciones o pagos recurrentes, es decir pagos que ya no precisan de la interacción del usuario.

Antes que nada, al solicitar el TPV virtual en la oficina de vuestro banco de confianza, tú o tu cliente deberéis solicitar dos opciones adicionales que habitualmente no se activan por defecto junto al TPV:

  1. Activación del "Pago por referencia": esto nos permitirá obtener, durante el primer pago, una clave única para identificar posteriormente la tarjeta del usuario, y así poder procesar nuevos cobros.
  2. Activación del "Doble pago (operaciones seguras e inseguras)": las operaciones que el usuario realiza introduciendo él mismo los datos de su tarjeta, y que incluyen el CVC, se consideran seguras. Sin embargo si posteriormente realizaremos un cobro automático a la misma tarjeta, sin que el usuario intervenga, ésta se considerará una operación insegura, por defecto no permitida por el TPV.

Estas opciones, aunque por defecto no vengan activadas en el "entorno real", siempre lo están en el "entorno de pruebas" así que podréis empezar a probarlas enseguida.

El proceso consta de 2 partes: primero solicitaremos al usuario que realice un primer pago, para poder obtener el identificador de su tarjeta para los pagos posteriores. Vale también el pago simbólico de 1 céntimo.
A los parámetros que habitualmente enviaríamos al TPV, deberemos añadir uno nuevo: "DS_MERCHANT_IDENTIFIER" cuyo valor será la cadena de texto "REQUIRED". De esta manera, estaremos solicitando al TPV que nos devuelva el mencionado identificador de la tarjeta. En la página encargada de procesar la respuesta del TPV, o sea la que habremos indicado en la variable "DS_MERCHANT_MERCHANTURL", y siempre y cuando la respuesta del TPV sea que el pago se ha realizado correctamente, podremos entonces recoger más variables: "Ds_Merchant_Identifier" nos llegará valorizado con una cadena que guardaremos para identificar la tarjeta del usuario; también tendremos acceso a "Ds_ExpiryDate" que nos indicará la fecha de caducidad de la misma, básico para saber hasta cuando podemos procesar pagos con ella.

Para el segundo paso, el de realizar el cobro automático cuando llegue el momento, os dejo un código php de ejemplo que llamará la api normalmente proporcionada junto a la documentacion del TPV virtual, y que interactuará con el webservice de RedSys:

<?php
require_once("apiRedsysWs.php"); // Contiene la clase RedsysAPIWs. Si no os la proporcionan, solicitadla al banco.
$TPV = new RedsysAPIWs;

$DATOS_ENTRADA = "<DATOSENTRADA>";
$DATOS_ENTRADA .= "<DS_MERCHANT_MERCHANTCODE>$IDCOMERCIO</DS_MERCHANT_MERCHANTCODE>";
$DATOS_ENTRADA .= "<DS_MERCHANT_TERMINAL>$TERMINAL</DS_MERCHANT_TERMINAL>";
$DATOS_ENTRADA .= "<DS_MERCHANT_TRANSACTIONTYPE>A</DS_MERCHANT_TRANSACTIONTYPE>";
$DATOS_ENTRADA .= "<DS_MERCHANT_AMOUNT>$IMPORTE</DS_MERCHANT_AMOUNT>";
$DATOS_ENTRADA .= "<DS_MERCHANT_CURRENCY>978</DS_MERCHANT_CURRENCY>";
$DATOS_ENTRADA .= "<DS_MERCHANT_ORDER>$CODIGO_PEDIDO</DS_MERCHANT_ORDER>";
$DATOS_ENTRADA .= "<DS_MERCHANT_IDENTIFIER>$IDENTIFICADOR_OBTENIDO_PREVIAMENTE</DS_MERCHANT_IDENTIFIER>";
$DATOS_ENTRADA .= "</DATOSENTRADA>";

$XML = "<REQUEST>";
$XML .= $DATOS_ENTRADA;
$XML .= "<DS_SIGNATUREVERSION>HMAC_SHA256_V1</DS_SIGNATUREVERSION>";
$XML .= "<DS_SIGNATURE>'.$TPV->createMerchantSignatureHostToHost($CLAVETPV, $DATOS_ENTRADA)."</DS_SIGNATURE>";
$XML .= "</REQUEST>";

$CLIENTE = new SoapClient("https://sis.redsys.es/sis/services/SerClsWSEntrada?wsdl"); // Entorno real
$CLIENTE = new SoapClient("https://sis-t.redsys.es:25443/sis/services/SerClsWSEntrada?wsdl"); // Entorno de prueba
$RESPONSE = $CLIENTE->trataPeticion(array("datoEntrada"=>$XML));

if(isset($RESPONSE->trataPeticionReturn)) {
	$XML_RETORNO = new SimpleXMLElement($RESPONSE->trataPeticionReturn);
	if(isset($XML_RETORNO->OPERACION->Ds_Response)) {
		$RESPUESTA = (int) $XML_RETORNO->OPERACION->Ds_Response;
		if(($RESPUESTA >= 0) && ($RESPUESTA <= 99)) { 
			// Procesamos el cobro aceptado
		}
	}
}
?>

 

« Ver todos los artículos

Comentarios:


Muy interesante artículo, felicidades!

Escrito por Inesdi, el 2/8/2017 a las 15:47

Buenos días,

Estoy probando este código y no consigo conectar con el entorno de pruebas en la línea de $CLIENTE = new SoapClient("https://sis-t.redsys.es:25443/sis/services/SerClsWSEntrada?wsdl"); me devuelve el siguiente error: PHP Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://sis-t.redsys.es:25443/sis/services/SerClsWSEntrada?wsdl' : failed to load external entity

Gracias

Escrito por José, el 19/1/2018 a las 11:31

Hola, una pregunta, donde hay que meter esos códigos, ando algo perdido.
Muchas gracias por el post

Escrito por javi, el 5/3/2019 a las 12:11

Tengo la misma pregunta, donde habría que meter esos códigos¿

Escrito por Gema, el 17/7/2019 a las 23:59

O mejor aún, no tendrás un vídeo con el proceso.
Gracias¡

Escrito por Gema, el 18/7/2019 a las 0:02

Muchas gracias por el código, ha sido bastante difícil encontrar un ejemplo en PHP. Entiendo entonces que la primera llamada para recoger la referencia se hace con la API de Redsys normal (apiRedsys.php), y cuando tienes la referencia, las siguientes llamadas para los pagos recurrentes ya se hace con la API para el Webservice, ¿verdad?
Lo que no encuentro en la página de descargas de Redsys es el archivo apiRedsysWs.php. Tendré que pedirlo.
Saludos!

Escrito por XYZ Comunicación, el 29/9/2020 a las 10:48

 

Déjanos tu opinión:






Compártelo


¿De qué se habla en esta web?

Usamos cookies propias y de terceros para analizar tus hábitos de navegación. Si continuas navegando consideramos que aceptas su uso. OK | más detalles