Tarjeta almacenada con verificación 3DS
Para mejorar la seguridad, 3D Secure requiere que los clientes proporcionen información adicional cuando utilizan una tarjeta almacenada para pagos en línea.
Algunos emisores en Europa y Asia requieren 3D Secure para la verificación de tarjetas. Por este motivo, cuando un cliente utiliza su tarjeta por primera vez en su sitio web y elige almacenar la información de la tarjeta para compras futuras, se le solicita confirmar la transacción mediante 3D Secure. Una vez que el cliente ha verificado su tarjeta y esta se ha almacenado correctamente como un token, no será necesario volver a verificarla para compras futuras.
Los beneficios incluyen:
Un proceso de pago más fácil y rápido da como resultado una mejor experiencia de checkout para su cliente.
Las responsabilidades derivadas de contracargos se transfieren del comercio al emisor.
Reduce el riesgo de fraude y hace que los pagos sean más seguros.
No existen costos adicionales por el paso extra de verificación 3DS que proporciona mayor seguridad para sus transacciones.
En la sección Cómo funciona se describe cómo encontrar los métodos de pago con tarjeta específicos que usted aceptará y los campos obligatorios correspondientes que los clientes deben completar.
Paso 1: Autorizar la tarjeta

Su cliente realiza el proceso de pago con un artículo, accede a la página de pago con una lista de métodos de pago y elige tarjeta.
Su sitio web o aplicación solicita los datos de la tarjeta a Rapyd y los presenta al cliente.
El cliente completa los campos requeridos y luego selecciona Registrar o Pagar.
Su sitio web envía la solicitud a Rapyd para procesar el pago con tarjeta.
Rapyd procesa la solicitud de autorización por $0 y envía una URL de redireccionamiento a un sitio de procesamiento 3DS.
Paso 2: Asegurar y completar la transacción de autorización por $0

Su sitio web redirige al cliente al sitio de procesamiento 3DS, donde sigue las instrucciones para la transacción de autenticación.
El sitio de procesamiento 3DS notifica a Rapyd el resultado de la transacción y redirige al cliente a su página de éxito o fallo.
Rapyd envía a su sitio web los detalles de la transacción completada, incluido el token de la tarjeta.
Su sitio web guarda el token de la tarjeta.
Verifique qué métodos de pago se aceptan en el país del cliente.
Nota: Para fines ilustrativos, en los ejemplos de código se utilizan GB y GBP como país y moneda.
Capa 3DS para tarjetas
La capa 3DS no está disponible en todas las regiones. Se activa automáticamente cuando un mandato regulatorio, como PSD2, lo requiere.
Para obtener más detalles sobre cómo prevenir transacciones fraudulentas, consulte Rapyd Protect.
Para realizar esta verificación, utilice List Payment Methods by Country con los siguientes parámetros:
Descripción de los parámetros de consulta
Parámetro de consulta | Descripción |
|---|---|
country | Ingrese GB como el código del país. |
currency | Ingrese GBP como el código de la moneda. |
Solicitud de listado de métodos de pago por país
Solicitud para obtener una lista de todos los métodos de pago disponibles en GB.
Solicitud
// Request URL: GET https://sandboxapi.rapyd.net/v1/payment_methods/country?country=GB¤cy=GBP // Message body absent
.NET Core
using System; namespace RapydApiRequestSample { class Program { static void Main(string[] args) { try { string country = "GB"; string currency = "GBP"; string result = RapydApiRequestSample.Utilities.MakeRequest("GET", $"/v1/payment_methods/country?country={country}¤cy={currency}"); Console.WriteLine(result); } catch (Exception e) { Console.WriteLine("Error completing request: " + e.Message); } } } }
JavaScript
const makeRequest = require('<path-to-your-utility-file>/utilities').makeRequest; async function main() { try { const result = await makeRequest('GET', '/v1/payment_methods/country?country=GB¤cy=GBP'); console.log(result); } catch (error) { console.error('Error completing request', error); } }
PHP
<?php $path = $_SERVER['DOCUMENT_ROOT']; $path .= "/<path-to-your-utility-file>/utilities.php"; include($path); try { $object = make_request('get', '/v1/payment_methods/country?country=GB¤cy=GBP'); var_dump($object); } catch (Exception $e) { echo "Error: $e"; } ?>
Python
from pprint import pprint from utilities import make_request country = 'GB' currency = 'GBP' results = make_request(method='get', path=f'/v1/payment_methods/country?country={country}¤cy={currency}') pprint(results)
Respuesta de listado de métodos de pago por país
Payment Method Type Object describe los campos incluidos en la respuesta.
Respuesta
{ "status": { "error_code": "", "status": "SUCCESS", "message": "", "response_code": "", "operation_id": "cfa35a73-aa0b-4e7e-839c-4c3b6149edd7" }, "data": [{ "type": "gb_visa_card", "name": "Visa", "category": "card", "image": "https://iconslib.rapyd.net/checkout/gb_visa_card.png", "country": "gb", "payment_flow_type": "card", "currencies": [ "GBP" ], "status": 1, "is_cancelable": false, "payment_options": [{ "name": "customer", "type": "customer", "regex": "", "description": "make sure a customer was created with first_name, last_name and email", "is_required": true, "is_updatable": false } ], "is_expirable": true, "is_online": false, "minimum_expiration_seconds": 600, "maximum_expiration_seconds": 604800 } ] }
La sección data de la respuesta muestra que una tarjeta Visa es un método de pago válido.
Respuesta del listado de métodos de pago
Una respuesta completa de la API muestra múltiples métodos de pago.
Identifique qué campos debe completar para el método de pago.
Para hacerlo, utilice Get Payment Method Required Fields con el siguiente parámetro:
Descripción de los parámetros de ruta
Parámetro de ruta | Descripción |
|---|---|
type | Ingrese gb_visa_card como el tipo de método de pago. |
Solicitud de obtención de los campos requeridos del método de pago
Solicite el conjunto de campos requeridos para una tarjeta Visa.
Solicitud
// Request URL: GET https://sandboxapi.rapyd.net/v1/payment_methods/gb_visa_card/required_fields // Message body absent
NET.Core
using System; namespace RapydApiRequestSample { class Program { static void Main(string[] args) { try { string type = "gb_visa_card"; string result = RapydApiRequestSample.Utilities.MakeRequest("GET", $"/v1/payment_methods/{type}/required_fields"); Console.WriteLine(result); } catch (Exception e) { Console.WriteLine("Error completing request: " + e.Message); } } } }
JavaScript
const makeRequest = require('<path-to-your-utility-file>/utilities').makeRequest; async function main() { try { const result = await makeRequest('GET', '/v1/payment_methods/gb_visa_card/required_fields'); console.log(result); } catch (error) { console.error('Error completing request', error); } }
PHP
<?php $path = $_SERVER['DOCUMENT_ROOT']; $path .= "/<path-to-your-utility-file>/utilities.php"; include($path); try { $object = make_request('get', '/v1/payment_methods/gb_visa_card/required_fields'); var_dump($object); } catch (Exception $e) { echo "Error: $e"; } ?>
Python
from pprint import pprint from utilities import make_request payment_method = 'gb_visa_card' results = make_request(method='get', path=f'/v1/payment_methods/{payment_method}/required_fields') pprint(results)
Respuesta de listado de métodos de pago por país
Payment Method Type Object describe los campos en la respuesta.
Respuesta
{ “status”: { “error_code”: “”, “status”: “SUCCESS”, “message”: “”, “response_code”: “”, “operation_id”: “3b7a2391-6612-478e-b79e-38d7f8d33ff9” }, “data”: { “type”: “gb_visa_card”, “fields”: [ { “name”: “name”, “type”: “string”, “regex”: “”, “is_required”: true, “instructions”: “card holder name” }, { “name”: “number”, “type”: “string”, “regex”: “”, “is_required”: true, “instructions”: “card number” }, { “name”: “expiration_month”, “type”: “string”, “regex”: “”, “is_required”: true, “instructions”: “expiration month as string, 01-12" }, { “name”: “expiration_year”, “type”: “string”, “regex”: “”, “is_required”: true, “instructions”: “expiration year in to digits as string, 18-99” }, { “name”: “cvv”, “type”: “string”, “regex”: “”, “is_required”: true, “instructions”: “card cvv” } ], “payment_method_options”: [ { “name”: “3d_required”, “type”: “string”, “regex”: “”, “description”: “”, “is_required”: false, “is_updatable”: false } ], “payment_options”: [ { “name”: “description”, “type”: “string”, “regex”: “”, “description”: “the description field must be filled in.“, “is_required”: true, “is_updatable”: false }, { “name”: “complete_payment_url”, “type”: “string”, “regex”: “”, “description”: “the complete_payment_url field must be filled in.“, “is_required”: true, “is_updatable”: false }, { “name”: “error_payment_url”, “type”: “string”, “regex”: “”, “description”: “the error_payment_url field must be filled in.“, “is_required”: true, “is_updatable”: false } ], “minimum_expiration_seconds”: 600, “maximum_expiration_seconds”: 604800 } }
La respuesta muestra que, para una tarjeta Visa de GB, es obligatorio proporcionar los siguientes campos:
namenumberexpiration_monthexpiration_yearcvv
Asegúrese de que su cliente complete todos estos campos.
En esta etapa, su cliente debe haber completado lo siguiente:
Haber seleccionado Visa como opción de pago.
Haber completado los campos requeridos para pagar con tarjeta.
Comportamiento especial de pruebas en Sandbox
Para utilizar el Sandbox y simular un pago que requiere autenticación 3DS, configure el valor de amount entre 1000,00 y 1999.99.
Cuando su cliente confirme el pago con tarjeta, debe asegurarse de que Rapyd verifique la tarjeta llamando a Create Payment con los siguientes parámetros:
Descripción de los parámetros del cuerpo
Parámetro del cuerpo | Descripción |
|---|---|
payment_method | Ingrese un objeto con los siguientes campos:
|
amount | Ingrese 0.00 como el monto del pago. |
currency | Ingrese GBP como el código de la moneda. |
capture | Ingrese false como el valor, ya que el monto es 0. Esto indica a Rapyd que no recaude el pago en este momento. |
error_payment_url | Reemplace |
complete_payment_url | Reemplace |
Solicitud de creación de pago
Usted solicita a Rapyd que verifique la tarjeta de su cliente.
Solicitud
// Request URL: POST https://sandboxapi.rapyd.net/v1/payments // Message body: { "amount": 0.00, "currency": "GBP", "payment_method": { "type":"gb_visa_card", "fields": { "number": "4111111111111111", "expiration_month": "10", "expiration_year": "29", "cvv": "123", "name":"Cardholder Name" } }, "error_payment_url": "https://error.example.net", "complete_payment_url": "https://complete.example.net", "capture": false }
.NET.Core
using System; using System.Text.Json; namespace RapydApiRequestSample { class Program { static void Main(string[] args) { try { var requestObj = new { amount = 0.00, currency = "GBP", payment_method = new { type = "gb_visa_card", fields = new { number = "4111111111111111", expiration_month = "10", expiration_year = "29", cvv = "123", name ="Cardholder Name" } }, error_payment_url = "https:error.example.net", complete_payment_url = "https:complete.example.net", capture = false }; string request = JsonSerializer.Serialize(requestObj); string result = RapydApiRequestSample.Utilities.MakeRequest("POST", "/v1/payments", request); Console.WriteLine(result); } catch (Exception e) { Console.WriteLine("Error completing request: " + e.Message); } } } }
JavaScript
const makeRequest = require('<path-to-your-utility-file>/utilities').makeRequest; async function main() { try { const body = { amount: 0.00, currency: 'GBP', payment_method: { type: 'gb_visa_card', fields: { number: '4111111111111111', expiration_month: '10', expiration_year: '29', cvv: '123' name" 'Cardholder Name' } }, error_payment_url: 'https://error.example.net', complete_payment_url: 'https://complete.example.net', capture: false }; const result = await makeRequest('POST', '/v1/payments', body); console.log(result); } catch (error) { console.error('Error completing request', error); } }
PHP
<?php $path = $_SERVER['DOCUMENT_ROOT']; $path .= "/<path-to-your-utility-file>/utilities.php"; include($path); $body = [ 'amount' => 0.00, 'currency' => 'GBP', 'payment_method' => [ 'type' => 'gb_visa_card', 'fields' => [ 'number' => '4111111111111111', 'expiration_month' => '10', 'expiration_year' => '29' 'cvv' => '123', 'name' => 'Cardholder Name' ] ], 'error_payment_url' => urldecode('https://error_example.net'), 'complete_payment_url' => urldecode('https://complete_example.net') 'payment_method_options'=> [ '3d_required => ], 'capture' => false, '' ]; try { $object = make_request('post', '/v1/payments', $body); var_dump($object); } catch (Exception $e) { echo "Error: $e"; } ?>
Python
from pprint import pprint from utilities import make_request payment_body = { 'amount': 0.00, 'currency': 'GBP', 'payment_method': { 'type': 'gb_visa_card', 'fields': { 'number': '4111111111111111', 'expiration_month': '10', 'expiration_year': '29', 'cvv': '123', 'name': 'Cardholder Name' } }, 'error_payment_url': 'https://error_example.net', 'complete_payment_url': 'https://complete_example.net', 'payment_method_options': { '3d_required': true }, 'capture': false } results = make_request(method='post', path='/v1/payments', body=payment_body) pprint(results)
Respuesta de creación de pago
Echemos un vistazo a la respuesta. Payment Object describe los campos incluidos en la respuesta.
Respuesta
{ "status": { "error_code": "", "status": "SUCCESS", "message": "", "response_code": "", "operation_id": "5dd15363-e0a2-48b5-878e-30296b50a6b2" }, "data": { "id": "payment_b151373c6124a05dbf8614be3948e297", "amount": 0, "original_amount": 0.00, "is_partial": false, "currency_code": "GBP", "country_code": "gb", "status": "ACT", "description": "test2", "merchant_reference_id": "", "customer_token": "cus_57153838f4eb9052e87649a462aedd6e", "payment_method": "card_f372e6e5a780424104ac850cffeab03e", "expiration": 1600169279, "captured": false, "refunded": false, "refunded_amount": 0, "receipt_email": "", "redirect_url": "https://redirect.example.net/, "complete_payment_url": "http://www.rapyd.net", "error_payment_url": "http://www.rapyd.net/error.html", "receipt_number": "", "flow_type": "", "address": null, "statement_descriptor": "rapyd 3ds testing", "transaction_id": "", "created_at": 1599564479, "metadata": {}, "failure_code": "", "failure_message": "", "paid": false, "paid_at": 0, "dispute": null, "refunds": null, "order": null, "outcome": null, "visual_codes": {}, "textual_codes": {}, "instructions": {}, "ewallet_id": "ewallet_f7d6a6bfade1cabb06f3e264d8f1899b", "ewallets": [ { "ewallet_id": "ewallet_f7d6a6bfade1cabb06f3e264d8f1899b", "amount": 0.00, "percent": 100, "refunded_amount": 0 } ], "payment_method_options": { "3d_required": true }, "payment_method_type": "gb_visa_card", "payment_method_type_category": "card", "fx_rate": "", "merchant_requested_currency": null, "merchant_requested_amount": null, "fixed_side": "", "payment_fees": null, "invoice": "", "escrow": null, "group_payment": "", "initiation_type": "customer_present" } }
La sección data de la respuesta muestra lo siguiente:
amountes 0.00currencyes GBPA su cliente se le asigna automáticamente un ID de cliente. Al método de pago se le asigna un ID de método de pago. Ambos identificadores son únicos para esta transacción.
capturedes false - lo que indica que el monto del pago con tarjeta es 0.redirect_urleshttps://redirect.example.net, que es la URL a la que usted redirige a su cliente para completar el proceso de pago.paides false y elstatuses ACT (activo), lo que indica que aún se está esperando a que el cliente invitado finalice el proceso 3DS.
En este punto, usted ha redirigido al cliente a https://redirect.example.net, que es un sitio de verificación 3DS. Este sitio puede gestionar la verificación 3DS por sí mismo o redirigir al cliente al sitio web de su propia tarjeta.
El cliente sigue las instrucciones de autenticación que aparecen en la pantalla, lo que puede implicar copiar un número desde un correo electrónico o un SMS e ingresarlo en la página web.
Cuando el proceso se completa correctamente, Rapyd le envía un webhook con los detalles de la transacción completada.
Vamos a echar un vistazo a Webhook - Payment Completed.
Webhook
{ "id": "wh_7f18c2b90892652fe7ff2cb7d0537732", "type": "PAYMENT_COMPLETED", "data": { "id": "payment_b151373c6124a05dbf8614be3948e297", // ... "paid": true, // ... "amount": 0.00, "status": "CLO", // ... "currency_code": "GBP", // ... "customer_token": "cus_57153838f4eb9052e87649a462aedd6e", "payment_method": "card_f372e6e5a780424104ac850cffeab03e", // ... "payment_method_type_category": "card" }, "trigger_operation_id": "", "status": "NEW", "created_at": 1551173303 }
La sección data del webhook muestra lo siguiente:
paides true ystatuses CLO (cerrado),lo que indica que el dinero ha sido pagado.amountes 0,00currency_codees GBPEl
customer_tokeny elpayment_methodson los mismos que en la respuesta de creación del pago.
Solicitud
JSON
https://sandboxapi.rapyd.net/v1/customers/cus_57153838f4eb9052e87649a462aedd6e { “default_payment_method”: "card_f372e6e5a780424104ac850cffeab03e" }
Respuesta
Respuesta
{ “status”: { “error_code”: “”, “status”: “SUCCESS”, “message”: “”, “response_code”: “”, “operation_id”: “e3fb342e-9562-42ed-9bf6-056a2609270c” }, “data”: { “id”: “cus_57153838f4eb9052e87649a462aedd6e”, “delinquent”: false, “discount”: null, “name”: “payment_2e7e75edbde869e04aa12155c0be13be”, “default_payment_method”: “card_f372e6e5a780424104ac850cffeab03e”, “description”: “”, “email”: “”, “phone_number”: “”, “invoice_prefix”: “”, “addresses”: [], “payment_methods”: { “data”: [ { “id”: “card_f372e6e5a780424104ac850cffeab03e”, “type”: “gb_credit_visa_card”, “category”: “card”, “metadata”: null, “image”: “https://iconslib.rapyd.net/checkout/sg_credit_visa_card.png”, “name”: “testing”, “last4”: “4977", “cvv_check”: “unchecked”, “bin_details”: { “brand”: null }, “expiration_year”: “24", “expiration_month”: “12", “fingerprint_token”: “” } ], “has_more”: false, “total_count”: 1, “url”: “/v1/customers/cus_abb5c09d9c5bf8c0c8cb00b14ec5c892/payment_methods” }, “subscriptions”: null, “created_at”: 1594894949, “metadata”: {}, “business_vat_id”: “”, “ewallet”: “” } }
Cuando su cliente paga con su tarjeta almacenada, usted envía el pago a Rapyd para su procesamiento.
Para enviar el pago del cliente, utilice Crear pago con los siguientes parámetros:
Descripción de los parámetros del cuerpo
Parámetro del cuerpo | Descripción |
|---|---|
amount | Ingrese 9,99 como el monto del pago. |
currency | Ingrese GBP como el código de la moneda. |
customer | Ingrese el 'customer_id' que recibió en la respuesta de creación de pago (por ejemplo, "customer_token": "cus_57153838f4eb9052e87649a462aedd6e") |
Solicitud de creación de pago
Solicite a Rapyd que procese el pago de su cliente por 9.99 GBP (libras esterlinas), tal como se muestra en el siguiente código de ejemplo.
Solicitud
// Request URL: POST https://sandboxapi.rapyd.net/v1/payments // Message body: { "amount": 9.99, "currency": "GBP", "customer": "cus_8ded332b08966abf51bdc28c106acb7c" }
Respuesta de creación de pago
Create Payment describe los campos incluidos en la respuesta.
Respuesta
{ "status": { "error_code": "", "status": "SUCCESS", "message": "", "response_code": "", "operation_id": "4e44e8c1-ee8c-411a-a2de-a2a2ae0122d3" }, "data": { "id": "payment_7b4cb9456f1ff73132831fc2e35d88be", "amount": 9.99, "original_amount": 9.99, "is_partial": false, "currency_code": "GBP", "country_code": "GB", "status": "CLO", // ... "customer_token": "cus_57153838f4eb9052e87649a462aedd6e", "payment_method": "card_f372e6e5a780424104ac850cffeab03e", "expiration": 0, "captured": true, // ... "created_at": 1581248060, // ... "paid": true, "paid_at": 1581248060, // ... "payment_method_type": "gb_visa_card", "payment_method_type_category": "card", // ... } }
La respuesta (en el código de ejemplo anterior) muestra que Rapyd procesó correctamente el pago según el monto, la moneda y el ID del cliente. Se pagó un monto de 9,99 GBP desde la tarjeta del cliente.
Siempre recibirá una respuesta similar. La única diferencia será la fecha, el ID del pago y el monto, en caso de que no sea idéntico.
Puede verificar que el pago fue exitoso, ya que el estado (dentro de data) es CLO (cerrado). Create Payment enumera los valores posibles para el estado.
En este punto, puede informar al cliente que la compra se ha completado.
Consulta de nombre de cuenta
Añada el objeto full_name a la solicitud para realizar una consulta de nombre de cuenta (ANI). Los campos del objeto incluyen: first_name, middle_name, y last_name. El esquema de la tarjeta hace coincidir los detalles del titular de la tarjeta con la información bancaria del titular de la tarjeta. El ANI se utiliza para la gestión del fraude. Consulte Create Payment o Add Payment Method to Customer para obtener detalles adicionales.
Crear solicitud de pago
Solicitud
// Request URL: POST https://sandboxapi.rapyd.net/v1/payments // Message body: { "amount": 0, "currency": "GBP", "capture": false, "save_payment_method": true, "customer": { "name": "John", "email": "johndoe@rapyd.net" }, "payment_method": { "type": "gb_visa_card", "full_name": { "first_name": "John", "middle_name": "Johnson", "last_name": "Doe" }, "fields": { "number": "4111111111111111", "expiration_month": "02", "expiration_year": "27", "name": "John Doe", "cvv": "345" } } }
Crear respuesta de pago
Respuesta
{ "status": { "error_code": "", "status": "SUCCESS", "message": "", "response_code": "", "operation_id": "f3097094-df3f-4f19-a19c-d07156ec40de" }, "data": { "id": "payment_5a32b5989155ba3b75454edba4f52401", "amount": 0, "original_amount": 0, "is_partial": false, "currency_code": "GBP", "country_code": "GB", "status": "ACT", "description": "", "merchant_reference_id": "", "customer_token": "cus_c14579755a7f069a7a8ffa7245aa17cf", "payment_method": null, "payment_method_data": { "id": null, "type": "gb_visa_card", "category": "card", "metadata": null, "image": "", "webhook_url": "", "supporting_documentation": "", "next_action": "3d_verification", "full_name": { "first_name": "John", "middle_name": "Johnson", "last_name": "Doe" }, "account_name_inquiry": { "account_name_inquiry_result": "not_performed", "account_name_inquiry_details": { "last_name": null, "first_name": null, "middle_name": null } }, "name": "John Doe", "last4": "1111", "acs_check": "unchecked", "cvv_check": "unchecked", "bin_details": { "type": "DEBIT", "brand": "VISA", "level": "CLASSIC", "issuer": "CONOTOXIA SP. Z O.O", "country": "PL", "bin_number": "411111" }, "expiration_year": "27", "expiration_month": "02", "fingerprint_token": "ocfp_e599f990674473ce6283b245e9ad2467", "payment_account_reference": "V00173Z6DA132UM78105DND4YLZMU", "network_reference_id": "828761" }, "auth_code": null, "expiration": 1761572794, "captured": false, "refunded": false, "refunded_amount": 0, "receipt_email": "", "redirect_url": "https://sandboxcheckout.rapyd.net/3ds-payment?token=payment_5a32b5989155ba3b75454edba4f52401", "complete_payment_url": "", "error_payment_url": "", "receipt_number": "", "flow_type": "", "address": null, "statement_descriptor": "Doc Team", "transaction_id": "", "created_at": 1760967994, "metadata": {}, "failure_code": "", "failure_message": "", "paid": false, "paid_at": 0, "dispute": null, "refunds": null, "order": null, "outcome": null, "visual_codes": {}, "textual_codes": {}, "instructions": [], "ewallet_id": null, "ewallets": [], "payment_method_options": {}, "payment_method_type": "gb_visa_card", "payment_method_type_category": "card", "fx_rate": 1, "merchant_requested_currency": null, "merchant_requested_amount": null, "fixed_side": "", "payment_fees": null, "invoice": "", "escrow": null, "group_payment": "", "cancel_reason": null, "initiation_type": "customer_present", "mid": "", "next_action": "3d_verification", "error_code": "", "remitter_information": {}, "save_payment_method": true, "merchant_advice_code": null, "merchant_advice_message": null, "authentication_result": { "eci": null, "result": "R", "version": "2.2.0", "cardholder_info": null }, "transaction_link_id": null } }