Cómo instalar o migrar el TPV de Redsys en tu web (nueva versión SHA256)

Publicado el 23 noviembre 2015 por Gaspar Fernández Moreno @gaspar_fm

Hoy vamos a hablar de Redsys, una plataforma de comercio electrónico seguro que cubre el proceso completo de compra online, desde el acceso a la página web del comercio, hasta el proceso de autorización del pago, previa autentificación del cliente.

Hasta ahora, toda comunicación entre una tienda web y el TPV Virtual de Redsys ha ido firmada electrónicamente utilizando un algoritmo de "hashing" conocido como SHA1, el cual ha sido declarado como obsoleto al poder ser atacado dada su poca seguridad. Es por esto que, a lo largo de estos últimos meses, a todos los propietarios de un comercio electrónico les ha llegado una notificación para que migren sus sistemas de pago al nuevo método: conexión con firma SHA256. Sin dicha migración, este sistema de pago dejará de funcionar en todos los comercios a partir del 23 de Noviembre de 2015 (hoy).

Aunque existe documentación propia de Redsys al respecto, yo que la he seguido en sus dos primeras versiones, he visto algunas carencias en la misma que yo os comentaré en este post y creo que serán de gran utilidad, ya que yo me tiré un buen rato para encontrar la solución a mis problemas.

¿Cómo funciona Redsys?

Cuando un usuario va a realizar una compra en un comercio online con pago Redsys, el comercio redirige la sesión del navegador del usuario, dejando que el TPV Virtual tome todo el control. Para que esta redirección sea correcta, debemos preparar en nuestro comercio un formulario oculto como el siguiente:

Si nos fijamos, este formulario es mucho más simple que el que mandábamos con el método anterior que era algo como:

En lugar de mandar toda esa cantidad de parámetros por separado, ahora debemos mandar solo tres:

Llegados a este punto, debemos acceder al panel de administración de nuestro Redsys para obtener una nueva clave de comercio, compuesta por 32 caracteres, que debemos almacenar en el admin de nuestro cms y que almacenaremos en la variable $kc.

Una vez tenemos todos estos parámetros definidos, debemos hacer una comprobación de firmas para asegurarnos que el pago no ha sido manipulado.

Tras esto, entraremos en el POST ($this→getRequest()→isPost()) de la función notifyAction() del código de Redsys en nuestro comercio. Ahí, recogeremos los datos recibidos por POST y ocalculamos la firma:

Una vez calculada la firma con los datos recibidos, debemos validar el parámetro Ds_Signature. Para ello, comparamos la firma calculada con la firma que previamente hemos enviado. Si no coinciden, se cancelará el pago puesto que se trata de un error y podría tratarse de una manipulación de datos.

Si por el contrario, ambas firmas coinciden, será señal de que todo va bien y el usuario será devuelto a la web del comercio.

En este punto, estaríamos en el GET ($this->getRequest()->isGet()) de la función notifyAction() de la que hablabamos antes. Del mismo modo que hicimos antes, volvemos a validar los datos de vuelta:

Del mismo modo, comprobamos de nuevo las dos firmas: la calculada según los datos recibidos y la que obtuvimos del Admin de Redsys.

Bien, si ahora simulamos una compra en nuestro comercio, veremos que el TPV se muestra correctamente de la siguiente forma:

¡Ups! ¿Pagar con iupay? ¿Qué es eso?

Iupay es una cartera digital bancaria, se trata de un servicio que se ofrece a los comercios online que permiten a los clientes pagar usando sus tarjetas bancarias enroladas en el servicio, sin necesidad de hacer lo que tanto les cuesta a muchos: introducir sus datos bancarios en Internet.

Pero... ¿Qué pasa si quiero deshabilitar el pago por iupay? ¿Cómo lo hago?
Bien, aquí viene la pregunta que no responde la documentación de Redsys, ya que en listado de datos válidos en el parámetro Ds_Merchant_Parameters no nos dice en ningún momento que se le pueda pasar el parámetro Ds_Merchant_PayMethods que en el método SHA1 de Redsys sí que pasábamos.
Es por ello que, cuando seguí la documentación de Redsys para migrar un comercio online a SHA256, me volví loca hasta que me dí cuenta de la falta y necesidad de Ds_Merchant_PayMethods.

Pues bien, una vez sabido esto, es fácil deshabilitar el pago por iupay de Redsys. Basta con modificar el array $data que declaramos al principio de este post. Tras ello, el array será el siguiente:

Donde $tipopago puede obtener los siguientes valores:

  • C: Sólo Tarjeta (mostrará sólo el formulario para datos de tarjeta)
  • R: Pago por Transferencia (solo, si tiene activo este método de pago)
  • D: Domiciliacion (solo, si tiene activo este método de pago)
  • T: Tarjeta + iupay (mostrará el formulario de tarjeta y además el botón iupay)

Por lo tanto, si queremos desactivar el pago iupay, basta con no darle el valor "T" a $tipopago.

Si habéis configurado todo como es debido, tras ingresar los datos correspondientes en el formulario de pago, lograreis finalizar la compra exitosamente.

NOTA: Todas las funciones PHP que aparecen en este post pertenecen a las librerías de ayuda de Redsys, aunque con algunos pequeños cambios.

Foto: Negative Space