Skip to main content

Documentación

Pago con tarjeta con verificación 3DS

El emisor de una tarjeta puede exigir a un cliente de tu sitio web de comercio electrónico que lleve a cabo un paso de seguridad adicional: la verificación segura de tres dominios (3DS).

3DS es un protocolo para verificar la identidad en transacciones en las que la tarjeta no está presente. Se redirige al cliente a otro sitio web con instrucciones para completar la verificación de la 3DS. Cuando se completa la transacción con la tarjeta, el sitio web de la 3DS redirige al cliente a una URL (que tú proporciones) en la que se indica que se ha realizado correctamente o no, y se lo notifica a Rapyd. A continuación, Rapyd actualiza

Los beneficios comunes incluyen:

  • Un proceso de pago más fácil y rápido se traduce en una mejor experiencia de pago para su cliente.

  • Obligaciones adeudadas a cualquier contracargos se transfieren del comerciante al emisor.

  • Reduce el riesgo de fraude y hace que los pagos sean más seguros.

  • Sin costes adicionales para el paso adicional de la verificación de la 3DS, que proporciona una mayor seguridad para sus transacciones.

Certificación PCI

Solo clientes con PCI-DSS La certificación puede gestionar la información de identificación personal de las tarjetas. Este método está disponible para los comerciantes que hayan firmado un acuerdo especial con Rapyd

La siguiente captura de pantalla representa un pago con tarjeta con SG (Singapur) y SGD (dólar de Singapur) para el país y la moneda, tal y como se describe en Buscar métodos de pago disponibles.

  1. Introduce los detalles de la tarjeta.

  2. Haga clic Haga su pedido.

    64808358d207a.png
  3. Complete la verificación de la 3DS.

    6480835babcf5.png
  4. Redirigir a la pago exitoso página.

Puedes encontrar los métodos de pago con tarjeta específicos que aceptarás y los campos obligatorios correspondientes que los clientes deben rellenar en la sección Cómo funciona.

Paso 1: Pago con tarjeta con proceso de verificación de 3DS
cards-3ds-process.jpg
  1. El cliente completa el pago con tarjeta al finalizar la compra.

  2. Envías a Rapyd la solicitud de pago de la 3DS con el identificador de cliente que empieza por cus_.

  3. Rapyd recibe la solicitud y redirige al cliente a la URL de verificación de la 3DS.

  4. Muestras la URL de la 3DS al cliente.

Paso 2: Pago con tarjeta con el proceso de pago de 3DS
card-3ds-payment-process.jpg
  1. El cliente completa la verificación 3DS del pago con tarjeta.

  2. El sitio web de la 3DS redirige al cliente a una URL correcta o errónea.

  3. Rapyd procesa el pago y envía la respuesta.

  4. Aparece la página de éxito de la compra.

Los siguientes diagramas de secuencia de mensajes describen cómo se intercambia la información entre Rapyd, el comerciante, los clientes del comerciante y la red de tarjetas.

Pago con tarjeta con verificación 3DS: éxito

card-payment-with-3ds-authentication---success.svg

Pago con tarjeta con verificación 3DS: error

payment-with-3ds-verification---verification-failure.svg

Comportamiento de pruebas especiales en Sandbox

Para usar el caja de arena para simular un pago que requiere la autenticación con la 3DS, defina el «importe» 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 existe un mandato reglamentario, como PSD2 lo requiere.

Para obtener más información sobre cómo prevenir transacciones fraudulentas, consulta Rapyd Protect.

Comprueba qué métodos de pago con tarjeta se aceptan en el país del cliente. Para hacerlo, usa Enumere los 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

Entrar SG como código de país.

moneda

Entrar SGD como código de divisa.

Solicitud de lista de métodos de pago por país

Solicita una lista de todos los métodos de pago SG disponibles.

    • Solicitud

      • // Request URL: GET https://sandboxapi.rapyd.net/v1/payment_methods/country?country=SG&currency=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&currency=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&currency=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&currency=SGD');
            var_dump($object);
        } catch (Exception $e) {
            echo "Error: $e";
        }
        ?>
    • Pitón

      • 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}&currency={currency}')
        pprint(results)
                          
Lista de métodos de pago por país Respuesta

List Payment Methods by Country describe los campos de 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
                }
            ]
        }
                          

El datos La sección de la respuesta muestra que una tarjeta Visa es un método de pago aceptable.

Lista de métodos de pago y respuesta

Una respuesta completa de la API muestra muchos métodos de pago.

Tienes que averiguar qué campos tienes que rellenar para el método de pago. Para ello, utilice el Campos obligatorios para obtener el método de pago con el siguiente parámetro:

Descripción de los parámetros de ruta

Parámetro de ruta

Descripción

tipo

Entrar sg_debit_cup_card como tipo de método de pago.

Obtener el método de pago Campos obligatorios Solicitud

Solicite el conjunto de campos obligatorios 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";
        }
        ?>  
    • Pitón

      • 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)
                            
Obtener el método de pago Campos obligatorios Respuesta

Get Payment Method Required Fields describe los campos de 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 SG UnionPay, debes proporcionar:

  • nombre

  • número

  • mes_caducidad

  • año_caducidad

  • cvv

Asegúrese de que su cliente complete estos campos.

En este punto, el cliente debería haber completado lo siguiente:

  • Has seleccionado Visa como opción de pago.

  • Rellene los campos obligatorios para pagar con la tarjeta.

Cuando tu cliente confirme el pago con la tarjeta, pide a Rapyd que procese el pago con tarjeta.

Para eso, llamarás Crear pago con los siguientes parámetros:

Descripción de los parámetros corporales

Parámetro corporal

Descripción

método_pago

Introduzca un objeto con los siguientes campos:

  • tipo - sg_debit_cup_card

  • campos - Introduzca un objeto con los siguientes campos:

    • nombre - nombre del titular de la tarjeta

    • número - 4 1111111

    • mes_caducidad - 12

    • año_caducidad - 29

    • cvv - 737

cantidad

Entrar 1.001 como importe del pago.

moneda

Entrar SGD como código de divisa.

capturar

Entrar verdadero como el valor. Esto le indica a Rapyd que cobrará el pago por ti lo antes posible

error_payment_url

Reemplazar https://error.example.net en el ejemplo con la URL de tu sitio web real a la que quieres que el sitio de la 3DS redirija al cliente en caso de que se produzca un error en el pago.

URL de pago completa

Reemplazar https://complete.example.net en el ejemplo, con la URL de tu sitio web real a la que quieres que el sitio de la 3DS redirija al cliente si el pago se realiza correctamente.

opciones_método_de_pago

«3d_required»: «verdadero»

Crear solicitud de pago

Solicita a Rapyd que procese el pago con tarjeta de tu cliente 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";
        }
        ?>
    • Pitón

      • 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)
                            
Crear respuesta de pago

Crear pago describe los campos de 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
            }
        }
                            

El datos la sección de la respuesta muestra:

  • cantidad es 1001

  • moneda es SGD

  • A tu cliente invitado se le asigna automáticamente un identificador de cliente. Al método de pago se le asigna un identificador de método de pago. Ambos identificadores son únicos para esta transacción.

  • capturado es cierto - el pago con tarjeta se cobrará lo antes posible.

  • redireccionar_url es https://redirect.example.net, que es la URL a la que rediriges a tu cliente invitado para que complete el proceso de pago.

  • pagado es falso y estado es ACTUAR (activo), lo que indica que aún estamos esperando a que tu cliente invitado termine el proceso de la 3DS.

En este punto, has redirigido al cliente a https://redirect.example.net, que es un sitio de verificación de la 3DS. Este sitio puede gestionar la verificación de la 3DS por sí mismo o puede 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 el número de un correo electrónico o un SMS a la página web. Cuando el proceso se completa correctamente, Rapyd te envía un webhook con los detalles de la transacción completada

Vamos a echar un vistazo a Webhook con 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
        }    
              
                        
                          

El datos la sección del webhook muestra:

  • pagado es cierto y estado es CLO (cerrado), lo que indica que el dinero se ha pagado.

  • cantidad es 1.001

  • código_moneda es SGD

  • El customer_token y payment_method son los mismos que en la respuesta de creación de pago.