Lunes, 24 de Abril de 2017
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:
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 } } } ?>