Pago con Tarjeta con Verificación 3DS
Un emisor de tarjetas puede requerir que un cliente en su sitio de comercio electrónico realice un paso adicional de seguridad: la verificación three-domain secure (3DS).
3DS es un protocolo para verificar la identidad en transacciones con tarjeta no presente.Su cliente es redirigido a un sitio web independiente con instrucciones para completar la verificación 3DS. Cuando la transacción con tarjeta se completa, el sitio web de 3DS redirige al cliente a una URL (que usted proporciona) indicando éxito o fallo, y notifica a Rapyd.Rapyd luego actualiza el backend de su sitio web.
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.
Certificación PCI
Solo los clientes con certificación PCI-DSS pueden manejar información de identificación personal de tarjetas. Este método está disponible para los comercios que han firmado un acuerdo especial con Rapyd.
La siguiente captura de pantalla representa un proceso de pago con tarjeta con SG (Singapur) y SGD (Dólar de Singapur) como país y moneda, según se describe en Encontrar métodos de pago disponibles.
Ingrese los datos de la tarjeta.
Haga clic en Realizar su pedido.

Complete la verificación 3DS.

Redirección a la página de pago exitoso.
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: Proceso de Pago con Tarjeta con Verificación 3DS

El cliente completa el pago con tarjeta en el checkout.
Usted envía a Rapyd la solicitud de pago 3DS con el ID del cliente que comienza con cus_.
Rapyd recibe la solicitud y redirige al cliente a la URL de verificación 3DS.
Usted muestra la URL de 3DS al cliente.
Paso 2: Proceso de Pago con Tarjeta 3DS

El cliente completa la verificación 3DS del pago con tarjeta.
El sitio web de 3DS redirige al cliente a una URL de éxito o error.
Rapyd procesa el pago y envía la respuesta.
Usted muestra la página de compra exitosa.
Los siguientes diagramas de secuencia de mensajes describen cómo se intercambia la información entre Rapyd, el comercio, los clientes del comercio y la red de tarjetas.
Pago con Tarjeta con Verificación 3DS - Éxito
Pago con Tarjeta con Verificación 3DS - Fallo
Comportamiento Especial de Pruebas en Sandbox
Para usar el Sandbox y simular un pago que requiere autenticación 3DS, configure el valor de amount entre 1000,00 y 1999.99.
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.
Verifique qué métodos de pago con tarjeta se aceptan en el país del cliente.Para hacerlo, 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 SG como el código del país. |
moneda | Ingrese SGD 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 SG.
Solicitud
// Request URL: GET https://sandboxapi.rapyd.net/v1/payment_methods/country?country=SG¤cy=SGD // Message body absent
.NET Core
using System; namespace RapydApiRequestSample { class Program { static void Main(string[] args) { try { string result = RapydApiRequestSample.Utilities.MakeRequest("GET", "/v1/payment_methods/country?country=SG¤cy=SGD"); 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=SG¤cy=SGD'); 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=SG¤cy=SGD'); var_dump($object); } catch (Exception $e) { echo "Error: $e"; } ?>
Python
from pprint import pprint from utilities import make_request country = 'SG' currency = 'SGD' 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
List Payment Methods by Country 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": "sg_debit_cup_card", "name": "Union Pay Debit", "category": "card", "image": "https://iconslib.rapyd.net/checkout/sg_debit_cup_card.png", "country": "sg", "payment_flow_type": "card", "currencies": [ "SGD" ], "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 son necesarios 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 sg_debit_cup_card como el tipo de método de pago. |
Solicitud de obtención de los campos requeridos del método de pago
Solicitud para obtener el conjunto de campos requeridos para una tarjeta Visa.
Solicitud
// Request URL: GET https://sandboxapi.rapyd.net/v1/payment_methods/sg_debit_cup_card/required_fields // Message body absent
.NET Core
using System; namespace RapydApiRequestSample { class Program { static void Main(string[] args) { try { string result = RapydApiRequestSample.Utilities.MakeRequest("GET", "/v1/payment_methods/sg_debit_cup_card/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/sg_debit_cup_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/sg_debit_cup_card/required_fields'); var_dump($object); } catch (Exception $e) { echo "Error: $e"; } ?>
Python
from pprint import pprint from utilities import make_request payment_method = 'sg_debit_cup_card' results = make_request(method='get', path=f'/v1/payment_methods/{payment_method}/required_fields') pprint(results)
Respuesta de obtención de los campos requeridos del método de pago
Get Payment Method Required Fields 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”: “sg_debit_cup_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 de débito UnionPay SG, es obligatorio proporcionar los siguientes campos:
nombrenúmeromes_expiraciónaño_expiracióncvv
Asegúrese de que su cliente complete todos estos campos.
En este punto, su cliente debe haber completado lo siguiente:
Haber seleccionado Visa como opción de pago.
Haber completado los campos requeridos para pagar con tarjeta.
Cuando su cliente confirme el pago con tarjeta, solicite a Rapyd que procese el pago.
Para ello, deberá llamar a Crear 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 1.001 como el monto del pago. |
moneda | Ingrese SGD como el código de la moneda. |
captura | Ingrese verdadero como el valor. Esto indica a Rapyd que procese el pago y capture los fondos lo antes posible. |
error_payment_url | Reemplace |
complete_payment_url | Reemplace |
opciones_método_de_pago |
|
Solicitud de creación de pago
Solicite a Rapyd que procese el pago con tarjeta de su cliente por un monto de 1,001 SGD.
Solicitud
// Request URL: POST https://sandboxapi.rapyd.net/v1/payments // Message body: { "amount": 1001, "currency": "SGD", "payment_method": { "type":"sg_debit_cup_card", "fields": { "number": "4111111111111111", "expiration_month": "12", "expiration_year": "29", "cvv": "737", "name":"Cardholder Name", } }, "payment_method_options": { "3d_required": "true" }, "error_payment_url": "https://error.example.net", "complete_payment_url": "https://complete.example.net", "capture": true }
.NET Core
using System; using System.Text.Json; namespace RapydApiRequestSample { class Program { static void Main(string[] args) { try { var requestObj = new { amount = 1001, currency = "SGD", payment_method = new { type = "sg_debit_cup_card", fields = new { number = "4111111111111111", expiration_month = "12", expiration_year = "29", cvv = "737", name = "Cardholder Name" } }, error_payment_url = "https:error.example.net", complete_payment_url = "https:complete.example.net", payment_method_options = new { 3d_required = true }, capture = true }; 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: 1001, currency: 'SGD', payment_method: { type: 'sg_debit_cup_card', fields: { number: '4111111111111111', expiration_month: '12', expiration_year: '29', cvv: '737', name: 'Cardholder Name' } }, error_payment_url: 'https://error.example.net', complete_payment_url: 'https://complete.example.net', "payment_method_options": { "3d_required": true }, capture: true }; 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' => 1001, 'currency' => 'SGD', 'payment_method' => [ 'type' => 'sg_debit_cup_card', 'fields' => [ 'number' => '4111111111111111', 'expiration_month' => '12', 'expiration_year' => '29' 'cvv' => '737', 'name' => 'Cardholder Name' ] ], 'error_payment_url' => urldecode('https://error_example.net'), 'complete_payment_url' => urldecode('https://complete_example.net') 'payment_method_options'=> [ '3d_required => true ], 'capture' => true ]; try { $object = make_request('post', '/v1/payments', $body); var_dump($object); } catch (Exception $e) { echo "Error: $e"; } ?>
Python
const makeRequest = require('<path-to-your-utility-file>/utilities').makeRequest; from pprint import pprint from utilities import make_request payment_body = { 'amount': 1001, 'currency': 'SGD', 'payment_method': { 'type': 'sg_debit_cup_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': true } results = make_request(method='post', path='/v1/payments', body=payment_body) pprint(results)
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": "74d80a88-90a0-44d7-b08f-31f2b2739eef" }, "data": { "id": "payment_2bb5e3d9376663dbecb0086298ffc08c", "amount": 0, "original_amount": 1001, "is_partial": false, "currency_code": "SGD", "country_code": "SG", "status": "ACT", "description": "", "merchant_reference_id": "", "customer_token": "cus_56fe83bb28b1e36a9552d68dfa16e3ff", "payment_method": "card_0540e5a4c9b8a4fc6a85bb6c6731c423", "payment_method_data": { "id": "card_0540e5a4c9b8a4fc6a85bb6c6731c423", "type": "sg_debit_cup_card", "category": "card", "metadata": null, "image": "", "webhook_url": "", "supporting_documentation": "", "next_action": "3d_verification", "name": "Cardholder Name", "last4": "1111", "acs_check": "unchecked", "cvv_check": "unchecked", "bin_details": { "type": null, "brand": null, "level": null, "issuer": null, "country": null, "bin_number": "411111" }, "expiration_year": "29", "expiration_month": "12", "fingerprint_token": "ocfp_2a694038316f52122bbbb3ae926cfda9" }, "auth_code": null, "expiration": 1692306562, "captured": true, "refunded": false, "refunded_amount": 0, "receipt_email": "", "redirect_url": "https://sandboxcheckout.rapyd.net/3ds-payment?token=payment_2bb5e3d9376663dbecb0086298ffc08c", "complete_payment_url": "https://rapyd.net", "error_payment_url": "https://docs.rapyd.net", "receipt_number": "", "flow_type": "", "address": null, "statement_descriptor": "Test Business", "transaction_id": "", "created_at": 1691701762, "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_db4ad4a76278f94c4a83dd9b28b483ed", "ewallets": [ { "ewallet_id": "ewallet_db4ad4a76278f94c4a83dd9b28b483ed", "amount": 1001, "percent": 100, "refunded_amount": 0 } ], "payment_method_options": { "3d_required": true }, "payment_method_type": "sg_debit_cup_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 } }
La sección datos de la respuesta muestra lo siguiente:
montoes 1001monedaes SGDA 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 verdadero - lo que indica que el pago con tarjeta se recaudará lo antes posible.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 manejar 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 de pago completado.
Webhook
{ "id": "wh_7f18c2b90892652fe7ff2cb7d0537732", "type": "PAYMENT_COMPLETED", "data": { "id": "payment_2bb5e3d9376663dbecb0086298ffc08c", // ... "paid": true, // ... "amount": 1001, "status": "CLO", // ... "currency_code": "SGD", // ... "customer_token": "cus_56fe83bb28b1e36a9552d68dfa16e3ff", "payment_method": "card_0540e5a4c9b8a4fc6a85bb6c6731c423", // ... "payment_method_type_category": "card" }, "trigger_operation_id": "", "status": "NEW", "created_at": 1691701778 }
La sección datos del webhook muestra lo siguiente:
pagadoes cierto yestadoes CLO (cerrado), lo que indica que el dinero se ha pagado.cantidades 1.001código_monedaes SGDEl
token_del_clienteymétodo_pagoson los mismos que en la respuesta de creación de pago.