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 comunes 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.
La forma de encontrar los métodos específicos de pago con tarjeta que aceptará y los campos requeridos correspondientes que los clientes deben completar se describe en Cómo funciona.
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 Listar métodos de pago por país con los siguientes parámetros:
Descripción de los parámetros de consulta
Parámetro de consulta | Descripción |
|---|---|
país | Ingrese GB como el código del país. |
moneda | 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
El Objeto de tipo de método de pago 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 datos de la respuesta muestra que una tarjeta Visa es un método de pago aceptable.
Respuesta del listado de métodos de pago
Una respuesta completa de la API enumera múltiples métodos de pago.
Debe identificar qué campos debe completar para el método de pago.
Para hacerlo, utilice Obtener campos requeridos del método de pago con el siguiente parámetro:
Descripción de los parámetros de ruta
Parámetro de ruta | Descripción |
|---|---|
tipo | 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
Debe solicitar 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
El Objeto de tipo de método de pago describe los campos incluidos 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 GB, es obligatorio proporcionar los siguientes campos:
nombrenúmeromes_expiraciónaño_expiracióncvv
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 Crea un pago con los siguientes parámetros:
Descripción de los parámetros del cuerpo
Parámetro del cuerpo | Descripción |
|---|---|
método_pago | Ingrese un objeto con los siguientes campos:
|
monto | Ingrese 0.00 como el monto del pago. |
moneda | Ingrese GBP como el código de la moneda. |
captura | Ingrese falso 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. El Objeto de pago 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 datos de la respuesta muestra lo siguiente:
montoes 0,00monedaes GBPA su cliente invitado 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.
capturadoes falso - lo que indica que el monto del pago con tarjeta es 0.redireccionar_urleshttps://redirect.example.net, que es la URL a la que usted redirige a su cliente invitado para completar el proceso de pago.pagadoes falso y elestadoes 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 - pago completado.
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 datos del webhook muestra lo siguiente:
pagadoes cierto yestadoes CLO (cerrado),lo que indica que el dinero ha sido pagado.montoes 0,00código_monedaes GBPEl
token del clientey elmétodo de pagoson 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 |
|---|---|
monto | Ingrese 9,99 como el monto del pago. |
moneda | Ingrese GBP como el código de la moneda. |
cliente | 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
Crear pago 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). Crear pago enumera los valores posibles para el estado.
En este punto, puede informar al cliente que la compra se ha completado.