La autenticación, también llamada preautorización separada, es un tipo de operación que es similar a la preautorización, con la salvedad de que el titular, en esta operativa, no verá reflejado ningún cargo, es decir, que no se produce retención del importe en su cuenta debido que el importe enviado al emisor en última instancia es cero. Esta transacción es útil para realizar una validación de los datos de la tarjeta, validar CVV2/CVC2, fecha de caducidad y si la tarjeta está operativa.
La transacción es transparente para el titular, ya que en todo momento actúa exactamente igual que en una operación de Autorización, es decir, facilita sus datos y se realiza todo el flujo de autenticación si procede. Es importante que, aunque el titular no va a ver reflejada retención en su cuenta, debes enviar el importe original de la operación para realizar la posterior confirmación si procede.
El plazo de validez de una operación de autenticación es de noventa días. Debes tener en cuenta que una operación de autenticación sólo se puede realizar con tarjetas VISA y MasterCard.
Pero para poder realizar esta operativa, debes preparar una serie de datos y enviarlo a la URL del TPV Virtual para iniciar su procesamiento. En esta página te indicaremos qué pasos debes seguir para poder realizar una autorización. Estos datos deben enviarse codificados en UTF-8 a través de un formulario utilizando el navegador del titular.
Para todas las operaciones se deben enviar tres campos:
Campo | Tipo | Descripción |
---|---|---|
Ds_MerchantParameters | Cadena | Son los parámetros de la operación, donde se incorporan los datos básicos de la misma, como el importe, el número de pedido, etcétera… Esta cadena se trata de un JSON con los parámetros que se desea enviar, codificada en base64. |
Ds_Signature | Cadena | Es la firma de los parámetros enviados. Esta firma permite tener la certeza de que los datos no han sido alterados «en vuelo» y que la operación y sus atributos mantiene su integridad. Tienes más información sobre cómo se calcula aquí. |
Ds_SignatureVersion | Cadena | Es una constante que indica la versión de firma que se está utilizando, en este caso HMAC_SHA512_V1. |
Dentro del campo Ds_MerchantParameters, se encuentran todos los parámetros necesarios para procesar la operación. Algunos de ellos son obligatorios, y la operación no podrá continuar si no se envían correctamente, por ello vamos a ver un ejemplo de todos los necesarios para procesar una operación. Tienes más información sobre todos los parámetros que se pueden adjuntar en una operación en la sección del glosario de parámetros.
Parámetro | Tipo y longitud máxima | Descripción |
---|---|---|
Ds_Merchant_Amount | Numérico. 12 posiciones. | Es el importe de la operación, expresado en la unidad fraccionaria más baja que tenga la moneda (por ejemplo en el Euro, en céntimos). Es decir, en el importe no se enviarán decimales, y la moneda enviada determinará el valor real (de nuevo, en Euro: en una operación de 12,49€ se enviaría 1249). |
Ds_Merchant_Currency | Numérico. 3 posiciones. | Es el valor numérico del código ISO-4217 de la moneda que se utilizará en la operación. En el caso del Euro, sería el 978. Tienes la tabla de monedas completa en este enlace. |
Ds_Merchant_MerchantCode | Numérico. 9 posiciones. | Es el código FUC asignado a tu comercio y que te debió facilitar BBVA por correo cuando diste de alta tu TPV Virtual. |
Ds_Merchant_Order | Alfanumérico. 12 posiciones. | Es el número de pedido que identificará a la orden dentro del Portal de Administración del TPV Virtual y en los informes que puedas obtener en dicho portal. Te recomendamos que tenga más de 4 posiciones para evitar posibles problemas en el proceso de totalización. |
Ds_Merchant_Terminal | Numérico 3 posiciones. | Es el número de terminal de tu comercio sobre el que vas a operar. Debe estar junto al número de comercio que te envió BBVA y, en la mayoría de casos, es el 001. |
Ds_Merchant_TransactionType | Numérico. 1 posición. | Es el tipo de operación que se va a efectuar. Tienes más información sobre los tipos de operación disponibles en la sección del glosario de parámetros. |
Realización de una operación de autenticación usando una integración vía Redirección
¿Debes cumplir con PCI DSS?
Con este tipo de integración, no tendrás que preocuparte de cumplir con la directiva europea PCI-DSS, ya que el tratamiento de datos de la tarjeta se realiza dentro de nuestros servidores, y ningún dato real de la tarjeta del cliente es procesado por tu sitio web.
En la modalidad de redirección, deberás tener en cuenta que tienes que capturar todos los datos relevantes de la transacción para enviarla al TPV Virtual mediante una petición POST a nuestros servidores. La petición se deberá realizar a una de las siguientes URLs según el entorno donde te encuentres trabajando, ya sea haciendo pruebas en nuestro entorno de Test, o ya en producción en nuestro entorno de Real.
Entorno | URL de Conexión |
---|---|
Pruebas | https://sis-t.redsys.es:25443/sis/realizarPago |
Real | https://sis.redsys.es/sis/realizarPago |
Envío de la petición al TPV Virtual
Sabiendo los datos que se deben enviar, a continuación se muestra un ejemplo del proceso de envío de datos al TPV Virtual. En nuestro caso vamos a realizar una operación de autenticación por importe de 2,49€, al comercio 999008881 y terminal 001, usando la clave de firma de pruebas. Los datos para realizar pruebas los tienes disponibles en la sección de entornos y datos de pruebas.
En primer lugar, el campo Ds_MerchantParameters se compondría de un JSON con la siguiente información:
Nótese en la línea sombreada, que se incluye el campo Ds_Merchant_MerchantURL. En este campo se indica la URL a la cual se enviará la notificación con el resultado de la operación, que se enviará una vez se haya procesado la misma.
{ "DS_MERCHANT_ORDER": "00014338z744", "DS_MERCHANT_MERCHANTCODE": "999008881", "DS_MERCHANT_TERMINAL": "001", "DS_MERCHANT_CURRENCY": "978", "DS_MERCHANT_TRANSACTIONTYPE": "7", "DS_MERCHANT_AMOUNT": "249", "DS_MERCHANT_MERCHANTURL": "http://www.prueba.com/urlNotificacion.php", "DS_MERCHANT_URLOK": "http://www.prueba.com/urlOK.php", "DS_MERCHANT_URLKO": "http://www.prueba.com/urlKO.php" }
Los parámetros Ds_Merchant_URLOK y Ds_Merchant_URLKO son la distintas URLs hacia donde se enviará al cliente cuando finalice la operación en nuestro sistema. Puedes configurar desde el Portal de Administración del TPV Virtual, que en estas URLs se envíe también el resultado de la operación, para que así puedas mostrarle al cliente, el importe, número de pedido, etc… en la pantalla de información. Recuerda que siempre se enviará la notificación a la URL que hayas configurado en Ds_Merchant_MerchantURL independientemente de que indiques o no URLs de OK y de KO.
El objeto JSON resultante, deberás codificarlo en base64, tal cual lo tienes. Consiguiendo un resultado parecido al siguiente:
ewogICAgIkRTX01FUkNIQU5UX09SREVSIjogIjAwMDE0MzM4ejc0NCIsCiAgICAiRFNfTUVSQ0hBTlRfTUVSQ0hBTlRDT0RFIjogIjk5OTAwODg4MSIsCiAgICAiRFNfTUVSQ0hBTlRfVEVSTUlOQUwiOiAiMDAxIiwKICAgICJEU19NRVJDSEFOVF9DVVJSRU5DWSI6ICI5NzgiLAogICAgIkRTX01FUkNIQU5UX1RSQU5TQUNUSU9OVFlQRSI6ICIxIiwKICAgICJEU19NRVJDSEFOVF9BTU9VTlQiOiAiMjQ5IiwKICAgICJEU19NRVJDSEFOVF9NRVJDSEFOVFVSTCI6ICJodHRwOi8vd3d3LnBydWViYS5jb20vdXJsTm90aWZpY2FjaW9uLnBocCIsCiAgICAiRFNfTUVSQ0hBTlRfVVJMT0siOiAiaHR0cDovL3d3dy5wcnVlYmEuY29tL3VybE9LLnBocCIsCiAgICAiRFNfTUVSQ0hBTlRfVVJMS08iOiAiaHR0cDovL3d3dy5wcnVlYmEuY29tL3VybEtPLnBocCIKfQ==
Posteriormente, deberás firmar esta cadena siguiendo los pasos de creación de firma, usando la clave de firma del comercio. La cadena resultante será el campo Ds_Signature. Por último, se adjuntará a la petición la versión del algoritmo de firma a usar en el campo Ds_SignatureVersion, en este caso HMAC_SHA512_V1. Como resultado, obtendremos finalmente un formulario HTML como el que se muestra, y que se deberá enviar vía HTTP POST a la URL del TPV Virtual tal y como se indica en la línea resaltada.
<form name="from" action="https://sis-t.redsys.es:25443/sis/realizarPago" method="POST"> <input type="hidden" name="Ds_SignatureVersion" value="HMAC_SHA512_V1" /> <input type="hidden" name="Ds_MerchantParameters" value="ewogICAgIkRTX01FUkNIQU5UX09SREVSIjogIjAwMDE0MzM4ejc0NCIsCiAgICAiRFNfTUVSQ0hBTlRfTUVSQ0hBTlRDT0RFIjogIjk5OTAwODg4MSIsCiAgICAiRFNfTUVSQ0hBTlRfVEVSTUlOQUwiOiAiMDAxIiwKICAgICJEU19NRVJDSEFOVF9DVVJSRU5DWSI6ICI5NzgiLAogICAgIkRTX01FUkNIQU5UX1RSQU5TQUNUSU9OVFlQRSI6ICIxIiwKICAgICJEU19NRVJDSEFOVF9BTU9VTlQiOiAiMjQ5IiwKICAgICJEU19NRVJDSEFOVF9NRVJDSEFOVFVSTCI6ICJodHRwOi8vd3d3LnBydWViYS5jb20vdXJsTm90aWZpY2FjaW9uLnBocCIsCiAgICAiRFNfTUVSQ0hBTlRfVVJMT0siOiAiaHR0cDovL3d3dy5wcnVlYmEuY29tL3VybE9LLnBocCIsCiAgICAiRFNfTUVSQ0hBTlRfVVJMS08iOiAiaHR0cDovL3d3dy5wcnVlYmEuY29tL3VybEtPLnBocCIKfQ==" /> <input type="hidden" name="Ds_Signature" value="qtYnN5mf/ztE3dw4wk3m1z895YXlKbqDJ17dHrJ3KsFqazA92tSvNXfYP+1P244x+9TNPD09+E5ow0qFwcK8Qg==" /> </form>
Respuesta del TPV Virtual
Una vez realizada la petición utilizando el navegador del cliente que está comprando en tu sitio Web, nuestro servidor tomará el control de la navegación del cliente, mostrando una serie de pantallas para poder introducir los datos de su tarjeta y autenticarse, así como los datos de la operación para que pueda saber, por ejemplo, por valor de cuánto importe está realmente comprando.
Cuando este proceso haya terminado, ocurrirán dos cosas: primero de todo, se enviará una notificación HTTP POST a la URL que el comercio especificó en el parámetro Ds_Merchant_MerchantURL que contendrá los detalles de la operación y el resultado de la misma. Posteriormente, el cliente será devuelto automáticamente o cuando pulse «continuar», según sea la configuración de tu TPV Virtual, a tu página web y, con esta redirección a tu Web, se acompañará si así lo has configurado en el Portal de Administración del TPV Virtual, los datos de la operación por vía HTTP GET para que puedas presentar en tu front el resultado de la operación a tu cliente si tienes personalizada la página de vuelta o los valores de URLOK y URLKO.
Tratamiento de la notificación HTTP POST
Nuestro servidor no enviará una notificación en caso de que se produzca un error con los parámetros de entrada, o lo que es lo mismo, en caso de que los parámetros básicos de una operación que debes envíar a nuestro servidor (número de pedido, firma, importe, moneda,…) esté mal formado o se produzca un error (número de pedido repetido, error de firma,…) no recibirás respuesta alguna de la petición. Por ello, te recomendamos que pruebes todos los casos de uso de tu sistema para cerciorarte de que no se producen este tipo de errores ya que, una vez en producción, no tendrás forma de saber que se están produciendo salvo que te notifiquen tus clientes, que sí estarán viendo una pantalla de error parecida a esta:
En caso de que todo vaya correctamente, nuestro servidor responderá con un formulario exactamente igual que el que enviaste, que contiene Ds_MerchantParameters, Ds_Signature y Ds_SigantureVersion. Te recomendamos que, antes de realizar cualquier acción, firmes los parámetros recibidos siguiendo nuestra guía de firma y compruebes que la firma que has calculado y la que has recibido de nuestro servidor coinciden, para así estar seguro que los datos no han sido interceptados y modificados en el camino.
Una vez hecho, procede a descodificar el campo Ds_MerchantParameters que has recibido en base64, para encontrar dentro de estos los parámetros de la operación, con algún campo más. El más importante, el campo Ds_Response, que indica el resultado de la operación de manera numérica: si en él se recibe 0000, significa que la operación ha ido correctamente, en cualquier otro caso, indicará el código de error.
Deberás utilizar la información incluida en la notificación HTTP POST para validar el pedido y realizar los procedimientos que creas oportunos en tu web ya que, a partir de este punto, el control de la gestión del pedido es todo tuyo.
{ "Ds_Date": "27%2F03%2F2023", "Ds_Hour": "13%3A20", "Ds_SecurePayment": "1", "Ds_Amount": "145", "Ds_Currency": "978", "Ds_Order": "00014338z744", "Ds_MerchantCode": "999008881", "Ds_Terminal": "001", "Ds_Response": "0000", "Ds_TransactionType": "1", "Ds_AuthorisationCode": "148883", "Ds_Card_Number": "454881******0003", "Ds_ConsumerLanguage": "1", "Ds_Card_Country": "724", "Ds_Card_Brand": "1", "Ds_ProcessedPayMethod": "78", "Ds_Control_1679916028483": "1679916028483" }
Tratamiento del retorno de navegación y datos recibidos vía HTTP GET
¡Tenlo en cuenta!
Te recomendamos que nunca utilices los datos enviados vía HTTP GET para validar tu pedido, y que utilices sólo los enviados en la notificación HTTP POST tal y como se ha explicado anteriormente; ya que el cliente podría cerrar la pantalla de pago una vez vea que la operación se ha realizado correctamente y nunca sabrías el resultado de la operación.
Cuando la operación se complete en nuestro servidor, el cliente podrá ver un cuadro de confirmación de la operación, denominado «Recibo Redsys», y que será muy parecido a este:
Una vez que el cliente ha realizado el proceso de pago, al pulsar sobre «Continuar», se le redirigirá de nuevo a tu tienda usando la URL comunicada como parámetro en la llamada inicial al TPV Virtual o, en su defecto, se obtendrá la configuración del Módulo de Administración del TPV Virtual.
- Ten en cuenta que, si no estableces una URLOK y URLKO, ya sea enviándolas en la petición o directamente en el Portal de Administración del TPV Virtual, cuando tu cliente pulse sobre continuar en el recibo de la operación, se cerrará la ventana donde se encuentra ya que no hay ningún punto a donde redirigir.
- Si usas URLOK y URLKO, en cada una de ellas deberás decidir como se realiza el flujo, por ejemplo mostrando una pantalla de información con los datos del pedido en URLOK y una pantalla de error y un botón de volver al carrito en URLKO. Si tuvieras configuradas estas URLs en el Portal de Administración del TPV Virtual, se cogerá la información de este lugar y, si además las envías en la petición al TPV Virtual, serán las que envíes las que tendrán preferencia sobre las configuradas en el Portal de Administración del TPV Virtual.
Realización de una operación de autenticación usando una integración vía REST
¿Debes cumplir con PCI DSS?
Pues depende. En este caso, en el que vas a realizar un pago (autorización) utilizando una integración REST, sí debes cumplir con la directiva PCI DSS, ya que vas a capturar directamente datos de tarjeta y, por tanto, técnicamente vas a manejar dichos datos. Si por el contrario realizases otro tipo de operativa como una devolución o una confirmación, no tendrías que cumplir con esta directiva, ya que no estarías tratando directamente con datos de las tarjetas de tus clientes.
Este tipo de conexión resulta útil para aquellos comercios que quieren que la experiencia de navegación de sus compradores sea continua y no abandonen en ningún momento la web, ni siquiera a la hora de realizar el pago. Además, este tipo de integración permite tomar un control total del flujo de pago, a costa de ser algo más complicada de integrar.
Si quieres utilizar este modo de conexión, deberás ser autorizado por BBVA; además, deberás tener validado el cuestionario PCI-DSS, ya que vas a tratar los datos de tarjeta del titular. Tanto en el envío de datos para la petición, como la respuesta del TPV, serán parecidos a la integración por redirección.
Solicitud de información de la tarjeta · iniciaPeticion
El primer paso durante una autorización vía REST, es la solicitud de datos de tarjeta. Internamente, a este proceso se le llama iniciaPetición, y deberás realizar una solicitud REST a la URL de conexión que corresponda según el entorno en el que te encuentres trabajando.
Entorno | URL de Conexión |
---|---|
Pruebas | https://sis-t.redsys.es:25443/sis/rest/iniciaPeticionREST |
Real | https://sis.redsys.es/sis/rest/iniciaPeticionREST |
En esta transacción, estás solicitando al TPV Virtual información sobre la capacidad de la tarjeta en cuanto a autenticación (versión del protocolo 3D Secure), posibilidad de aplicación de exenciones, poder realizar operativas especiales, como por ejemplo DCC; etcétera. Esta información indicará como deben gestionarse los siguientes pasos para realizar la operación.
Para iniciar la transacción, enviarás a la URL que corresponda según el entorno en el que estás trabajando, los datos de la operación codificados en base64 dentro del objeto Ds_Merchant_MerchantParameters, junto a la firma y a la versión de firma. El objeto que enviarás debería tener un aspecto parecido al que sigue.
{ "Ds_Merchant_MerchantParameters": "eyJEU19NRVJDSEFOVF9PUkRFUiI6MTY4MTM4NDc3OCwiRFNfTUVSQ0hBTlRfTUVSQ0hBTlRDT0RFIjoiOTk5MDA4ODgxIiwiRFNfTUVSQ0hBTlRfVEVSTUlOQUwiOiIwMDEiLCJEU19NRVJDSEFOVF9UUkFOU0FDVElPTlRZUEUiOiI3IiwiRFNfTUVSQ0hBTlRfUEFOIjoiNDU0ODgxMDAwMDAwMDAwMyIsIkRTX01FUkNIQU5UX0VYUElSWURBVEUiOiI0OTEyIiwiRFNfTUVSQ0hBTlRfQ1ZWMiI6IjEyMyIsIkRTX01FUkNIQU5UX0NVUlJFTkNZIjoiOTc4IiwiRFNfTUVSQ0hBTlRfQU1PVU5UIjoiMjAwMCIsIkRTX01FUkNIQU5UX0VNVjNEUyI6IntcInRocmVlRFNJbmZvXCI6XCJDYXJkRGF0YVwifSIsIkRTX01FUkNIQU5UX0VYQ0VQX1NDQSI6IlkifQ==", "Ds_Merchant_Signature": "PmWgipoCWqisGUsoIyBNObJ1vV+xBaBqL4hNk5FdYkcr1Ns2h8dOQvwAyft63y+7w5hgeO3wEH30QxNBmnXohg==", "Ds_SignatureVersion": "HMAC_SHA512_V1" }
{ "DS_MERCHANT_ORDER": 1681384778, "DS_MERCHANT_MERCHANTCODE": "999008881", "DS_MERCHANT_TERMINAL": "001", "DS_MERCHANT_TRANSACTIONTYPE": "7", "DS_MERCHANT_PAN": "4548810000000003", "DS_MERCHANT_EXPIRYDATE": "4912", "DS_MERCHANT_CVV2": "123", "DS_MERCHANT_CURRENCY": "978", "DS_MERCHANT_AMOUNT": "2000", "DS_MERCHANT_EMV3DS": { "threeDSInfo": "CardData" }, "DS_MERCHANT_EXCEP_SCA": "Y" }
Como puedes comprobar, la estructura de la petición es parecida a la que has visto hasta ahora, pero se añaden varios campos de interés que aparecen resaltados:
- Ds_Merchant_EMV3DS: Y más concretamente threeDSInfo. En este campo, estás especificando al TPV Virtual que solicitas información de la tarjeta que has enviado en la petición.
- DS_Merchant_EXCEP_SCA: Aquí estás solicitando que también se te envíe las exenciones que soporta la tarjeta, en caso de que necesitases utilizar una.
Enviada la petición, nuestro servidor (en adelante, el SIS), responderá con los datos solicitados si todo ha ido correctamente. En caso de que se produjera un error, la respuesta sería un objeto con un campo errorCode que contendría el código de error que se ha producido y que puedes consultar en la tabla de errores.
{ "Ds_SignatureVersion": "HMAC_SHA512_V1", "Ds_MerchantParameters": "eyJEc19PcmRlciI6IjE2ODEzODQ3NzgiLCJEc19NZXJjaGFudENvZGUiOiI5OTkwMDg4ODEiLCJEc19UZXJtaW5hbCI6IjEiLCJEc19UcmFuc2FjdGlvblR5cGUiOiI3IiwiRHNfRU1WM0RTIjp7InByb3RvY29sVmVyc2lvbiI6IjIuMi4wIiwidGhyZWVEU1NlcnZlclRyYW5zSUQiOiI3ODRhMmViMS1kYzdhLTRiZWYtOTIxYi1hYzc3ZjEyNDZhOWEiLCJ0aHJlZURTSW5mbyI6IkNhcmRDb25maWd1cmF0aW9uIn0sIkRzX0V4Y2VwX1NDQSI6IkxXVjtUUkFbNTAwLjBdO0NPUjtNSVQ7QVREIiwiRHNfQ2FyZF9QU0QyIjoiWSJ9", "Ds_Signature": "pAwsc6Je1UY0gKv8pHowrJTWDwyEwv1k-i3NdnpF4C7mMrwXKIUefuXuJaXbhzQJlgJEpBtEcok6DTlSsPeIbQ==" }
{ "Ds_Order": "1681384778", "Ds_MerchantCode": "999008881", "Ds_Terminal": "1", "Ds_TransactionType": "7", "Ds_EMV3DS": { "protocolVersion": "2.2.0", "threeDSServerTransID": "784a2eb1-dc7a-4bef-921b-ac77f1246a9a", "threeDSInfo": "CardConfiguration" }, "Ds_Excep_SCA": "LWV;TRA[500.0];COR;MIT;ATD", "Ds_Card_PSD2": "Y" }
En la petición, puedes ver unos parámetros algo más raros en los MerchantParameters descodificados. En cuanto a EMV3DS, encontramos:
- protocolVersion: Esta es la versión de 3DSecure que soporta la tarjeta. En este caso, deberás emplear un flujo para 3DSecure V2.
- threeDSServerTransID: Es el identificador de la transacción 3DSecure, y lo necesitarás más adelante. Es único para la operación.
- threeDSInfo: Esto indica que la respuesta contiene los datos de la tarjeta, es decir, lo que has solicitado.
Y respecto a las exenciones y enrolamiento de la tarjeta:
- DS_Excep_SCA: Son todas las exenciones que soporta la tarjeta. Para más información, visita el apartado de exenciones de la documentación.
- Ds_Card_PSD2: Informa sin la tarjeta está enrolada en PSD2, y con una «Y» como respuesta, quiere decir que sí.
Envío de la petición al TPV Virtual · Primer trataPeticion
Una vez se han obtenido los datos de la tarjeta con la que el titular va a realizar la compra, es el momento de enviar la operación al TPV Virtual para iniciar el proceso de autenticación. Tal y como respondió el TPV Virtual en este ejemplo (y como van a ser la gran mayoría de las veces), vas a tener que realizar un proceso de autenticación EMV3DS V2. En este caso, los endpoints a los que tienes que enviar la operación son distintos:
Entorno | URL de Conexión |
---|---|
Pruebas | https://sis-t.redsys.es:25443/sis/rest/trataPeticionREST |
Real | https://sis.redsys.es/sis/rest/trataPeticionREST |
Para ello, tienes que preparar la operación de nuevo. Es muy importante que todos los datos básicos de la operación y, sobre todo, el número de pedido sea el mismo, de lo contrario la operación no podrá continuar. Además, se adjuntará dentro del parámetro Ds_Merchant_EMV3DS, un objeto JSON con los parámetros del navegador junto a los parámetros threeDSInfo y protocolVersion. Estos parámetros puedes obtenerlos manualmente o usando nuestras librerías de integración.
{ "Ds_Merchant_MerchantParameters": "eyJEU19NRVJDSEFOVF9PUkRFUiI6IjE2ODEzODQ3NzgiLCJEU19NRVJDSEFOVF9NRVJDSEFOVENPREUiOiI5OTkwMDg4ODEiLCJEU19NRVJDSEFOVF9URVJNSU5BTCI6IjEiLCJEU19NRVJDSEFOVF9UUkFOU0FDVElPTlRZUEUiOiI3IiwiRFNfTUVSQ0hBTlRfQ1VSUkVOQ1kiOiI5NzgiLCJEU19NRVJDSEFOVF9QQU4iOiI0NTQ4ODEwMDAwMDAwMDAzIiwiRFNfTUVSQ0hBTlRfRVhQSVJZREFURSI6IjQ5MTIiLCJEU19NRVJDSEFOVF9BTU9VTlQiOiIwMDAwMDAyMDAwIiwiRFNfTUVSQ0hBTlRfQ1ZWMiI6IjEyMyIsIkRTX01FUkNIQU5UX0VNVjNEUyI6IntcInRocmVlRFNJbmZvXCI6XCJBdXRoZW50aWNhdGlvbkRhdGFcIixcInByb3RvY29sVmVyc2lvblwiOlwiMi4yLjBcIixcImJyb3dzZXJKYXZhc2NyaXB0RW5hYmxlZFwiOlwidHJ1ZVwiLFwiYnJvd3NlckFjY2VwdEhlYWRlclwiOlwidGV4dFwvaHRtbCxhcHBsaWNhdGlvblwveGh0bWwreG1sLGFwcGxpY2F0aW9uXC94bWw7cT0wLjksKlwvKjtxPTAuOCxhcHBsaWNhdGlvblwvanNvblwiLFwiYnJvd3NlclVzZXJBZ2VudFwiOlwiTW96aWxsYVwvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0XC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWVcLzcxLjAuMzU3OC45OCBTYWZhcmlcLzUzNy4zNlwiLFxyXG5cdFwidGhyZWVEU1NlcnZlclRyYW5zSURcIjpcIjc4NGEyZWIxLWRjN2EtNGJlZi05MjFiLWFjNzdmMTI0NmE5YVwiLFwiYnJvd3NlckphdmFFbmFibGVkXCI6XCJmYWxzZVwiLFwiYnJvd3Nlckxhbmd1YWdlXCI6XCJFUy1lc1wiLFwiYnJvd3NlckNvbG9yRGVwdGhcIjpcIjI0XCIsXCJicm93c2VyU2NyZWVuSGVpZ2h0XCI6XCIxMjUwXCIsIFwiYnJvd3NlclNjcmVlbldpZHRoXCI6XCIxMzIwXCIsXCJicm93c2VyVFpcIjpcIjUyXCIsXCJub3RpZmljYXRpb25VUkxcIjpcImh0dHBzOlwvXC9zaXMtZC5yZWRzeXMuZXNcL3Npcy1zaW11bGFkb3Itd2ViXC9TaXNSRVNUQ3JlcUNyZXNfM0RTZWN1cmVWMi5qc3BcIn0ifQ==", "Ds_Merchant_Signature": "tYF5FQeMExPJC4C8JBjkfo5oiWNgAEt30NjLCgasE3BgjTeaT2H4schmFLBaPi2M9znpWH/Qt/3nuw0b3U2Hfg==", "Ds_SignatureVersion": "HMAC_SHA512_V1" }
{ "DS_MERCHANT_ORDER": "1681384778", "DS_MERCHANT_MERCHANTCODE": "999008881", "DS_MERCHANT_TERMINAL": "1", "DS_MERCHANT_TRANSACTIONTYPE": "7", "DS_MERCHANT_CURRENCY": "978", "DS_MERCHANT_PAN": "4548810000000003", "DS_MERCHANT_EXPIRYDATE": "4912", "DS_MERCHANT_AMOUNT": "0000002000", "DS_MERCHANT_CVV2": "123", "DS_MERCHANT_EMV3DS": { "threeDSInfo": "AuthenticationData", "protocolVersion": "2.2.0", "browserJavascriptEnabled": "true", "browserAcceptHeader": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,application/json", "browserUserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36", "threeDSServerTransID": "784a2eb1-dc7a-4bef-921b-ac77f1246a9a", "browserJavaEnabled": "false", "browserLanguage": "ES-es", "browserColorDepth": "24", "browserScreenHeight": "1250", "browserScreenWidth": "1320", "browserTZ": "52", "notificationURL": "https://sis-d.redsys.es/sis-simulador-web/SisRESTCreqCres_3DSecureV2.jsp" } }
Tal y como puedes comprobar en los parámetros descodificados, el campo Ds_Merchant_EMV3DS tiene en este caso un JSON con muchos más campos de lo habitual. Los importantes son los dos primeros y el último, ya que el resto de los campos, son los datos extraídos del navegador del cliente.
- threeDSInfo: En este caso estamos solicitando datos para la autenticación del titular de la tarjeta que enviamos.
- protocolVersion: La versión del protocolo EMV3DS de la tarjeta, que se nos notificó en el paso anterior.
- notificationURL: Una vez finalizado el challenge, la entidad emisora enviará el resultado al comercio, haciendo un HTTP POST a esta URL.
Una vez enviemos estos datos, el SIS nos devolverá una respuesta parecida a la que sigue.
{ "Ds_SignatureVersion": "HMAC_SHA512_V1", "Ds_MerchantParameters": "eyJEc19BbW91bnQiOiIyMDAwIiwiRHNfQ3VycmVuY3kiOiI5NzgiLCJEc19PcmRlciI6IjE2ODEzODQ3NzgiLCJEc19NZXJjaGFudENvZGUiOiI5OTkwMDg4ODEiLCJEc19UZXJtaW5hbCI6IjEiLCJEc19UcmFuc2FjdGlvblR5cGUiOiI3IiwiRHNfRU1WM0RTIjp7InRocmVlRFNJbmZvIjoiQ2hhbGxlbmdlUmVxdWVzdCIsInByb3RvY29sVmVyc2lvbiI6IjIuMi4wIiwiYWNzVVJMIjoiaHR0cHM6Ly9zaXMtZC5yZWRzeXMuZXMvc2lzLXNpbXVsYWRvci13ZWIvYXV0aGVudGljYXRpb25SZXF1ZXN0LmpzcCIsImNyZXEiOiJleUowYUhKbFpVUlRVMlZ5ZG1WeVZISmhibk5KUkNJNklqYzROR0V5WldJeExXUmpOMkV0TkdKbFppMDVNakZpTFdGak56ZG1NVEkwTm1FNVlTSXNJbUZqYzFSeVlXNXpTVVFpT2lJeVlUWmlPVEF5WlMxbE4yWXlMVFF5TmpZdFlUa3pPUzB5WWpFMk1UZGhZemxoWkRZaUxDSnRaWE56WVdkbFZIbHdaU0k2SWtOU1pYRWlMQ0p0WlhOellXZGxWbVZ5YzJsdmJpSTZJakl1TWk0d0lpd2lZMmhoYkd4bGJtZGxWMmx1Wkc5M1UybDZaU0k2SWpBMUluMCJ9fQ==", "Ds_Signature": "YCd7i-xigS6RmL32HVncuiS0ZB_v52i0X5rKkyGiwPsfqvaJdUMxCuTdimuUMFQZjXU4pFmMzdCo3fzv21Ia9Q==" }
{ "Ds_Amount": "2000", "Ds_Currency": "978", "Ds_Order": "1681384778", "Ds_MerchantCode": "999008881", "Ds_Terminal": "1", "Ds_TransactionType": "7", "Ds_EMV3DS": { "threeDSInfo": "ChallengeRequest", "protocolVersion": "2.2.0", "acsURL": "https://sis-d.redsys.es/sis-simulador-web/authenticationRequest.jsp", "creq": "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6Ijc4NGEyZWIxLWRjN2EtNGJlZi05MjFiLWFjNzdmMTI0NmE5YSIsImFjc1RyYW5zSUQiOiIyYTZiOTAyZS1lN2YyLTQyNjYtYTkzOS0yYjE2MTdhYzlhZDYiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMi4wIiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjA1In0" } }
En la respuesta del TPV Virtual, se debe analizar el contenido del parámetro Ds_EMV3DS:
- threeDSInfo: En este caso nos informa de que la operación requiere autenticación de titular, conocido como Challenge.
- acsURL: Es la URL donde deberás enviar la petición de autenticación del titular, el CREQ.
- creq: De ChallengeRequest, es el valor que debes enviar a la URL del ACS (servidor de autenticación).
Resultados alternativos: frictionless y KO
Es posible que en la respuesta, no se te envíe challengeRequest, ni acsURL ni CREQ, sino que directamente se te muestre el resultado de la operación con un código de autorización y Ds_Response con valor 0000 (OK). En este caso, se ha producido lo que se denomina una autenticación frictionless, es decir, el servidor de autenticación ha considerado tener datos suficientes para identificar al titular y autorizar la operación. La respuesta, en ese caso, sería parecida a la que sigue.
{ "Ds_MerchantParameters": "eyJEc19EYXRlIjoiMDklMkYwMiUyRjIwMjMiLCJEc19Ib3VyIjoiMTclM0EwOSIsIkRzX1NlY3VyZVBheW1lbnQiOiIxIiwiRHNfQW1vdW50IjoiMTQ1IiwiRHNfQ3VycmVuY3kiOiI5NzgiLCJEc19PcmRlciI6IjExMTIiLCJEc19NZXJjaGFudENvZGUiOiI5OTkwMDg4ODEiLCJEc19UZXJtaW5hbCI6IjAwMSIsIkRzX1Jlc3BvbnNlIjoiMDAwMCIsIkRzX1RyYW5zYWN0aW9uVHlwZSI6IjAiLCJEc19NZXJjaGFudERhdGEiOiIlMjZWaWFqZXMlMEElMDklMDklMDklMDklMDklMDklMDlNYWwlMEElMDklMDklMDklMDklMDklMDklMDlkaXZhcyIsIkRzX0F1dGhvcmlzYXRpb25Db2RlIjoiMjkxODU2IiwiRHNfQ2FyZF9OdW1iZXIiOiI0OTE4MDEqKioqKio0NjAyIiwiRHNfQ29uc3VtZXJMYW5ndWFnZSI6IjEiLCJEc19DYXJkX0NvdW50cnkiOiI3MjQiLCJEc19DYXJkX0JyYW5kIjoiMSIsIkRzX1Byb2Nlc3NlZFBheU1ldGhvZCI6IjgwIiwiRHNfQ29udHJvbF8xNjc1OTU4OTk1MzcxIjoiMTY3NTk1ODk5NTM3MSJ9", "Ds_Merchant_Signature": "KYp3cC6-6I7o3T_S2uhOasbmIajgpAsjIUlH2yiAQKUEhh_zu89ARRHCmHA6NvuSOeAoJcnFBtYpTdVf8Q_kNQ==", "Ds_SignatureVersion": "HMAC_SHA512_V1" }
{ "Ds_Date": "09%2F02%2F2023", "Ds_Hour": "17%3A09", "Ds_SecurePayment": "1", "Ds_Amount": "145", "Ds_Currency": "978", "Ds_Order": "1680071984", "Ds_MerchantCode": "999008881", "Ds_Terminal": "001", "Ds_Response": "0000", "Ds_TransactionType": "7", "Ds_AuthorisationCode": "291856", "Ds_Card_Number": "454881******0003", "Ds_ConsumerLanguage": "1", "Ds_Card_Country": "724", "Ds_Card_Brand": "1", "Ds_ProcessedPayMethod": "80", "Ds_Control_1675958995371": "1675958995371" }
En este caso puedes analizar el Ds_Response, y comprobar que, si su valor es 0000, la operación ha finalizado correctamente.
Por el contrario, si el Ds_Response que recibes es distinto a 0000, por ejemplo 0190; quiere decir que no se ha realizado la autenticación y se ha producido algún error durante la operación. Deberás consultar la tabla de errores para averiguar qué error se ha producido.
Proceso de autenticación
Para realizar la autenticación, tienes que usar el parámetro CREQ que te envió el SIS, y remitirlo a la URL del servidor de autenticación que te llegó en el parámetro acsURL. Esto deberás hacerlo, por ejemplo, vía HTTP POST a la URL especificada.
<form name="frm" action="https://sis-d.redsys.es/sis-simulador-web/authenticationRequest.jsp" method="POST" target="_blank"> <input type="text" name="creq" value="eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6Ijc4NGEyZWIxLWRjN2EtNGJlZi05MjFiLWFjNzdmMTI0NmE5YSIsImFjc1RyYW5zSUQiOiIyYTZiOTAyZS1lN2YyLTQyNjYtYTkzOS0yYjE2MTdhYzlhZDYiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMi4wIiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjA1In0" /> <input type="submit" value="Realizar Pago" /> </form>
Cabe destacar en este punto, que debes estar preparado para mostrar una pantalla al titular que muestra el estado del servidor de autenticación y los pasos que debe seguir. En esa pantalla se muestran las instrucciones para realizar la autenticación, como poner el código que le ha llegado por SMS, aceptar la operación en su aplicación del banco, etcétera. La pantalla del ACS se parece a la siguiente en nuestro entorno de TEST, pero puede tener diversos aspectos una vez en producción en función de la marca y del tipo de challenge.
Para mostrar la pantalla, te mostramos un ejemplo de cómo hacerlo en PHP, pero puedes extrapolar esta muestra a cualquier lenguaje ya que, como puedes observar, sólo se está cargando un iframe enviando los elementos pedidos para mostrar la pantalla y se usa un fragmento en JavaScript para auto-enviar el formulario.
<? php function redirect_to_acs() { $form='<iframe name="redsys_iframe_acs" name="redsys_iframe_acs" src="" id="redsys_iframe_acs" target="_parent" referrerpolicy="origin" sandbox="allow-same-origin allow-scripts allow-top-navigation allow-forms" height="95%" width="100%" style="border: none; display: none;"></iframe> <form name="redsysAcsForm" id="redsysAcsForm" action="'. $urlACS .'" method="POST" target="redsys_iframe_acs" style="border: none;"> <table name="dataTable" border="0" cellpadding="0"> <input type="hidden" name="creq" value="'. $creq .'"> <br> <p style="font-family: Arial; font-size: 16; font-weight: bold; color: black; align: center;"> Conectando con el emisor... </p> </table> </form> <script> window.onload = function () { document.getElementById("redsys_iframe_acs").onload = function() { document.getElementById("redsysAcsForm").style.display="none"; document.getElementById("redsys_iframe_acs").style.display="inline"; } document.redsysAcsForm.submit(); } </script>'; die($form); }
Cuando el proceso de autenticación finalice, el ACS enviará el parámetro CRES a la URL que especificaste en notificationURL en el primer trataPeticion. Lo notificará utilizando un HTTP POST y tendrás que recogerlo para enviarlo en el siguiente paso de nuevo al TPV Virtual. Ten en cuenta que este parámetro puede tardar en llegar, en función de lo que tarde el titular en autenticarse, por lo que te recomendamos que si vas a configurar un timeout, seas generoso con el tiempo que pones (normalmente el ACS suele tener un timeout de 7 minutos).
Envío del resultado de la autenticación · Segundo trataPeticion
Cuando has recibido el parámetro CRES de parte del ACS, deberás iniciar un segundo trataPeticion a la URL que corresponda, que son las mismas que en el primer trataPeticion. De nuevo, debes cuidar de que los parámetros principales de la operación sean idénticos y no hayan cambiado, de lo contrario, la operación se cancelará. En esta nueva petición deberás adjuntar en el Ds_Merchant_EMV3DS el CRES que has recibido.
{ "Ds_Merchant_MerchantParameters": "eyJEU19NRVJDSEFOVF9PUkRFUiI6IjE2ODEzODQ3NzgiLCJEU19NRVJDSEFOVF9NRVJDSEFOVENPREUiOiI5OTkwMDg4ODEiLCJEU19NRVJDSEFOVF9URVJNSU5BTCI6IjEiLCJEU19NRVJDSEFOVF9UUkFOU0FDVElPTlRZUEUiOiI3IiwiRFNfTUVSQ0hBTlRfQ1VSUkVOQ1kiOiI5NzgiLCJEU19NRVJDSEFOVF9QQU4iOiI0NTQ4ODEwMDAwMDAwMDAzIiwiRFNfTUVSQ0hBTlRfRVhQSVJZREFURSI6IjQ5MTIiLCJEU19NRVJDSEFOVF9BTU9VTlQiOiIwMDAwMDAyMDAwIiwiRFNfTUVSQ0hBTlRfQ1ZWMiI6IjEyMyIsIkRTX01FUkNIQU5UX0VNVjNEUyI6IntcInRocmVlRFNJbmZvXCI6XCJDaGFsbGVuZ2VSZXNwb25zZVwiLFwicHJvdG9jb2xWZXJzaW9uXCI6XCIyLjIuMFwiLFxyXG5cdFwiY3Jlc1wiOlwiZXlKMGFISmxaVVJUVTJWeWRtVnlWSEpoYm5OSlJDSTZJamM0TkdFeVpXSXhMV1JqTjJFdE5HSmxaaTA1TWpGaUxXRmpOemRtTVRJME5tRTVZU0lzSW1GamMxUnlZVzV6U1VRaU9pSXlZVFppT1RBeVpTMWxOMll5TFRReU5qWXRZVGt6T1MweVlqRTJNVGRoWXpsaFpEWWlMQ0p0WlhOellXZGxWSGx3WlNJNklrTlNaWE1pTENKdFpYTnpZV2RsVm1WeWMybHZiaUk2SWpJdU1pNHdJaXdpZEhKaGJuTlRkR0YwZFhNaU9pSlpJbjA9XCJ9In0=", "Ds_Merchant_Signature": "17R+wwvrqC4R4REeeSXH9mMrMXTaAzRt1KxyyX9c+qj8EqEwvxBBCldmsjZlNellkK3FEWHQ6R4Si1Y3qUma+w==", "Ds_SignatureVersion": "HMAC_SHA512_V1" }
{ "DS_MERCHANT_ORDER": "1681384778", "DS_MERCHANT_MERCHANTCODE": "999008881", "DS_MERCHANT_TERMINAL": "1", "DS_MERCHANT_TRANSACTIONTYPE": "7", "DS_MERCHANT_CURRENCY": "978", "DS_MERCHANT_PAN": "4548810000000003", "DS_MERCHANT_EXPIRYDATE": "4912", "DS_MERCHANT_AMOUNT": "0000002000", "DS_MERCHANT_CVV2": "123", "DS_MERCHANT_EMV3DS": { "threeDSInfo": "ChallengeResponse", "protocolVersion": "2.2.0", "cres": "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6Ijc4NGEyZWIxLWRjN2EtNGJlZi05MjFiLWFjNzdmMTI0NmE5YSIsImFjc1RyYW5zSUQiOiIyYTZiOTAyZS1lN2YyLTQyNjYtYTkzOS0yYjE2MTdhYzlhZDYiLCJtZXNzYWdlVHlwZSI6IkNSZXMiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMi4wIiwidHJhbnNTdGF0dXMiOiJZIn0=" } }
De nuevo, los cambios más importantes en esta petición vuelven a encontrarse en el campo Ds_Merchant_EMV3DS.
- threeDSInfo: En este caso indicas que estás enviando la respuesta del proceso de autenticación.
- cres: Es el parámetro que te devolvió el ACS al finalizar la autenticación.
Cuando envíes estos parámetros, el TPV Virtual te responderá con el resultado de la operación. En este punto, deberás analizar el parámetro Ds_Response para comprobar cómo ha ido el proceso. Una respuesta con 0000, indica que ha ido correctamente y se ha producido la autorización, es decir, se ha cobrado al titular. Cualquier otra respuesta, deberás consultar la tabla de errores del SIS.
Tal y como se ha dicho anteriormente, no te olvides de firmar todas las respuestas que recibas del TPV Virtual y comprobar la firma con la que se envía desde el SIS, para así confirmar que la respuesta no ha sido alterada en el proceso.
{ "Ds_SignatureVersion": "HMAC_SHA512_V1", "Ds_MerchantParameters": "eyJEc19BbW91bnQiOiIyMDAwIiwiRHNfQ3VycmVuY3kiOiI5NzgiLCJEc19PcmRlciI6IjE2ODEzODQ3NzgiLCJEc19NZXJjaGFudENvZGUiOiI5OTkwMDg4ODEiLCJEc19UZXJtaW5hbCI6IjEiLCJEc19SZXNwb25zZSI6IjAwMDAiLCJEc19BdXRob3Jpc2F0aW9uQ29kZSI6IjMzMzcwNiIsIkRzX1RyYW5zYWN0aW9uVHlwZSI6IjciLCJEc19TZWN1cmVQYXltZW50IjoiMiIsIkRzX0xhbmd1YWdlIjoiMSIsIkRzX0NhcmROdW1iZXIiOiI0NTQ4ODEqKioqKiowMDAzIiwiRHNfTWVyY2hhbnREYXRhIjoiIiwiRHNfQ2FyZF9Db3VudHJ5IjoiNzI0IiwiRHNfQ2FyZF9CcmFuZCI6IjEiLCJEc19Qcm9jZXNzZWRQYXlNZXRob2QiOiI3OCIsIkRzX0NvbnRyb2xfMTY4MTM4NTQ3MzEyMCI6IjE2ODEzODU0NzMxMjAifQ==", "Ds_Signature": "_D2lXSsPi4MSjRZoWOgejkGSzTqNl5VdHNmyEeZgFEduaxsLGvB65z-idcVu_Z6BFek0gItPjHH3T3BkP99m6Q==" }
{ "Ds_Amount": "2000", "Ds_Currency": "978", "Ds_Order": "1681384778", "Ds_MerchantCode": "999008881", "Ds_Terminal": "1", "Ds_Response": "0000", "Ds_AuthorisationCode": "333706", "Ds_TransactionType": "7", "Ds_SecurePayment": "2", "Ds_Language": "1", "Ds_CardNumber": "454881******0003", "Ds_MerchantData": "", "Ds_Card_Country": "724", "Ds_Card_Brand": "1", "Ds_ProcessedPayMethod": "78", "Ds_Control_1681385473120": "1681385473120" }
En este punto, se habría completado la operación de autenticación y el proceso de compra habría finalizado. Ahora, en tu backoffice deberías actuar en función del resultado de la operación (actualizar el estado del pedido en tu aplicación, iniciar el proceso de preparación del pedido, notificar vía e-mail a tu cliente, etcétera). Puedes revisar la tabla de parámetros para saber qué significa cada uno de los parámetros que ha enviado el SIS con más detalle.
Realización de una operación de autenticación usando una integración inSite
La realización de una integración inSite es muy parecida a la integración vía REST, ya que una vez se ha obtenido el idOper, elemento del que hablaremos más adelante, todo el flujo es igual ya que se realiza usando REST.
Proceso de generación del idOper
El ID de operación, llamado idOper, es un identificador con el que podrás operar durante todo el proceso de pago. Para generarlo, deberás crear el iframe que va a contener el formulario inSite y que vas a mostrar al cliente para la introducción de datos de tarjeta. Tal y cómo se ha podido ver en la página de documentación de la integración inSite, las dos formas de integrar el formulario es con la integración unificada y con la integración por elementos independientes. En esta sección, verás como realizar la conexión usando la integración unificada; para más detalles sobre cómo realizar la conexión utilizando la integración inSite por elementos independientes, consulta la guía completa de integración inSite.
Como primer paso para poder integrar los campos de introducción de datos de tarjeta directamente en su propia página web, se debe incluir el fichero Javascript alojado en el servidor de Redsys, incorporando la siguiente línea de código en función del entorno en el que vayas a operar:
Entorno | Script de Conexión |
---|---|
Pruebas | <script src="https://sis-t.redsys.es:25443/sis/NC/sandbox/redsysV3.js"></script> |
Real | <script src="https://sis.redsys.es/sis/NC/redsysV3.js"></script> |
El formulario inSite, en este caso, proveerá un único iframe de tamaño muy ajustado en el que se incluirá el formulario de pago al completo. En cuanto a la personalización del mismo, se podrán aplicar los estilos CSS que el comercio requiera a los diferentes elementos. El aspecto del formulario tendrá un aspecto parecido al siguiente cuando acabes la integración:
Una vez importado el fichero JS, se deberá crear el formulario de pago. Para recoger de forma segura los datos de tarjeta, Redsys creará y alojará los campos de introducción de dichos datos. Se deberán crear un único contenedor, con un id único, ya que se deberá indicar para que se genere iframe con los elementos en él.
<div id="card-form-example"></div>
Se debe incluir una función de escucha de mensajes (listener) para recibir el ID de operación cuando éste se genere. Se debe utilizar la función storeIdOper con la siguiente definición:
storeIdOper(event, idToken, idErrorMsg, validationFunction);
En esta función, se deberá indicar el evento recogido por el listener (event), el ID del elemento del DOM se debe almacenar el ID de operación una vez sea generado (idToken), el identificador del elemento en el que se almacenarán los códigos de error en caso de que existan errores de validación de los datos (idErrorMsg). En el ejemplo posterior ambos se almacenan en un input de tipo “hidden”.
De manera adicional, como último parámetro se puede adjuntar una función de validación previa. Únicamente se continuará con la generación del ID de operación si la función de validación ejecutada por el comercio retorna un valor true.
Una vez preparado el listener para la recepción de los datos, se llamará a la función proporcionada para generar los elementos de introducción de datos de tarjeta.
getInSiteForm('card-form', estiloBoton, estiloBody, estiloCaja, estiloInputs, ’Pagar con Redsys’, fuc, terminal, merchantOrder, ‘ES’, true);
Como parámetros de las funciones se indicará el id del contenedor reservado para su generación, así como el estilo requerido para los diferentes elementos (formato CSS). En esta modalidad, se podrán incluir estilos para diferentes elementos:
- Botón de pago: Se permite la personalización del botón de pago.
- Cuerpo del formulario: Se recomienda utilizarlo para establecer un color de fondo o modificar el color o estilo de los textos.
- Caja de introducción de datos: Se podrá establecer un color de fondo diferenciado para la caja de introducción de datos. El color del texto aplicado en este elemento se aplicará al placeholder de los elementos.
- Campos de texto de introducción de datos: Se recomienda su uso si se quiere utilizar un tipo de letra diferente o modificar el color del texto de los campos de introducción de datos.
Adicionalmente, se podrá personalizar el texto a incluir en el botón y, por último, se deberá informar del valor del FUC del terminal (número de comercio) y el número de pedido (una cadena alfanumérica de 4 a 12 posiciones) en la petición de carga del iframe del formulario de pago.
Se incluyen dos parámetros opcionales en la carga del iframe.
- El primer parámetro establece el idioma de los textos. La relación de códigos se puede encontrar en el apartado de catálogo de idiomas, que se acoge a los códigos mostrados en el estándar ISO 639-1 del idioma.
En caso de no establecerse ningún idioma o informar un código erróneo, se mostrará por defecto el idioma castellano. - El segundo parámetro establece si se quiere mostrar el logo de la entidad, indicando true si se desea mostrar el logo de la entidad y false en caso contrario.
Es importante tener en cuanta que el merchantOrder utilizado en la carga de iframe y generación del idOper, deberá reutilizarse en la posterior petición de autorización. Nótese que el proceso de autenticación que se explica a continuación, tiene el mismo formato que una autorización usando REST, simplemente sustituyendo los datos de la tarjeta por el idOper. Es posible que las firmas de los ejemplos que tienes a continuación no coincidan, utilícese sólo a título informativo del procedimiento que ha de realizar.
Solicitud de información de la tarjeta · iniciaPeticion
El primer paso durante una autorización vía REST, es la solicitud de datos de tarjeta. Internamente, a este proceso se le llama iniciaPetición, y deberás realizar una solicitud REST a la URL de conexión que corresponda según el entorno en el que te encuentres trabajando.
Entorno | URL de Conexión |
---|---|
Pruebas | https://sis-t.redsys.es:25443/sis/rest/iniciaPeticionREST |
Real | https://sis.redsys.es/sis/rest/iniciaPeticionREST |
En esta transacción, estás solicitando al TPV Virtual información sobre la capacidad de la tarjeta en cuanto a autenticación (versión del protocolo 3D Secure), posibilidad de aplicación de exenciones, poder realizar operativas especiales, como por ejemplo DCC; etcétera. Esta información indicará como deben gestionarse los siguientes pasos para realizar la operación.
Para iniciar la transacción, enviarás a la URL que corresponda según el entorno en el que estás trabajando, los datos de la operación codificados en base64 dentro del objeto Ds_Merchant_MerchantParameters, junto a la firma y a la versión de firma. El objeto que enviarás debería tener un aspecto parecido al que sigue.
{ "Ds_Merchant_MerchantParameters": "eyJEU19NRVJDSEFOVF9PUkRFUiI6MTY4MTM4NDc3OCwiRFNfTUVSQ0hBTlRfTUVSQ0hBTlRDT0RFIjoiOTk5MDA4ODgxIiwiRFNfTUVSQ0hBTlRfVEVSTUlOQUwiOiIwMDEiLCJEU19NRVJDSEFOVF9UUkFOU0FDVElPTlRZUEUiOiI3IiwiRFNfTUVSQ0hBTlRfUEFOIjoiNDU0ODgxMDAwMDAwMDAwMyIsIkRTX01FUkNIQU5UX0VYUElSWURBVEUiOiI0OTEyIiwiRFNfTUVSQ0hBTlRfQ1ZWMiI6IjEyMyIsIkRTX01FUkNIQU5UX0NVUlJFTkNZIjoiOTc4IiwiRFNfTUVSQ0hBTlRfQU1PVU5UIjoiMjAwMCIsIkRTX01FUkNIQU5UX0VNVjNEUyI6IntcInRocmVlRFNJbmZvXCI6XCJDYXJkRGF0YVwifSIsIkRTX01FUkNIQU5UX0VYQ0VQX1NDQSI6IlkifQ==", "Ds_Merchant_Signature": "PmWgipoCWqisGUsoIyBNObJ1vV+xBaBqL4hNk5FdYkcr1Ns2h8dOQvwAyft63y+7w5hgeO3wEH30QxNBmnXohg==", "Ds_SignatureVersion": "HMAC_SHA512_V1" }
{ "DS_MERCHANT_ORDER": 1681384778, "DS_MERCHANT_MERCHANTCODE": "999008881", "DS_MERCHANT_TERMINAL": "001", "DS_MERCHANT_TRANSACTIONTYPE": "7", "DS_MERCHANT_PAN": "4548810000000003", "DS_MERCHANT_EXPIRYDATE": "4912", "DS_MERCHANT_CVV2": "123", "DS_MERCHANT_CURRENCY": "978", "DS_MERCHANT_AMOUNT": "2000", "DS_MERCHANT_EMV3DS": { "threeDSInfo": "CardData" }, "DS_MERCHANT_EXCEP_SCA": "Y" }
Como puedes comprobar, la estructura de la petición es parecida a la que has visto hasta ahora, pero se añaden varios campos de interés que aparecen resaltados:
- Ds_Merchant_EMV3DS: Y más concretamente threeDSInfo. En este campo, estás especificando al TPV Virtual que solicitas información de la tarjeta que has enviado en la petición.
- DS_Merchant_EXCEP_SCA: Aquí estás solicitando que también se te envíe las exenciones que soporta la tarjeta, en caso de que necesitases utilizar una.
Enviada la petición, nuestro servidor (en adelante, el SIS), responderá con los datos solicitados si todo ha ido correctamente. En caso de que se produjera un error, la respuesta sería un objeto con un campo errorCode que contendría el código de error que se ha producido y que puedes consultar en la tabla de errores.
{ "Ds_SignatureVersion": "HMAC_SHA512_V1", "Ds_MerchantParameters": "eyJEc19PcmRlciI6IjE2ODEzODQ3NzgiLCJEc19NZXJjaGFudENvZGUiOiI5OTkwMDg4ODEiLCJEc19UZXJtaW5hbCI6IjEiLCJEc19UcmFuc2FjdGlvblR5cGUiOiI3IiwiRHNfRU1WM0RTIjp7InByb3RvY29sVmVyc2lvbiI6IjIuMi4wIiwidGhyZWVEU1NlcnZlclRyYW5zSUQiOiI3ODRhMmViMS1kYzdhLTRiZWYtOTIxYi1hYzc3ZjEyNDZhOWEiLCJ0aHJlZURTSW5mbyI6IkNhcmRDb25maWd1cmF0aW9uIn0sIkRzX0V4Y2VwX1NDQSI6IkxXVjtUUkFbNTAwLjBdO0NPUjtNSVQ7QVREIiwiRHNfQ2FyZF9QU0QyIjoiWSJ9", "Ds_Signature": "pAwsc6Je1UY0gKv8pHowrJTWDwyEwv1k-i3NdnpF4C7mMrwXKIUefuXuJaXbhzQJlgJEpBtEcok6DTlSsPeIbQ==" }
{ "Ds_Order": "1681384778", "Ds_MerchantCode": "999008881", "Ds_Terminal": "1", "Ds_TransactionType": "7", "Ds_EMV3DS": { "protocolVersion": "2.2.0", "threeDSServerTransID": "784a2eb1-dc7a-4bef-921b-ac77f1246a9a", "threeDSInfo": "CardConfiguration" }, "Ds_Excep_SCA": "LWV;TRA[500.0];COR;MIT;ATD", "Ds_Card_PSD2": "Y" }
En la petición, puedes ver unos parámetros algo más raros en los MerchantParameters descodificados. En cuanto a EMV3DS, encontramos:
- protocolVersion: Esta es la versión de 3DSecure que soporta la tarjeta. En este caso, deberás emplear un flujo para 3DSecure V2.
- threeDSServerTransID: Es el identificador de la transacción 3DSecure, y lo necesitarás más adelante. Es único para la operación.
- threeDSInfo: Esto indica que la respuesta contiene los datos de la tarjeta, es decir, lo que has solicitado.
Y respecto a las exenciones y enrolamiento de la tarjeta:
- DS_Excep_SCA: Son todas las exenciones que soporta la tarjeta. Para más información, visita el apartado de exenciones de la documentación.
- Ds_Card_PSD2: Informa sin la tarjeta está enrolada en PSD2, y con una «Y» como respuesta, quiere decir que sí.
Envío de la petición al TPV Virtual · Primer trataPeticion
Una vez se han obtenido los datos de la tarjeta con la que el titular va a realizar la compra, es el momento de enviar la operación al TPV Virtual para iniciar el proceso de autenticación. Tal y como respondió el TPV Virtual en este ejemplo (y como van a ser la gran mayoría de las veces), vas a tener que realizar un proceso de autenticación EMV3DS V2. En este caso, los endpoints a los que tienes que enviar la operación son distintos:
Entorno | URL de Conexión |
---|---|
Pruebas | https://sis-t.redsys.es:25443/sis/rest/trataPeticionREST |
Real | https://sis.redsys.es/sis/rest/trataPeticionREST |
Para ello, tienes que preparar la operación de nuevo. Es muy importante que todos los datos básicos de la operación y, sobre todo, el número de pedido sea el mismo, de lo contrario la operación no podrá continuar. Además, se adjuntará dentro del parámetro Ds_Merchant_EMV3DS, un objeto JSON con los parámetros del navegador junto a los parámetros threeDSInfo y protocolVersion. Estos parámetros puedes obtenerlos manualmente o usando nuestras librerías de integración.
{ "Ds_Merchant_MerchantParameters": "eyJEU19NRVJDSEFOVF9PUkRFUiI6IjE2ODEzODQ3NzgiLCJEU19NRVJDSEFOVF9NRVJDSEFOVENPREUiOiI5OTkwMDg4ODEiLCJEU19NRVJDSEFOVF9URVJNSU5BTCI6IjEiLCJEU19NRVJDSEFOVF9UUkFOU0FDVElPTlRZUEUiOiI3IiwiRFNfTUVSQ0hBTlRfQ1VSUkVOQ1kiOiI5NzgiLCJEU19NRVJDSEFOVF9QQU4iOiI0NTQ4ODEwMDAwMDAwMDAzIiwiRFNfTUVSQ0hBTlRfRVhQSVJZREFURSI6IjQ5MTIiLCJEU19NRVJDSEFOVF9BTU9VTlQiOiIwMDAwMDAyMDAwIiwiRFNfTUVSQ0hBTlRfQ1ZWMiI6IjEyMyIsIkRTX01FUkNIQU5UX0VNVjNEUyI6IntcInRocmVlRFNJbmZvXCI6XCJBdXRoZW50aWNhdGlvbkRhdGFcIixcInByb3RvY29sVmVyc2lvblwiOlwiMi4yLjBcIixcImJyb3dzZXJKYXZhc2NyaXB0RW5hYmxlZFwiOlwidHJ1ZVwiLFwiYnJvd3NlckFjY2VwdEhlYWRlclwiOlwidGV4dFwvaHRtbCxhcHBsaWNhdGlvblwveGh0bWwreG1sLGFwcGxpY2F0aW9uXC94bWw7cT0wLjksKlwvKjtxPTAuOCxhcHBsaWNhdGlvblwvanNvblwiLFwiYnJvd3NlclVzZXJBZ2VudFwiOlwiTW96aWxsYVwvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0XC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWVcLzcxLjAuMzU3OC45OCBTYWZhcmlcLzUzNy4zNlwiLFxyXG5cdFwidGhyZWVEU1NlcnZlclRyYW5zSURcIjpcIjc4NGEyZWIxLWRjN2EtNGJlZi05MjFiLWFjNzdmMTI0NmE5YVwiLFwiYnJvd3NlckphdmFFbmFibGVkXCI6XCJmYWxzZVwiLFwiYnJvd3Nlckxhbmd1YWdlXCI6XCJFUy1lc1wiLFwiYnJvd3NlckNvbG9yRGVwdGhcIjpcIjI0XCIsXCJicm93c2VyU2NyZWVuSGVpZ2h0XCI6XCIxMjUwXCIsIFwiYnJvd3NlclNjcmVlbldpZHRoXCI6XCIxMzIwXCIsXCJicm93c2VyVFpcIjpcIjUyXCIsXCJub3RpZmljYXRpb25VUkxcIjpcImh0dHBzOlwvXC9zaXMtZC5yZWRzeXMuZXNcL3Npcy1zaW11bGFkb3Itd2ViXC9TaXNSRVNUQ3JlcUNyZXNfM0RTZWN1cmVWMi5qc3BcIn0ifQ==", "Ds_Merchant_Signature": "tYF5FQeMExPJC4C8JBjkfo5oiWNgAEt30NjLCgasE3BgjTeaT2H4schmFLBaPi2M9znpWH/Qt/3nuw0b3U2Hfg==", "Ds_SignatureVersion": "HMAC_SHA512_V1" }
{ "DS_MERCHANT_ORDER": "1681384778", "DS_MERCHANT_MERCHANTCODE": "999008881", "DS_MERCHANT_TERMINAL": "1", "DS_MERCHANT_TRANSACTIONTYPE": "7", "DS_MERCHANT_CURRENCY": "978", "DS_MERCHANT_PAN": "4548810000000003", "DS_MERCHANT_EXPIRYDATE": "4912", "DS_MERCHANT_AMOUNT": "0000002000", "DS_MERCHANT_CVV2": "123", "DS_MERCHANT_EMV3DS": { "threeDSInfo": "AuthenticationData", "protocolVersion": "2.2.0", "browserJavascriptEnabled": "true", "browserAcceptHeader": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,application/json", "browserUserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36", "threeDSServerTransID": "784a2eb1-dc7a-4bef-921b-ac77f1246a9a", "browserJavaEnabled": "false", "browserLanguage": "ES-es", "browserColorDepth": "24", "browserScreenHeight": "1250", "browserScreenWidth": "1320", "browserTZ": "52", "notificationURL": "https://sis-d.redsys.es/sis-simulador-web/SisRESTCreqCres_3DSecureV2.jsp" } }
Tal y como puedes comprobar en los parámetros descodificados, el campo Ds_Merchant_EMV3DS tiene en este caso un JSON con muchos más campos de lo habitual. Los importantes son los dos primeros y el último, ya que el resto de los campos, son los datos extraídos del navegador del cliente.
- threeDSInfo: En este caso estamos solicitando datos para la autenticación del titular de la tarjeta que enviamos.
- protocolVersion: La versión del protocolo EMV3DS de la tarjeta, que se nos notificó en el paso anterior.
- notificationURL: Una vez finalizado el challenge, la entidad emisora enviará el resultado al comercio, haciendo un HTTP POST a esta URL.
Una vez enviemos estos datos, el SIS nos devolverá una respuesta parecida a la que sigue.
{ "Ds_SignatureVersion": "HMAC_SHA512_V1", "Ds_MerchantParameters": "eyJEc19BbW91bnQiOiIyMDAwIiwiRHNfQ3VycmVuY3kiOiI5NzgiLCJEc19PcmRlciI6IjE2ODEzODQ3NzgiLCJEc19NZXJjaGFudENvZGUiOiI5OTkwMDg4ODEiLCJEc19UZXJtaW5hbCI6IjEiLCJEc19UcmFuc2FjdGlvblR5cGUiOiI3IiwiRHNfRU1WM0RTIjp7InRocmVlRFNJbmZvIjoiQ2hhbGxlbmdlUmVxdWVzdCIsInByb3RvY29sVmVyc2lvbiI6IjIuMi4wIiwiYWNzVVJMIjoiaHR0cHM6Ly9zaXMtZC5yZWRzeXMuZXMvc2lzLXNpbXVsYWRvci13ZWIvYXV0aGVudGljYXRpb25SZXF1ZXN0LmpzcCIsImNyZXEiOiJleUowYUhKbFpVUlRVMlZ5ZG1WeVZISmhibk5KUkNJNklqYzROR0V5WldJeExXUmpOMkV0TkdKbFppMDVNakZpTFdGak56ZG1NVEkwTm1FNVlTSXNJbUZqYzFSeVlXNXpTVVFpT2lJeVlUWmlPVEF5WlMxbE4yWXlMVFF5TmpZdFlUa3pPUzB5WWpFMk1UZGhZemxoWkRZaUxDSnRaWE56WVdkbFZIbHdaU0k2SWtOU1pYRWlMQ0p0WlhOellXZGxWbVZ5YzJsdmJpSTZJakl1TWk0d0lpd2lZMmhoYkd4bGJtZGxWMmx1Wkc5M1UybDZaU0k2SWpBMUluMCJ9fQ==", "Ds_Signature": "YCd7i-xigS6RmL32HVncuiS0ZB_v52i0X5rKkyGiwPsfqvaJdUMxCuTdimuUMFQZjXU4pFmMzdCo3fzv21Ia9Q==" }
{ "Ds_Amount": "2000", "Ds_Currency": "978", "Ds_Order": "1681384778", "Ds_MerchantCode": "999008881", "Ds_Terminal": "1", "Ds_TransactionType": "7", "Ds_EMV3DS": { "threeDSInfo": "ChallengeRequest", "protocolVersion": "2.2.0", "acsURL": "https://sis-d.redsys.es/sis-simulador-web/authenticationRequest.jsp", "creq": "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6Ijc4NGEyZWIxLWRjN2EtNGJlZi05MjFiLWFjNzdmMTI0NmE5YSIsImFjc1RyYW5zSUQiOiIyYTZiOTAyZS1lN2YyLTQyNjYtYTkzOS0yYjE2MTdhYzlhZDYiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMi4wIiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjA1In0" } }
En la respuesta del TPV Virtual, se debe analizar el contenido del parámetro Ds_EMV3DS:
- threeDSInfo: En este caso nos informa de que la operación requiere autenticación de titular, conocido como Challenge.
- acsURL: Es la URL donde deberás enviar la petición de autenticación del titular, el CREQ.
- creq: De ChallengeRequest, es el valor que debes enviar a la URL del ACS (servidor de autenticación).
Resultados alternativos: frictionless y KO
Es posible que en la respuesta, no se te envíe challengeRequest, ni acsURL ni CREQ, sino que directamente se te muestre el resultado de la operación con un código de autorización y Ds_Response con valor 0000 (OK). En este caso, se ha producido lo que se denomina una autenticación frictionless, es decir, el servidor de autenticación ha considerado tener datos suficientes para identificar al titular y autorizar la operación. La respuesta, en ese caso, sería parecida a la que sigue.
{ "Ds_MerchantParameters": "eyJEc19EYXRlIjoiMDklMkYwMiUyRjIwMjMiLCJEc19Ib3VyIjoiMTclM0EwOSIsIkRzX1NlY3VyZVBheW1lbnQiOiIxIiwiRHNfQW1vdW50IjoiMTQ1IiwiRHNfQ3VycmVuY3kiOiI5NzgiLCJEc19PcmRlciI6IjExMTIiLCJEc19NZXJjaGFudENvZGUiOiI5OTkwMDg4ODEiLCJEc19UZXJtaW5hbCI6IjAwMSIsIkRzX1Jlc3BvbnNlIjoiMDAwMCIsIkRzX1RyYW5zYWN0aW9uVHlwZSI6IjAiLCJEc19NZXJjaGFudERhdGEiOiIlMjZWaWFqZXMlMEElMDklMDklMDklMDklMDklMDklMDlNYWwlMEElMDklMDklMDklMDklMDklMDklMDlkaXZhcyIsIkRzX0F1dGhvcmlzYXRpb25Db2RlIjoiMjkxODU2IiwiRHNfQ2FyZF9OdW1iZXIiOiI0OTE4MDEqKioqKio0NjAyIiwiRHNfQ29uc3VtZXJMYW5ndWFnZSI6IjEiLCJEc19DYXJkX0NvdW50cnkiOiI3MjQiLCJEc19DYXJkX0JyYW5kIjoiMSIsIkRzX1Byb2Nlc3NlZFBheU1ldGhvZCI6IjgwIiwiRHNfQ29udHJvbF8xNjc1OTU4OTk1MzcxIjoiMTY3NTk1ODk5NTM3MSJ9", "Ds_Merchant_Signature": "KYp3cC6-6I7o3T_S2uhOasbmIajgpAsjIUlH2yiAQKUEhh_zu89ARRHCmHA6NvuSOeAoJcnFBtYpTdVf8Q_kNQ==", "Ds_SignatureVersion": "HMAC_SHA512_V1" }
{ "Ds_Date": "09%2F02%2F2023", "Ds_Hour": "17%3A09", "Ds_SecurePayment": "1", "Ds_Amount": "145", "Ds_Currency": "978", "Ds_Order": "1680071984", "Ds_MerchantCode": "999008881", "Ds_Terminal": "001", "Ds_Response": "0000", "Ds_TransactionType": "7", "Ds_AuthorisationCode": "291856", "Ds_Card_Number": "454881******0003", "Ds_ConsumerLanguage": "1", "Ds_Card_Country": "724", "Ds_Card_Brand": "1", "Ds_ProcessedPayMethod": "80", "Ds_Control_1675958995371": "1675958995371" }
En este caso puedes analizar el Ds_Response, y comprobar que, si su valor es 0000, la operación ha finalizado correctamente.
Por el contrario, si el Ds_Response que recibes es distinto a 0000, por ejemplo 0190; quiere decir que no se ha realizado la autenticación y se ha producido algún error durante la operación. Deberás consultar la tabla de errores para averiguar qué error se ha producido.
Proceso de autenticación
Para realizar la autenticación, tienes que usar el parámetro CREQ que te envió el SIS, y remitirlo a la URL del servidor de autenticación que te llegó en el parámetro acsURL. Esto deberás hacerlo, por ejemplo, vía HTTP POST a la URL especificada.
<form name="frm" action="https://sis-d.redsys.es/sis-simulador-web/authenticationRequest.jsp" method="POST" target="_blank"> <input type="text" name="creq" value="eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6Ijc4NGEyZWIxLWRjN2EtNGJlZi05MjFiLWFjNzdmMTI0NmE5YSIsImFjc1RyYW5zSUQiOiIyYTZiOTAyZS1lN2YyLTQyNjYtYTkzOS0yYjE2MTdhYzlhZDYiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMi4wIiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjA1In0" /> <input type="submit" value="Realizar Pago" /> </form>
Cabe destacar en este punto, que debes estar preparado para mostrar una pantalla al titular que muestra el estado del servidor de autenticación y los pasos que debe seguir. En esa pantalla se muestran las instrucciones para realizar la autenticación, como poner el código que le ha llegado por SMS, aceptar la operación en su aplicación del banco, etcétera. La pantalla del ACS se parece a la siguiente en nuestro entorno de TEST, pero puede tener diversos aspectos una vez en producción en función de la marca y del tipo de challenge.
Para mostrar la pantalla, te mostramos un ejemplo de cómo hacerlo en PHP, pero puedes extrapolar esta muestra a cualquier lenguaje ya que, como puedes observar, sólo se está cargando un iframe enviando los elementos pedidos para mostrar la pantalla y se usa un fragmento en JavaScript para auto-enviar el formulario.
<? php function redirect_to_acs() { $form='<iframe name="redsys_iframe_acs" name="redsys_iframe_acs" src="" id="redsys_iframe_acs" target="_parent" referrerpolicy="origin" sandbox="allow-same-origin allow-scripts allow-top-navigation allow-forms" height="95%" width="100%" style="border: none; display: none;"></iframe> <form name="redsysAcsForm" id="redsysAcsForm" action="'. $urlACS .'" method="POST" target="redsys_iframe_acs" style="border: none;"> <table name="dataTable" border="0" cellpadding="0"> <input type="hidden" name="creq" value="'. $creq .'"> <br> <p style="font-family: Arial; font-size: 16; font-weight: bold; color: black; align: center;"> Conectando con el emisor... </p> </table> </form> <script> window.onload = function () { document.getElementById("redsys_iframe_acs").onload = function() { document.getElementById("redsysAcsForm").style.display="none"; document.getElementById("redsys_iframe_acs").style.display="inline"; } document.redsysAcsForm.submit(); } </script>'; die($form); }
Cuando el proceso de autenticación finalice, el ACS enviará el parámetro CRES a la URL que especificaste en notificationURL en el primer trataPeticion. Lo notificará utilizando un HTTP POST y tendrás que recogerlo para enviarlo en el siguiente paso de nuevo al TPV Virtual. Ten en cuenta que este parámetro puede tardar en llegar, en función de lo que tarde el titular en autenticarse, por lo que te recomendamos que si vas a configurar un timeout, seas generoso con el tiempo que pones (normalmente el ACS suele tener un timeout de 7 minutos).
Envío del resultado de la autenticación · Segundo trataPeticion
Cuando has recibido el parámetro CRES de parte del ACS, deberás iniciar un segundo trataPeticion a la URL que corresponda, que son las mismas que en el primer trataPeticion. De nuevo, debes cuidar de que los parámetros principales de la operación sean idénticos y no hayan cambiado, de lo contrario, la operación se cancelará. En esta nueva petición deberás adjuntar en el Ds_Merchant_EMV3DS el CRES que has recibido.
{ "Ds_Merchant_MerchantParameters": "eyJEU19NRVJDSEFOVF9PUkRFUiI6IjE2ODEzODQ3NzgiLCJEU19NRVJDSEFOVF9NRVJDSEFOVENPREUiOiI5OTkwMDg4ODEiLCJEU19NRVJDSEFOVF9URVJNSU5BTCI6IjEiLCJEU19NRVJDSEFOVF9UUkFOU0FDVElPTlRZUEUiOiI3IiwiRFNfTUVSQ0hBTlRfQ1VSUkVOQ1kiOiI5NzgiLCJEU19NRVJDSEFOVF9QQU4iOiI0NTQ4ODEwMDAwMDAwMDAzIiwiRFNfTUVSQ0hBTlRfRVhQSVJZREFURSI6IjQ5MTIiLCJEU19NRVJDSEFOVF9BTU9VTlQiOiIwMDAwMDAyMDAwIiwiRFNfTUVSQ0hBTlRfQ1ZWMiI6IjEyMyIsIkRTX01FUkNIQU5UX0VNVjNEUyI6IntcInRocmVlRFNJbmZvXCI6XCJDaGFsbGVuZ2VSZXNwb25zZVwiLFwicHJvdG9jb2xWZXJzaW9uXCI6XCIyLjIuMFwiLFxyXG5cdFwiY3Jlc1wiOlwiZXlKMGFISmxaVVJUVTJWeWRtVnlWSEpoYm5OSlJDSTZJamM0TkdFeVpXSXhMV1JqTjJFdE5HSmxaaTA1TWpGaUxXRmpOemRtTVRJME5tRTVZU0lzSW1GamMxUnlZVzV6U1VRaU9pSXlZVFppT1RBeVpTMWxOMll5TFRReU5qWXRZVGt6T1MweVlqRTJNVGRoWXpsaFpEWWlMQ0p0WlhOellXZGxWSGx3WlNJNklrTlNaWE1pTENKdFpYTnpZV2RsVm1WeWMybHZiaUk2SWpJdU1pNHdJaXdpZEhKaGJuTlRkR0YwZFhNaU9pSlpJbjA9XCJ9In0=", "Ds_Merchant_Signature": "17R+wwvrqC4R4REeeSXH9mMrMXTaAzRt1KxyyX9c+qj8EqEwvxBBCldmsjZlNellkK3FEWHQ6R4Si1Y3qUma+w==", "Ds_SignatureVersion": "HMAC_SHA512_V1" }
{ "DS_MERCHANT_ORDER": "1681384778", "DS_MERCHANT_MERCHANTCODE": "999008881", "DS_MERCHANT_TERMINAL": "1", "DS_MERCHANT_TRANSACTIONTYPE": "7", "DS_MERCHANT_CURRENCY": "978", "DS_MERCHANT_PAN": "4548810000000003", "DS_MERCHANT_EXPIRYDATE": "4912", "DS_MERCHANT_AMOUNT": "0000002000", "DS_MERCHANT_CVV2": "123", "DS_MERCHANT_EMV3DS": { "threeDSInfo": "ChallengeResponse", "protocolVersion": "2.2.0", "cres": "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6Ijc4NGEyZWIxLWRjN2EtNGJlZi05MjFiLWFjNzdmMTI0NmE5YSIsImFjc1RyYW5zSUQiOiIyYTZiOTAyZS1lN2YyLTQyNjYtYTkzOS0yYjE2MTdhYzlhZDYiLCJtZXNzYWdlVHlwZSI6IkNSZXMiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMi4wIiwidHJhbnNTdGF0dXMiOiJZIn0=" } }
De nuevo, los cambios más importantes en esta petición vuelven a encontrarse en el campo Ds_Merchant_EMV3DS.
- threeDSInfo: En este caso indicas que estás enviando la respuesta del proceso de autenticación.
- cres: Es el parámetro que te devolvió el ACS al finalizar la autenticación.
Cuando envíes estos parámetros, el TPV Virtual te responderá con el resultado de la operación. En este punto, deberás analizar el parámetro Ds_Response para comprobar cómo ha ido el proceso. Una respuesta con 0000, indica que ha ido correctamente y se ha producido la autorización, es decir, se ha cobrado al titular. Cualquier otra respuesta, deberás consultar la tabla de errores del SIS.
Tal y como se ha dicho anteriormente, no te olvides de firmar todas las respuestas que recibas del TPV Virtual y comprobar la firma con la que se envía desde el SIS, para así confirmar que la respuesta no ha sido alterada en el proceso.
{ "Ds_SignatureVersion": "HMAC_SHA512_V1", "Ds_MerchantParameters": "eyJEc19BbW91bnQiOiIyMDAwIiwiRHNfQ3VycmVuY3kiOiI5NzgiLCJEc19PcmRlciI6IjE2ODEzODQ3NzgiLCJEc19NZXJjaGFudENvZGUiOiI5OTkwMDg4ODEiLCJEc19UZXJtaW5hbCI6IjEiLCJEc19SZXNwb25zZSI6IjAwMDAiLCJEc19BdXRob3Jpc2F0aW9uQ29kZSI6IjMzMzcwNiIsIkRzX1RyYW5zYWN0aW9uVHlwZSI6IjciLCJEc19TZWN1cmVQYXltZW50IjoiMiIsIkRzX0xhbmd1YWdlIjoiMSIsIkRzX0NhcmROdW1iZXIiOiI0NTQ4ODEqKioqKiowMDAzIiwiRHNfTWVyY2hhbnREYXRhIjoiIiwiRHNfQ2FyZF9Db3VudHJ5IjoiNzI0IiwiRHNfQ2FyZF9CcmFuZCI6IjEiLCJEc19Qcm9jZXNzZWRQYXlNZXRob2QiOiI3OCIsIkRzX0NvbnRyb2xfMTY4MTM4NTQ3MzEyMCI6IjE2ODEzODU0NzMxMjAifQ==", "Ds_Signature": "_D2lXSsPi4MSjRZoWOgejkGSzTqNl5VdHNmyEeZgFEduaxsLGvB65z-idcVu_Z6BFek0gItPjHH3T3BkP99m6Q==" }
{ "Ds_Amount": "2000", "Ds_Currency": "978", "Ds_Order": "1681384778", "Ds_MerchantCode": "999008881", "Ds_Terminal": "1", "Ds_Response": "0000", "Ds_AuthorisationCode": "333706", "Ds_TransactionType": "7", "Ds_SecurePayment": "2", "Ds_Language": "1", "Ds_CardNumber": "454881******0003", "Ds_MerchantData": "", "Ds_Card_Country": "724", "Ds_Card_Brand": "1", "Ds_ProcessedPayMethod": "78", "Ds_Control_1681385473120": "1681385473120" }
En este punto, se habría completado la operación de autenticación y el proceso de compra habría finalizado. Ahora, en tu backoffice deberías actuar en función del resultado de la operación (actualizar el estado del pedido en tu aplicación, iniciar el proceso de preparación del pedido, notificar vía e-mail a tu cliente, etcétera). Puedes revisar la tabla de parámetros para saber qué significa cada uno de los parámetros que ha enviado el SIS con más detalle.
Confirmación de la operación de autenticación
Tal y como se ha explicado al comienzo, la operación de autenticación no retiene el importe en la cuenta del titular, por lo que este no se refleja en la cuenta del titular hasta que no se realiza la confirmación de la operación. Para confirmar la operación, debes ser tú (el comercio) el que lance la operación para completar el proceso de preautorización. Esta confirmación ya tiene cargo contable y su importe puede ser menor o igual. La diferencia de importe, si la hubiera, se liberaría a favor del titular de la tarjeta una vez se pase el periodo de retención establecido.
Para realizar la operación de confirmación, la puedes de realizar de dos maneras:
- Desde el Portal de Administración del TPV Virtual.
- Mediante una petición REST al TPV Virtual.
Usando el Portal de Administración del TPV Virtual
La manera más sencilla para poder confirmar la operación de autenticación es haciéndolo desde el Portal de Administración del TPV Virtual. Para encontrar la operación de manera sencilla, te recomendamos que tengas a mano el número de pedido de la operación.
Deberás acceder al Portal de Administración del TPV Virtual e ingresar tus credenciales. Una vez dentro, puedes buscar la operación por fechas, o buscarla directamente usando el número de pedido. En este caso, te enseñamos el proceso para confirmar una orden de ejemplo, cuyo número de pedido es el 1681384778.
En esta pantalla, y verificado que el tipo de operación mostrado es «Preautorización», debes pulsar sobre el botón del ojo en la columna de operaciones, en la fila correspondiente a la operación que quieres confirmar. Al hacerlo, verás una ventana con los detalles de la operación.
En esta ventana podrás ver todos los detalles de la operación y, en la parte superior, encontrarás los botones para confirmar la operación, que se han marcado en amarillo en la imagen. El botón «Confirmar operación» podrás confirmar la operación por la totalidad del importe o introducir un importe cualquiera, siempre que sea menor al importe inicialmente autenticado. También podrás anular la operación si no puedes servirle el producto o servicio comprado.
En caso de que confirmes una operación de manera parcial, el importe no confirmado se devolverá al titular si finalizado el tiempo de retención de la operación de autenticación no se ha confirmado el importe restante.
Enviando una petición REST al TPV Virtual
Además de usando el Portal de Administración del TPV Virtual, también puedes confirmar la operación realizando una petición REST al TPV Virtual. Esto es util si, por ejemplo, deseas realizar un control de las órdenes y ejecutar operaciones sobre estas desde tu propio backoffice, en el que sólo tendrás que programar la petición que se va a enviar en función del tipo de operativa.
Para realizar la petición, deberás formar un objeto JSON que enviar al TPV Virtual. Esta petición se enviará directamente al endpoint de trataPeticion, según el entorno en el que desees operar:
Entorno | URL de Conexión |
---|---|
Pruebas | https://sis-t.redsys.es:25443/sis/rest/trataPeticionREST |
Real | https://sis.redsys.es/sis/rest/trataPeticionREST |
El objeto que debes enviar es muy parecido a los que has tenido que usar para generar la operación de autenticación, sólo que aquí sólo necesitarás un paso. Cuando construyas el mensaje que vas a enviar al TPV Virtual, es muy importante que utilices el mismo número de pedido de la operación que quieres confirmar y que, a su vez, este coincida con el de la operación de preautorización; por lo que debes prestar especial atención si el ID de pedido que utilizas en tu backoffice y el que envías a Redsys no coinciden, ya que deberás usar este último.
El mensaje de petición deberá ser parecido al que sigue:
{ "Ds_Merchant_MerchantParameters": "eyJEU19NRVJDSEFOVF9PUkRFUiI6IjE2ODEzODQ3NzgiLCJEU19NRVJDSEFOVF9NRVJDSEFOVENPREUiOiI5OTkwMDg4ODEiLCJEU19NRVJDSEFOVF9URVJNSU5BTCI6IjEiLCJEU19NRVJDSEFOVF9UUkFOU0FDVElPTlRZUEUiOiI4IiwiRFNfTUVSQ0hBTlRfQ1VSUkVOQ1kiOiI5NzgiLCJEU19NRVJDSEFOVF9BTU9VTlQiOiIyMDAwIn0=", "Ds_Merchant_Signature": "M9ePRLiaIwxUpVcjMPw2FrduCz6VJV4bOMEl+pSyajLBQdX7k1wSSOH56zdjT0J2VkuY9uHSwiJ3vWiudku3zg==", "Ds_SignatureVersion": "HMAC_SHA512_V1" }
{ "DS_MERCHANT_ORDER": "1681384778", "DS_MERCHANT_MERCHANTCODE": "999008881", "DS_MERCHANT_TERMINAL": "1", "DS_MERCHANT_TRANSACTIONTYPE": "8", "DS_MERCHANT_CURRENCY": "978", "DS_MERCHANT_AMOUNT": "2000" }
Hecho esto, deberás recibir la respuesta del TPV Virtual, que contestará con el resultado de la operación. Un ejemplo de respuesta es el que sigue:
{ "Ds_Merchant_MerchantParameters": "eyJEc19BbW91bnQiOiIyMDAwIiwiRHNfQ3VycmVuY3kiOiI5NzgiLCJEc19PcmRlciI6IjE2ODEzODQ3NzgiLCJEc19NZXJjaGFudENvZGUiOiI5OTkwMDg4ODEiLCJEc19UZXJtaW5hbCI6IjEiLCJEc19SZXNwb25zZSI6IjAwMDAiLCJEc19BdXRob3Jpc2F0aW9uQ29kZSI6IjMzMzc1NSIsIkRzX1RyYW5zYWN0aW9uVHlwZSI6IjgiLCJEc19TZWN1cmVQYXltZW50IjoiMiIsIkRzX0xhbmd1YWdlIjoiMSIsIkRzX01lcmNoYW50RGF0YSI6IiIsIkRzX0NhcmRfQ291bnRyeSI6IjcyNCIsIkRzX0NhcmRfQnJhbmQiOiIxIiwiRHNfUHJvY2Vzc2VkUGF5TWV0aG9kIjoiNzgiLCJEc19Db250cm9sXzE2ODEzODY5MDE1NzIiOiIxNjgxMzg2OTAxNTcyIn0=", "Ds_Merchant_Signature": "O17q6v_k745pLmSby8Y5XZEFg5MocTVaEGJzwKHbz9bRHLKD7mZYh-3isUfnurYO2GGoTaskHDibWhyP3mx1gg==", "Ds_SignatureVersion": "HMAC_SHA512_V1" }
{ "Ds_Amount": "2000", "Ds_Currency": "978", "Ds_Order": "1681384778", "Ds_MerchantCode": "999008881", "Ds_Terminal": "1", "Ds_Response": "0000", "Ds_AuthorisationCode": "333755", "Ds_TransactionType": "8", "Ds_SecurePayment": "2", "Ds_Language": "1", "Ds_MerchantData": "", "Ds_Card_Country": "724", "Ds_Card_Brand": "1", "Ds_ProcessedPayMethod": "78", "Ds_Control_1681386901572": "1681386901572" }
Con esto, se debe evaluar la respuesta recibida por parte de Redsys para comprobar cuál ha sido el resultado de la confirmación: si recibimos un Ds_Response con valor 0000, significa que la confirmación ha ido correctamente.