Operativa DCC

La operativa DCC, acrónimo de Dynamic Currency Conversion, es una operativa que permite a los titulares de tarjeta pagar con su divisa origen si difiere de la local, configurada en tu tienda. En otras palabras, el cliente tendrá la oportunidad de pagar en la divisa en la que opere su tarjeta si esta es distinta de la que está configurada en tu TPV Virtual.

Es importante que tengas en cuenta que antes de poder utilizar esta operativa debes solicitar su activación a BBVA, que debe configurarlo en tu TPV Virtual. Una vez tengas el servicio activado, es posible que debas realizar algunas configuraciones en el proceso de pago, en función del tipo de integración que tengas implementado.

Integración vía Redirección

En caso de que tu comercio se conecte con Redsys utilizando la pasarela de Redirección, los cambios que deberás de hacer serán mínimos, ya que de toda la lógica DCC nos ocupamos nosotros. Cuando el titular introduzca su tarjeta, se comparará la moneda que utiliza por defecto la tarjeta con la configurada en tu TPV Virtual. Si estas difiriesen, se mostraría al titular un cuadro de confirmación en el que podrá elegir si quiere pagar en la moneda local, es decir, la de tu comercio; o si por el contrario desea pagar en su propia moneda. La pantalla de información se mostrará siempre en inglés, y será parecida a esta:

Como puedes ver, se informa tanto del importe total en la moneda local como en la configurada en la tarjeta del titular, y se da opción de pagar tanto en Euros como en Dólares. Se muestra la información del tipo de cambio, y el porcentaje de margen comercial sobre el importe total que cobra BBVA por la conversión (Mark-Up), que en este ejemplo es un 3% y está ya aplicado a la tasa de conversión y, por ende, al importe total mostrado en la moneda extranjera.

Integración vía REST o inSite

A la hora de incorporarla operativa DCC dentro de tu flujo de pagos si tienes una integración personalizada tendrás que tener alguna cosa más en cuenta. Para ejecutar DCC, estás obligado a mostrar a tu cliente una pantalla similar a la mostrada en el apartado de redirección, en el que informes sobre la posibilidad de pagar tanto en la moneda local de la tienda, como en la configurada en la tarjeta del titular. Tienes que informarle del tipo de cambio que se va a aplicar, la cantidad total que se va a pagar y las tasas. No te preocupes, toda esta información te la proveerá el TPV Virtual.

Una vez DCC está activado en tu TPV Virtual (recuerda que debes solicitárselo a BBVA), deberás incorporar en el primer paso un nuevo parámetro para indicarle al TPV Virtual que evalúe la posibilidad de aplicar DCC. En los ejemplos, se usará una operación de autorización, pero el DCC puede aplicarse a cualquier operativa en el que se vaya a efectuar un cobro. Recuerda que los parámetros que debes enviar son los mismos que

Realización de un pago usando una integración vía REST y solicitando DCC

¿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.

EntornoURL de Conexión
Pruebashttps://sis-t.redsys.es:25443/sis/rest/iniciaPeticionREST
Realhttps://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": "eyJEU19NRVJDSEFOVF9PUkRFUiI6MTY4MTQ2NDY1OSwiRFNfTUVSQ0hBTlRfTUVSQ0hBTlRDT0RFIjoiOTk5MDA4ODgxIiwiRFNfTUVSQ0hBTlRfVEVSTUlOQUwiOiIwMDEiLCJEU19NRVJDSEFOVF9UUkFOU0FDVElPTlRZUEUiOiIwIiwiRFNfTUVSQ0hBTlRfUEFOIjoiNDExNzczMTIzNDU2Nzg5MSIsIkRTX01FUkNIQU5UX0VYUElSWURBVEUiOiI0OTEyIiwiRFNfTUVSQ0hBTlRfQ1ZWMiI6IjEyMyIsIkRTX01FUkNIQU5UX0NVUlJFTkNZIjoiOTc4IiwiRFNfTUVSQ0hBTlRfQU1PVU5UIjoiMjAwMCIsIkRTX01FUkNIQU5UX0RDQyI6IlkiLCJEU19NRVJDSEFOVF9FTVYzRFMiOiJ7XCJ0aHJlZURTSW5mb1wiOlwiQ2FyZERhdGFcIn0iLCJEU19NRVJDSEFOVF9FWENFUF9TQ0EiOiJZIn0=",
    "Ds_Merchant_Signature": "HUki09u4HiNrMlUX216W4LQwL9nxMDDamtAwIJ3Lmt0hgw6CJi1WrGpProNl/MxqXUzrTu5b44Z6K6R+zq6/kQ==",
    "Ds_SignatureVersion": "HMAC_SHA512_V1"
}
{
	"DS_MERCHANT_ORDER": 1681464659,
	"DS_MERCHANT_MERCHANTCODE": "999008881",
	"DS_MERCHANT_TERMINAL": "001",
	"DS_MERCHANT_TRANSACTIONTYPE": "0",
	"DS_MERCHANT_PAN": "4117731234567891",
	"DS_MERCHANT_EXPIRYDATE": "4912",
	"DS_MERCHANT_CVV2": "123",
	"DS_MERCHANT_CURRENCY": "978",
	"DS_MERCHANT_AMOUNT": "2000",
	"DS_MERCHANT_DCC": "Y",
	"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": "eyJEc19PcmRlciI6IjE2ODE0NjQ2NTkiLCJEc19NZXJjaGFudENvZGUiOiI5OTkwMDg4ODEiLCJEc19UZXJtaW5hbCI6IjEiLCJEc19UcmFuc2FjdGlvblR5cGUiOiIwIiwiRHNfRENDIjp7IkluZm9Nb25lZGFUYXJqZXRhIjp7Im1vbmVkYURDQyI6Ijg0MCIsImxpdE1vbmVkYURDQyI6IkRPTEFSIFUuUy5BLiIsImxpdE1vbmVkYVJEQ0MiOiJVU0QiLCJpbXBvcnRlRENDIjoiMjMuMzciLCJjYW1iaW9EQ0MiOiIwLjg1NTkzMSIsImZlY2hhQ2FtYmlvRENDIjoiMjAyMC0wNi0yNSIsIm1hcmtVcCI6MC4wM30sIkluZm9Nb25lZGFDb21lcmNpbyI6eyJtb25lZGFDb21lIjoiOTc4IiwibGl0TW9uZWRhQ29tZSI6IkVVUiIsImltcG9ydGVDb21lIjoiMjAuMDAifX0sIkRzX0VNVjNEUyI6eyJwcm90b2NvbFZlcnNpb24iOiIyLjEuMCIsInRocmVlRFNTZXJ2ZXJUcmFuc0lEIjoiYmM3YTJiNjAtN2I1Ny00ZGY3LWI4YTYtNTUzNmUzYmI0ZWY2IiwidGhyZWVEU0luZm8iOiJDYXJkQ29uZmlndXJhdGlvbiJ9LCJEc19FeGNlcF9TQ0EiOiJMV1Y7VFJBWzUwMC4wXTtDT1I7TUlUO0FURCIsIkRzX0NhcmRfUFNEMiI6Ik4ifQ=",
    "Ds_Signature": "G7OeV3uLn6-mTvSC2N0BeiptvmDCSku9fcogj3-U7f2NMO_h8rybe-VQXl1GCvJnO7k7zIXMv8oGvhRE5nyyZw==
}
{
	"Ds_Order": "1681464659",
	"Ds_MerchantCode": "999008881",
	"Ds_Terminal": "1",
	"Ds_TransactionType": "0",
	"Ds_DCC": {
		"InfoMonedaTarjeta": {
			"monedaDCC": "840",
			"litMonedaDCC": "DOLAR U.S.A.",
			"litMonedaRDCC": "USD",
			"importeDCC": "23.37",
			"cambioDCC": "0.855931",
			"fechaCambioDCC": "2020-06-25",
			"markUp": 0.03
		},
		"InfoMonedaComercio": {
			"monedaCome": "978",
			"litMonedaCome": "EUR",
			"importeCome": "20.00"
		}
	},
	"Ds_EMV3DS": {
		"protocolVersion": "2.1.0",
		"threeDSServerTransID": "bc7a2b60-7b57-4df7-b8a6-5536e3bb4ef6",
		"threeDSInfo": "CardConfiguration"
	},
	"Ds_Excep_SCA": "LWV;TRA[500.0];COR;MIT;ATD",
	"Ds_Card_PSD2": "N"
}

En la respuesta del TPV Virtual encontramos el objeto Ds_DCC. En él se especifica toda la información de la moneda en la que puede pagar la tarjeta, es decir, la que se ofrece como alternativa a la local para el titular. Esta información debes mostrarla obligatoriamente al titular, que deberá seleccionar si desea pagar con la moneda local o con la que se le ofrece. En ningún caso debes elegir por el cliente, ya que sólo el titular puede aceptar el cambio ofrecido.

En el objeto InfoMonedaComercio se especifica la información de la moneda configurada en el TPV Virtual, es decir, la que has enviado originalmente. En el objeto InfoMonedaTarjeta se muestra el cambio ofrecido, cuyos parámetros se especifican a continuación:

  • monedaDCC: Se especifica el código ISO 4217 de la moneda DCC, es decir, en la que opera la tarjeta del titular y la cual se ofrece para pagar con ella.
  • litMonedaDCC: El literal de la moneda que se ofrece, para que puedas mostrarlo en la pantalla de selección de DCC.
  • litMonedaRDCC: El literal pero reducido al código de tres letras.
  • importeDCC: El importe total que pagaría el titular en caso de aceptar el DCC.
  • cambioDCC: El tipo de cambio que se va a aplicar a la transacción.
  • fechaCambioDCC: El día que se fijó ese tipo de cambio. Normalmente los tipos de cambio se fijan una vez cada 24h.
  • markUp: El porcentaje de margen comercial sobre el total que se queda la entidad, incluido ya en la tasa de cambio y el importe final.

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.

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": "eyJEU19NRVJDSEFOVF9PUkRFUiI6IjE2ODE0NjQ2NTkiLCJEU19NRVJDSEFOVF9NRVJDSEFOVENPREUiOiI5OTkwMDg4ODEiLCJEU19NRVJDSEFOVF9URVJNSU5BTCI6IjEiLCJEU19NRVJDSEFOVF9UUkFOU0FDVElPTlRZUEUiOiIwIiwiRFNfTUVSQ0hBTlRfQ1VSUkVOQ1kiOiI5NzgiLCJEU19NRVJDSEFOVF9QQU4iOiI0MTE3NzMxMjM0NTY3ODkxIiwiRFNfTUVSQ0hBTlRfRVhQSVJZREFURSI6IjQ5MTIiLCJEU19NRVJDSEFOVF9BTU9VTlQiOiIyMDAwIiwiRFNfTUVSQ0hBTlRfQ1ZWMiI6IjEyMyIsIkRTX01FUkNIQU5UX0RDQyI6IntcIm1vbmVkYURDQ1wiOlwiODQwXCIsXCJpbXBvcnRlRENDXCI6XCIyMy4zN1wifSIsIkRTX01FUkNIQU5UX0VNVjNEUyI6IntcInRocmVlRFNJbmZvXCI6XCJBdXRoZW50aWNhdGlvbkRhdGFcIixcInByb3RvY29sVmVyc2lvblwiOlwiMi4xLjBcIixcImJyb3dzZXJKYXZhc2NyaXB0RW5hYmxlZFwiOlwidHJ1ZVwiLFwiYnJvd3NlckFjY2VwdEhlYWRlclwiOlwidGV4dFwvaHRtbCxhcHBsaWNhdGlvblwveGh0bWwreG1sLGFwcGxpY2F0aW9uXC94bWw7cT0wLjksKlwvKjtxPTAuOCxhcHBsaWNhdGlvblwvanNvblwiLFwiYnJvd3NlclVzZXJBZ2VudFwiOlwiTW96aWxsYVwvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0XC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWVcLzcxLjAuMzU3OC45OCBTYWZhcmlcLzUzNy4zNlwiLFxyXG5cdFwidGhyZWVEU1NlcnZlclRyYW5zSURcIjpcImJjN2EyYjYwLTdiNTctNGRmNy1iOGE2LTU1MzZlM2JiNGVmNlwiLFwiYnJvd3NlckphdmFFbmFibGVkXCI6XCJmYWxzZVwiLFwiYnJvd3Nlckxhbmd1YWdlXCI6XCJFUy1lc1wiLFwiYnJvd3NlckNvbG9yRGVwdGhcIjpcIjI0XCIsXCJicm93c2VyU2NyZWVuSGVpZ2h0XCI6XCIxMjUwXCIsIFwiYnJvd3NlclNjcmVlbldpZHRoXCI6XCIxMzIwXCIsXCJicm93c2VyVFpcIjpcIjUyXCIsXCJub3RpZmljYXRpb25VUkxcIjpcImh0dHBzOlwvXC9zaXMtZC5yZWRzeXMuZXNcL3Npcy1zaW11bGFkb3Itd2ViXC9TaXNSRVNUQ3JlcUNyZXNfM0RTZWN1cmVWMi5qc3BcIn0ifQ==",
    "Ds_Merchant_Signature": "/n9FwWiElOoeanbQpO97BzWx9v3ZB3VPF2omfMJEpVy+lNzX6cxrBVfaM9pfZHgoFtMcprKw11VlEr5leQOH1g==",
    "Ds_SignatureVersion": "HMAC_SHA512_V1"
}
{
	"DS_MERCHANT_ORDER": "1681464659",
	"DS_MERCHANT_MERCHANTCODE": "999008881",
	"DS_MERCHANT_TERMINAL": "1",
	"DS_MERCHANT_TRANSACTIONTYPE": "0",
	"DS_MERCHANT_CURRENCY": "978",
	"DS_MERCHANT_PAN": "4117731234567891",
	"DS_MERCHANT_EXPIRYDATE": "4912",
	"DS_MERCHANT_AMOUNT": "2000",
	"DS_MERCHANT_CVV2": "123",
	"DS_MERCHANT_DCC": {
		"monedaDCC": "840",
		"importeDCC": "23.37"
	},
	"DS_MERCHANT_EMV3DS": {
		"threeDSInfo": "AuthenticationData",
		"protocolVersion": "2.1.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": "bc7a2b60-7b57-4df7-b8a6-5536e3bb4ef6",
		"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.

  • Ds_Merchant_DCC: Deberás enviar este objeto si el titular acepta el uso de DCC en la transacción. Debes enviar los campos monedaDCC e importeDCC dentro del objeto con los valores que te devolvió el TPV Virtual.

Una vez enviemos estos datos, el SIS nos devolverá una respuesta parecida a la que sigue.

{
    "Ds_SignatureVersion": "HMAC_SHA512_V1",
    "Ds_MerchantParameters": "eyJEc19BbW91bnQiOiIyMDAwIiwiRHNfQ3VycmVuY3kiOiI5NzgiLCJEc19PcmRlciI6IjE2ODE0NjQ2NTkiLCJEc19NZXJjaGFudENvZGUiOiI5OTkwMDg4ODEiLCJEc19UZXJtaW5hbCI6IjEiLCJEc19UcmFuc2FjdGlvblR5cGUiOiIwIiwiRHNfRU1WM0RTIjp7InRocmVlRFNJbmZvIjoiQ2hhbGxlbmdlUmVxdWVzdCIsInByb3RvY29sVmVyc2lvbiI6IjIuMS4wIiwiYWNzVVJMIjoiaHR0cHM6Ly9zaXMtZC5yZWRzeXMuZXMvc2lzLXNpbXVsYWRvci13ZWIvYXV0aGVudGljYXRpb25SZXF1ZXN0LmpzcCIsImNyZXEiOiJleUowYUhKbFpVUlRVMlZ5ZG1WeVZISmhibk5KUkNJNkltSmpOMkV5WWpZd0xUZGlOVGN0TkdSbU55MWlPR0UyTFRVMU16WmxNMkppTkdWbU5pSXNJbUZqYzFSeVlXNXpTVVFpT2lKak1qRXdZbVU1T1MwMFlqY3lMVFJrWm1FdFlqWTBZeTB5TWpRd04ySTVaVGhsTVRRaUxDSnRaWE56WVdkbFZIbHdaU0k2SWtOU1pYRWlMQ0p0WlhOellXZGxWbVZ5YzJsdmJpSTZJakl1TVM0d0lpd2lZMmhoYkd4bGJtZGxWMmx1Wkc5M1UybDZaU0k2SWpBMUluMCJ9fQ==",
    "Ds_Signature": "7DejhuTGP7UGYBCu2mg12r7FKbRpHsQu1aNVICd1lkuQi17kLrghhNHtBJMqKksTGtHYydAQUXM4fvL3vwDJZw=="
}
{
	"Ds_Amount": "2000",
	"Ds_Currency": "978",
	"Ds_Order": "1681464659",
	"Ds_MerchantCode": "999008881",
	"Ds_Terminal": "1",
	"Ds_TransactionType": "0",
	"Ds_EMV3DS": {
		"threeDSInfo": "ChallengeRequest",
		"protocolVersion": "2.1.0",
		"acsURL": "https://sis-d.redsys.es/sis-simulador-web/authenticationRequest.jsp",
		"creq": "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImJjN2EyYjYwLTdiNTctNGRmNy1iOGE2LTU1MzZlM2JiNGVmNiIsImFjc1RyYW5zSUQiOiJjMjEwYmU5OS00YjcyLTRkZmEtYjY0Yy0yMjQwN2I5ZThlMTQiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjA1In0"
	}
}

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_Amount": "2000",
	"Ds_Currency": "978",
	"Ds_Order": "1681464659",
	"Ds_MerchantCode": "999008881",
	"Ds_Terminal": "1",
	"Ds_Response": "0000",
	"Ds_AuthorisationCode": "335049",
	"Ds_TransactionType": "0",
	"Ds_SecurePayment": "2",
	"Ds_Language": "1",
	"Ds_CardNumber": "411773******7891",
	"Ds_MerchantData": "",
	"Ds_Card_Country": "840",
	"Ds_Card_Brand": "1",
	"Ds_ProcessedPayMethod": "78",
	"Ds_Currency_DCC": "840",
	"Ds_Amount_DCC": "2337",
	"Ds_Control_1681465102961": "1681465102961"
}

En este caso puedes analizar el Ds_Response, y comprobar que, si su valor es 0000, la operación ha finalizado correctamente. Se incluirán también los parámetros Ds_Currency_DCC y Ds_Amount_DCC para que puedas almacenar la moneda y el importe cobrado al titular si se usó DCC.

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="eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImJjN2EyYjYwLTdiNTctNGRmNy1iOGE2LTU1MzZlM2JiNGVmNiIsImFjc1RyYW5zSUQiOiJjMjEwYmU5OS00YjcyLTRkZmEtYjY0Yy0yMjQwN2I5ZThlMTQiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjA1In0" />
    <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. Recuerda seguir adjuntando la información DCC enviada en el primer trataPeticion.

{
    "Ds_Merchant_MerchantParameters": "eyJEU19NRVJDSEFOVF9PUkRFUiI6IjE2ODE0NjQ2NTkiLCJEU19NRVJDSEFOVF9NRVJDSEFOVENPREUiOiI5OTkwMDg4ODEiLCJEU19NRVJDSEFOVF9URVJNSU5BTCI6IjEiLCJEU19NRVJDSEFOVF9UUkFOU0FDVElPTlRZUEUiOiIwIiwiRFNfTUVSQ0hBTlRfQ1VSUkVOQ1kiOiI5NzgiLCJEU19NRVJDSEFOVF9QQU4iOiI0MTE3NzMxMjM0NTY3ODkxIiwiRFNfTUVSQ0hBTlRfRVhQSVJZREFURSI6IjQ5MTIiLCJEU19NRVJDSEFOVF9BTU9VTlQiOiIyMDAwIiwiRFNfTUVSQ0hBTlRfQ1ZWMiI6IjEyMyIsIkRTX01FUkNIQU5UX0RDQyI6IntcIm1vbmVkYURDQ1wiOlwiODQwXCIsXCJpbXBvcnRlRENDXCI6XCIyMy4zN1wifSIsIkRTX01FUkNIQU5UX0VNVjNEUyI6IntcInRocmVlRFNJbmZvXCI6XCJDaGFsbGVuZ2VSZXNwb25zZVwiLFwicHJvdG9jb2xWZXJzaW9uXCI6XCIyLjEuMFwiLFxyXG5cdFwiY3Jlc1wiOlwiZXlKMGFISmxaVVJUVTJWeWRtVnlWSEpoYm5OSlJDSTZJbUpqTjJFeVlqWXdMVGRpTlRjdE5HUm1OeTFpT0dFMkxUVTFNelpsTTJKaU5HVm1OaUlzSW1GamMxUnlZVzV6U1VRaU9pSmpNakV3WW1VNU9TMDBZamN5TFRSa1ptRXRZalkwWXkweU1qUXdOMkk1WlRobE1UUWlMQ0p0WlhOellXZGxWSGx3WlNJNklrTlNaWE1pTENKdFpYTnpZV2RsVm1WeWMybHZiaUk2SWpJdU1TNHdJaXdpZEhKaGJuTlRkR0YwZFhNaU9pSlpJbjA9XCJ9In0=",
    "Ds_Merchant_Signature": "5OhJzDdnzhZnPlkbEH70DJRcYGXdeuTvXsT2HZQkObEoyYDlbolURxv1dNMr/zsAutBggvVmBhPfkzDyUYqtgQ==",
    "Ds_SignatureVersion": "HMAC_SHA512_V1"
}
{
	"DS_MERCHANT_ORDER": "1681464659",
	"DS_MERCHANT_MERCHANTCODE": "999008881",
	"DS_MERCHANT_TERMINAL": "1",
	"DS_MERCHANT_TRANSACTIONTYPE": "0",
	"DS_MERCHANT_CURRENCY": "978",
	"DS_MERCHANT_PAN": "4117731234567891",
	"DS_MERCHANT_EXPIRYDATE": "4912",
	"DS_MERCHANT_AMOUNT": "2000",
	"DS_MERCHANT_CVV2": "123",
	"DS_MERCHANT_DCC": {
		"monedaDCC": "840",
		"importeDCC": "23.37"
	},
	"DS_MERCHANT_EMV3DS": {
		"threeDSInfo": "ChallengeResponse",
		"protocolVersion": "2.1.0",
		"cres": "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImJjN2EyYjYwLTdiNTctNGRmNy1iOGE2LTU1MzZlM2JiNGVmNiIsImFjc1RyYW5zSUQiOiJjMjEwYmU5OS00YjcyLTRkZmEtYjY0Yy0yMjQwN2I5ZThlMTQiLCJtZXNzYWdlVHlwZSI6IkNSZXMiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIiwidHJhbnNTdGF0dXMiOiJZIn0="
	}
}

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": "eyJEc19BbW91bnQiOiIyMDAwIiwiRHNfQ3VycmVuY3kiOiI5NzgiLCJEc19PcmRlciI6IjE2ODE0NjQ2NTkiLCJEc19NZXJjaGFudENvZGUiOiI5OTkwMDg4ODEiLCJEc19UZXJtaW5hbCI6IjEiLCJEc19SZXNwb25zZSI6IjAwMDAiLCJEc19BdXRob3Jpc2F0aW9uQ29kZSI6IjMzNTA0OSIsIkRzX1RyYW5zYWN0aW9uVHlwZSI6IjAiLCJEc19TZWN1cmVQYXltZW50IjoiMiIsIkRzX0xhbmd1YWdlIjoiMSIsIkRzX0NhcmROdW1iZXIiOiI0MTE3NzMqKioqKio3ODkxIiwiRHNfTWVyY2hhbnREYXRhIjoiIiwiRHNfQ2FyZF9Db3VudHJ5IjoiODQwIiwiRHNfQ2FyZF9CcmFuZCI6IjEiLCJEc19Qcm9jZXNzZWRQYXlNZXRob2QiOiI3OCIsIkRzX0N1cnJlbmN5X0RDQyI6Ijg0MCIsIkRzX0Ftb3VudF9EQ0MiOiIyMzM3IiwiRHNfQ29udHJvbF8xNjgxNDY1MTAyOTYxIjoiMTY4MTQ2NTEwMjk2MSJ9",
    "Ds_Signature": "5X4Vw3gq58xHFxnRt_WUekMfcWOYHU-Ky29NBPjSuqaQoRvMsbZb909TVEKWCQKxFN9V_ytFuwmkh2s1USlR1w=="
}
{
	"Ds_Amount": "2000",
	"Ds_Currency": "978",
	"Ds_Order": "1681464659",
	"Ds_MerchantCode": "999008881",
	"Ds_Terminal": "1",
	"Ds_Response": "0000",
	"Ds_AuthorisationCode": "335049",
	"Ds_TransactionType": "0",
	"Ds_SecurePayment": "2",
	"Ds_Language": "1",
	"Ds_CardNumber": "411773******7891",
	"Ds_MerchantData": "",
	"Ds_Card_Country": "840",
	"Ds_Card_Brand": "1",
	"Ds_ProcessedPayMethod": "78",
	"Ds_Currency_DCC": "840",
	"Ds_Amount_DCC": "2337",
	"Ds_Control_1681465102961": "1681465102961"
}

En este punto, se habría completado el proceso de autorizació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.

Si se ha utilizado DCC, el TPV Virtual adjuntará los parámetros Ds_Currency_DCC y Ds_Amount_DCC para que puedas almacenar la información de la moneda en la que ha pagado el titular.

Realización de un pago usando una integración inSite

La realización de un pago usando DCC en 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:

EntornoScript 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.

EntornoURL de Conexión
Pruebashttps://sis-t.redsys.es:25443/sis/rest/iniciaPeticionREST
Realhttps://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": "eyJEU19NRVJDSEFOVF9PUkRFUiI6MTY4MTQ2NDY1OSwiRFNfTUVSQ0hBTlRfTUVSQ0hBTlRDT0RFIjoiOTk5MDA4ODgxIiwiRFNfTUVSQ0hBTlRfVEVSTUlOQUwiOiIwMDEiLCJEU19NRVJDSEFOVF9UUkFOU0FDVElPTlRZUEUiOiIwIiwiRFNfTUVSQ0hBTlRfUEFOIjoiNDExNzczMTIzNDU2Nzg5MSIsIkRTX01FUkNIQU5UX0VYUElSWURBVEUiOiI0OTEyIiwiRFNfTUVSQ0hBTlRfQ1ZWMiI6IjEyMyIsIkRTX01FUkNIQU5UX0NVUlJFTkNZIjoiOTc4IiwiRFNfTUVSQ0hBTlRfQU1PVU5UIjoiMjAwMCIsIkRTX01FUkNIQU5UX0RDQyI6IlkiLCJEU19NRVJDSEFOVF9FTVYzRFMiOiJ7XCJ0aHJlZURTSW5mb1wiOlwiQ2FyZERhdGFcIn0iLCJEU19NRVJDSEFOVF9FWENFUF9TQ0EiOiJZIn0=",
    "Ds_Merchant_Signature": "HUki09u4HiNrMlUX216W4LQwL9nxMDDamtAwIJ3Lmt0hgw6CJi1WrGpProNl/MxqXUzrTu5b44Z6K6R+zq6/kQ==",
    "Ds_SignatureVersion": "HMAC_SHA512_V1"
}
{
	"DS_MERCHANT_ORDER": 1681464659,
	"DS_MERCHANT_MERCHANTCODE": "999008881",
	"DS_MERCHANT_TERMINAL": "001",
	"DS_MERCHANT_TRANSACTIONTYPE": "0",
	"DS_MERCHANT_PAN": "4117731234567891",
	"DS_MERCHANT_EXPIRYDATE": "4912",
	"DS_MERCHANT_CVV2": "123",
	"DS_MERCHANT_CURRENCY": "978",
	"DS_MERCHANT_AMOUNT": "2000",
	"DS_MERCHANT_DCC": "Y",
	"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_DCC: Deberás enviar este parámetro con el valor «Y» para solicitar al TPV Virtual que use DCC si es necesario.

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": "eyJEc19PcmRlciI6IjE2ODE0NjQ2NTkiLCJEc19NZXJjaGFudENvZGUiOiI5OTkwMDg4ODEiLCJEc19UZXJtaW5hbCI6IjEiLCJEc19UcmFuc2FjdGlvblR5cGUiOiIwIiwiRHNfRENDIjp7IkluZm9Nb25lZGFUYXJqZXRhIjp7Im1vbmVkYURDQyI6Ijg0MCIsImxpdE1vbmVkYURDQyI6IkRPTEFSIFUuUy5BLiIsImxpdE1vbmVkYVJEQ0MiOiJVU0QiLCJpbXBvcnRlRENDIjoiMjMuMzciLCJjYW1iaW9EQ0MiOiIwLjg1NTkzMSIsImZlY2hhQ2FtYmlvRENDIjoiMjAyMC0wNi0yNSIsIm1hcmtVcCI6MC4wM30sIkluZm9Nb25lZGFDb21lcmNpbyI6eyJtb25lZGFDb21lIjoiOTc4IiwibGl0TW9uZWRhQ29tZSI6IkVVUiIsImltcG9ydGVDb21lIjoiMjAuMDAifX0sIkRzX0VNVjNEUyI6eyJwcm90b2NvbFZlcnNpb24iOiIyLjEuMCIsInRocmVlRFNTZXJ2ZXJUcmFuc0lEIjoiYmM3YTJiNjAtN2I1Ny00ZGY3LWI4YTYtNTUzNmUzYmI0ZWY2IiwidGhyZWVEU0luZm8iOiJDYXJkQ29uZmlndXJhdGlvbiJ9LCJEc19FeGNlcF9TQ0EiOiJMV1Y7VFJBWzUwMC4wXTtDT1I7TUlUO0FURCIsIkRzX0NhcmRfUFNEMiI6Ik4ifQ=",
    "Ds_Signature": "G7OeV3uLn6-mTvSC2N0BeiptvmDCSku9fcogj3-U7f2NMO_h8rybe-VQXl1GCvJnO7k7zIXMv8oGvhRE5nyyZw==
}
{
	"Ds_Order": "1681464659",
	"Ds_MerchantCode": "999008881",
	"Ds_Terminal": "1",
	"Ds_TransactionType": "0",
	"Ds_DCC": {
		"InfoMonedaTarjeta": {
			"monedaDCC": "840",
			"litMonedaDCC": "DOLAR U.S.A.",
			"litMonedaRDCC": "USD",
			"importeDCC": "23.37",
			"cambioDCC": "0.855931",
			"fechaCambioDCC": "2020-06-25",
			"markUp": 0.03
		},
		"InfoMonedaComercio": {
			"monedaCome": "978",
			"litMonedaCome": "EUR",
			"importeCome": "20.00"
		}
	},
	"Ds_EMV3DS": {
		"protocolVersion": "2.1.0",
		"threeDSServerTransID": "bc7a2b60-7b57-4df7-b8a6-5536e3bb4ef6",
		"threeDSInfo": "CardConfiguration"
	},
	"Ds_Excep_SCA": "LWV;TRA[500.0];COR;MIT;ATD",
	"Ds_Card_PSD2": "N"
}

En la respuesta del TPV Virtual encontramos el objeto Ds_DCC. En él se especifica toda la información de la moneda en la que puede pagar la tarjeta, es decir, la que se ofrece como alternativa a la local para el titular. Esta información debes mostrarla obligatoriamente al titular, que deberá seleccionar si desea pagar con la moneda local o con la que se le ofrece. En ningún caso debes elegir por el cliente, ya que sólo el titular puede aceptar el cambio ofrecido.

En el objeto InfoMonedaComercio se especifica la información de la moneda configurada en el TPV Virtual, es decir, la que has enviado originalmente. En el objeto InfoMonedaTarjeta se muestra el cambio ofrecido, cuyos parámetros se especifican a continuación:

  • monedaDCC: Se especifica el código ISO 4217 de la moneda DCC, es decir, en la que opera la tarjeta del titular y la cual se ofrece para pagar con ella.
  • litMonedaDCC: El literal de la moneda que se ofrece, para que puedas mostrarlo en la pantalla de selección de DCC.
  • litMonedaRDCC: El literal pero reducido al código de tres letras.
  • importeDCC: El importe total que pagaría el titular en caso de aceptar el DCC.
  • cambioDCC: El tipo de cambio suministrado por la entidad bancaria o por la marca.
  • fechaCambioDCC: El día que se fijó ese tipo de cambio. Normalmente los tipos de cambio se fijan una vez cada 24h.
  • markUp: El porcentaje de margen comercial sobre el total que se queda la entidad, incluido ya en la tasa de cambio y el importe final.

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.

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": "eyJEU19NRVJDSEFOVF9PUkRFUiI6IjE2ODE0NjQ2NTkiLCJEU19NRVJDSEFOVF9NRVJDSEFOVENPREUiOiI5OTkwMDg4ODEiLCJEU19NRVJDSEFOVF9URVJNSU5BTCI6IjEiLCJEU19NRVJDSEFOVF9UUkFOU0FDVElPTlRZUEUiOiIwIiwiRFNfTUVSQ0hBTlRfQ1VSUkVOQ1kiOiI5NzgiLCJEU19NRVJDSEFOVF9QQU4iOiI0MTE3NzMxMjM0NTY3ODkxIiwiRFNfTUVSQ0hBTlRfRVhQSVJZREFURSI6IjQ5MTIiLCJEU19NRVJDSEFOVF9BTU9VTlQiOiIyMDAwIiwiRFNfTUVSQ0hBTlRfQ1ZWMiI6IjEyMyIsIkRTX01FUkNIQU5UX0RDQyI6IntcIm1vbmVkYURDQ1wiOlwiODQwXCIsXCJpbXBvcnRlRENDXCI6XCIyMy4zN1wifSIsIkRTX01FUkNIQU5UX0VNVjNEUyI6IntcInRocmVlRFNJbmZvXCI6XCJBdXRoZW50aWNhdGlvbkRhdGFcIixcInByb3RvY29sVmVyc2lvblwiOlwiMi4xLjBcIixcImJyb3dzZXJKYXZhc2NyaXB0RW5hYmxlZFwiOlwidHJ1ZVwiLFwiYnJvd3NlckFjY2VwdEhlYWRlclwiOlwidGV4dFwvaHRtbCxhcHBsaWNhdGlvblwveGh0bWwreG1sLGFwcGxpY2F0aW9uXC94bWw7cT0wLjksKlwvKjtxPTAuOCxhcHBsaWNhdGlvblwvanNvblwiLFwiYnJvd3NlclVzZXJBZ2VudFwiOlwiTW96aWxsYVwvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0XC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWVcLzcxLjAuMzU3OC45OCBTYWZhcmlcLzUzNy4zNlwiLFxyXG5cdFwidGhyZWVEU1NlcnZlclRyYW5zSURcIjpcImJjN2EyYjYwLTdiNTctNGRmNy1iOGE2LTU1MzZlM2JiNGVmNlwiLFwiYnJvd3NlckphdmFFbmFibGVkXCI6XCJmYWxzZVwiLFwiYnJvd3Nlckxhbmd1YWdlXCI6XCJFUy1lc1wiLFwiYnJvd3NlckNvbG9yRGVwdGhcIjpcIjI0XCIsXCJicm93c2VyU2NyZWVuSGVpZ2h0XCI6XCIxMjUwXCIsIFwiYnJvd3NlclNjcmVlbldpZHRoXCI6XCIxMzIwXCIsXCJicm93c2VyVFpcIjpcIjUyXCIsXCJub3RpZmljYXRpb25VUkxcIjpcImh0dHBzOlwvXC9zaXMtZC5yZWRzeXMuZXNcL3Npcy1zaW11bGFkb3Itd2ViXC9TaXNSRVNUQ3JlcUNyZXNfM0RTZWN1cmVWMi5qc3BcIn0ifQ==",
    "Ds_Merchant_Signature": "/n9FwWiElOoeanbQpO97BzWx9v3ZB3VPF2omfMJEpVy+lNzX6cxrBVfaM9pfZHgoFtMcprKw11VlEr5leQOH1g==",
    "Ds_SignatureVersion": "HMAC_SHA512_V1"
}
{
	"DS_MERCHANT_ORDER": "1681464659",
	"DS_MERCHANT_MERCHANTCODE": "999008881",
	"DS_MERCHANT_TERMINAL": "1",
	"DS_MERCHANT_TRANSACTIONTYPE": "0",
	"DS_MERCHANT_CURRENCY": "978",
	"DS_MERCHANT_PAN": "4117731234567891",
	"DS_MERCHANT_EXPIRYDATE": "4912",
	"DS_MERCHANT_AMOUNT": "2000",
	"DS_MERCHANT_CVV2": "123",
	"DS_MERCHANT_DCC": {
		"monedaDCC": "840",
		"importeDCC": "23.37"
	},
	"DS_MERCHANT_EMV3DS": {
		"threeDSInfo": "AuthenticationData",
		"protocolVersion": "2.1.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": "bc7a2b60-7b57-4df7-b8a6-5536e3bb4ef6",
		"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.

  • Ds_Merchant_DCC: Deberás enviar este objeto si el titular acepta el uso de DCC en la transacción. Debes enviar los campos monedaDCC e importeDCC dentro del objeto con los valores que te devolvió el TPV Virtual.

Una vez enviemos estos datos, el SIS nos devolverá una respuesta parecida a la que sigue.

{
    "Ds_SignatureVersion": "HMAC_SHA512_V1",
    "Ds_MerchantParameters": "eyJEc19BbW91bnQiOiIyMDAwIiwiRHNfQ3VycmVuY3kiOiI5NzgiLCJEc19PcmRlciI6IjE2ODE0NjQ2NTkiLCJEc19NZXJjaGFudENvZGUiOiI5OTkwMDg4ODEiLCJEc19UZXJtaW5hbCI6IjEiLCJEc19UcmFuc2FjdGlvblR5cGUiOiIwIiwiRHNfRU1WM0RTIjp7InRocmVlRFNJbmZvIjoiQ2hhbGxlbmdlUmVxdWVzdCIsInByb3RvY29sVmVyc2lvbiI6IjIuMS4wIiwiYWNzVVJMIjoiaHR0cHM6Ly9zaXMtZC5yZWRzeXMuZXMvc2lzLXNpbXVsYWRvci13ZWIvYXV0aGVudGljYXRpb25SZXF1ZXN0LmpzcCIsImNyZXEiOiJleUowYUhKbFpVUlRVMlZ5ZG1WeVZISmhibk5KUkNJNkltSmpOMkV5WWpZd0xUZGlOVGN0TkdSbU55MWlPR0UyTFRVMU16WmxNMkppTkdWbU5pSXNJbUZqYzFSeVlXNXpTVVFpT2lKak1qRXdZbVU1T1MwMFlqY3lMVFJrWm1FdFlqWTBZeTB5TWpRd04ySTVaVGhsTVRRaUxDSnRaWE56WVdkbFZIbHdaU0k2SWtOU1pYRWlMQ0p0WlhOellXZGxWbVZ5YzJsdmJpSTZJakl1TVM0d0lpd2lZMmhoYkd4bGJtZGxWMmx1Wkc5M1UybDZaU0k2SWpBMUluMCJ9fQ==",
    "Ds_Signature": "7DejhuTGP7UGYBCu2mg12r7FKbRpHsQu1aNVICd1lkuQi17kLrghhNHtBJMqKksTGtHYydAQUXM4fvL3vwDJZw=="
}
{
	"Ds_Amount": "2000",
	"Ds_Currency": "978",
	"Ds_Order": "1681464659",
	"Ds_MerchantCode": "999008881",
	"Ds_Terminal": "1",
	"Ds_TransactionType": "0",
	"Ds_EMV3DS": {
		"threeDSInfo": "ChallengeRequest",
		"protocolVersion": "2.1.0",
		"acsURL": "https://sis-d.redsys.es/sis-simulador-web/authenticationRequest.jsp",
		"creq": "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImJjN2EyYjYwLTdiNTctNGRmNy1iOGE2LTU1MzZlM2JiNGVmNiIsImFjc1RyYW5zSUQiOiJjMjEwYmU5OS00YjcyLTRkZmEtYjY0Yy0yMjQwN2I5ZThlMTQiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjA1In0"
	}
}

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_Amount": "2000",
	"Ds_Currency": "978",
	"Ds_Order": "1681464659",
	"Ds_MerchantCode": "999008881",
	"Ds_Terminal": "1",
	"Ds_Response": "0000",
	"Ds_AuthorisationCode": "335049",
	"Ds_TransactionType": "0",
	"Ds_SecurePayment": "2",
	"Ds_Language": "1",
	"Ds_CardNumber": "411773******7891",
	"Ds_MerchantData": "",
	"Ds_Card_Country": "840",
	"Ds_Card_Brand": "1",
	"Ds_ProcessedPayMethod": "78",
	"Ds_Currency_DCC": "840",
	"Ds_Amount_DCC": "2337",
	"Ds_Control_1681465102961": "1681465102961"
}

En este caso puedes analizar el Ds_Response, y comprobar que, si su valor es 0000, la operación ha finalizado correctamente. Se incluirán también los parámetros Ds_Currency_DCC y Ds_Amount_DCC para que puedas almacenar la moneda y el importe cobrado al titular si se usó DCC.

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="eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImJjN2EyYjYwLTdiNTctNGRmNy1iOGE2LTU1MzZlM2JiNGVmNiIsImFjc1RyYW5zSUQiOiJjMjEwYmU5OS00YjcyLTRkZmEtYjY0Yy0yMjQwN2I5ZThlMTQiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjA1In0" />
    <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. Recuerda seguir adjuntando la información DCC enviada en el primer trataPeticion.

{
    "Ds_Merchant_MerchantParameters": "eyJEU19NRVJDSEFOVF9PUkRFUiI6IjE2ODE0NjQ2NTkiLCJEU19NRVJDSEFOVF9NRVJDSEFOVENPREUiOiI5OTkwMDg4ODEiLCJEU19NRVJDSEFOVF9URVJNSU5BTCI6IjEiLCJEU19NRVJDSEFOVF9UUkFOU0FDVElPTlRZUEUiOiIwIiwiRFNfTUVSQ0hBTlRfQ1VSUkVOQ1kiOiI5NzgiLCJEU19NRVJDSEFOVF9QQU4iOiI0MTE3NzMxMjM0NTY3ODkxIiwiRFNfTUVSQ0hBTlRfRVhQSVJZREFURSI6IjQ5MTIiLCJEU19NRVJDSEFOVF9BTU9VTlQiOiIyMDAwIiwiRFNfTUVSQ0hBTlRfQ1ZWMiI6IjEyMyIsIkRTX01FUkNIQU5UX0RDQyI6IntcIm1vbmVkYURDQ1wiOlwiODQwXCIsXCJpbXBvcnRlRENDXCI6XCIyMy4zN1wifSIsIkRTX01FUkNIQU5UX0VNVjNEUyI6IntcInRocmVlRFNJbmZvXCI6XCJDaGFsbGVuZ2VSZXNwb25zZVwiLFwicHJvdG9jb2xWZXJzaW9uXCI6XCIyLjEuMFwiLFxyXG5cdFwiY3Jlc1wiOlwiZXlKMGFISmxaVVJUVTJWeWRtVnlWSEpoYm5OSlJDSTZJbUpqTjJFeVlqWXdMVGRpTlRjdE5HUm1OeTFpT0dFMkxUVTFNelpsTTJKaU5HVm1OaUlzSW1GamMxUnlZVzV6U1VRaU9pSmpNakV3WW1VNU9TMDBZamN5TFRSa1ptRXRZalkwWXkweU1qUXdOMkk1WlRobE1UUWlMQ0p0WlhOellXZGxWSGx3WlNJNklrTlNaWE1pTENKdFpYTnpZV2RsVm1WeWMybHZiaUk2SWpJdU1TNHdJaXdpZEhKaGJuTlRkR0YwZFhNaU9pSlpJbjA9XCJ9In0=",
    "Ds_Merchant_Signature": "5OhJzDdnzhZnPlkbEH70DJRcYGXdeuTvXsT2HZQkObEoyYDlbolURxv1dNMr/zsAutBggvVmBhPfkzDyUYqtgQ==",
    "Ds_SignatureVersion": "HMAC_SHA512_V1"
}
{
	"DS_MERCHANT_ORDER": "1681464659",
	"DS_MERCHANT_MERCHANTCODE": "999008881",
	"DS_MERCHANT_TERMINAL": "1",
	"DS_MERCHANT_TRANSACTIONTYPE": "0",
	"DS_MERCHANT_CURRENCY": "978",
	"DS_MERCHANT_PAN": "4117731234567891",
	"DS_MERCHANT_EXPIRYDATE": "4912",
	"DS_MERCHANT_AMOUNT": "2000",
	"DS_MERCHANT_CVV2": "123",
	"DS_MERCHANT_DCC": {
		"monedaDCC": "840",
		"importeDCC": "23.37"
	},
	"DS_MERCHANT_EMV3DS": {
		"threeDSInfo": "ChallengeResponse",
		"protocolVersion": "2.1.0",
		"cres": "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImJjN2EyYjYwLTdiNTctNGRmNy1iOGE2LTU1MzZlM2JiNGVmNiIsImFjc1RyYW5zSUQiOiJjMjEwYmU5OS00YjcyLTRkZmEtYjY0Yy0yMjQwN2I5ZThlMTQiLCJtZXNzYWdlVHlwZSI6IkNSZXMiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIiwidHJhbnNTdGF0dXMiOiJZIn0="
	}
}

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": "eyJEc19BbW91bnQiOiIyMDAwIiwiRHNfQ3VycmVuY3kiOiI5NzgiLCJEc19PcmRlciI6IjE2ODE0NjQ2NTkiLCJEc19NZXJjaGFudENvZGUiOiI5OTkwMDg4ODEiLCJEc19UZXJtaW5hbCI6IjEiLCJEc19SZXNwb25zZSI6IjAwMDAiLCJEc19BdXRob3Jpc2F0aW9uQ29kZSI6IjMzNTA0OSIsIkRzX1RyYW5zYWN0aW9uVHlwZSI6IjAiLCJEc19TZWN1cmVQYXltZW50IjoiMiIsIkRzX0xhbmd1YWdlIjoiMSIsIkRzX0NhcmROdW1iZXIiOiI0MTE3NzMqKioqKio3ODkxIiwiRHNfTWVyY2hhbnREYXRhIjoiIiwiRHNfQ2FyZF9Db3VudHJ5IjoiODQwIiwiRHNfQ2FyZF9CcmFuZCI6IjEiLCJEc19Qcm9jZXNzZWRQYXlNZXRob2QiOiI3OCIsIkRzX0N1cnJlbmN5X0RDQyI6Ijg0MCIsIkRzX0Ftb3VudF9EQ0MiOiIyMzM3IiwiRHNfQ29udHJvbF8xNjgxNDY1MTAyOTYxIjoiMTY4MTQ2NTEwMjk2MSJ9",
    "Ds_Signature": "5X4Vw3gq58xHFxnRt_WUekMfcWOYHU-Ky29NBPjSuqaQoRvMsbZb909TVEKWCQKxFN9V_ytFuwmkh2s1USlR1w=="
}
{
	"Ds_Amount": "2000",
	"Ds_Currency": "978",
	"Ds_Order": "1681464659",
	"Ds_MerchantCode": "999008881",
	"Ds_Terminal": "1",
	"Ds_Response": "0000",
	"Ds_AuthorisationCode": "335049",
	"Ds_TransactionType": "0",
	"Ds_SecurePayment": "2",
	"Ds_Language": "1",
	"Ds_CardNumber": "411773******7891",
	"Ds_MerchantData": "",
	"Ds_Card_Country": "840",
	"Ds_Card_Brand": "1",
	"Ds_ProcessedPayMethod": "78",
	"Ds_Currency_DCC": "840",
	"Ds_Amount_DCC": "2337",
	"Ds_Control_1681465102961": "1681465102961"
}

En este punto, se habría completado el proceso de autorizació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.

Si se ha utilizado DCC, el TPV Virtual adjuntará los parámetros Ds_Currency_DCC y Ds_Amount_DCC para que puedas almacenar la información de la moneda en la que ha pagado el titular.

Devolución cuando se ha usado DCC

En el caso de que se requiera realizar una devolución, tendrás que hacer una operación de devolución tal y como se explica en su página correspondiente. No debes enviar ningún dato adicional, ya que el propio TPV Virtual se encargará de detectar que fue una operación que se realizó utilizando DCC, pero eso sí, debes tener en cuenta que las operaciones que usan DCC, cuando son devueltas, recalculan la tasa de cambio en el momento de la operación. Esto significa que si ha pasado demasiado tiempo o el valor de la moneda fluctúa demasiado por cualquier causa externa, el importe devuelto puede variar, tanto a tu favor, como a favor del titular.

En cualquier caso, la respuesta del TPV Virtual será como la que se especifica en la página de la documentación sobre devoluciones, con la salvedad de que se incluirán también los parámetros Ds_Currency_DCC y Ds_Amount_DCC que informará de cuanto se ha devuelto al titular y en qué moneda.