Skip to main content

Documentación

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
authorize-card.jpg
  1. 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.

  2. Su sitio web o aplicación solicita los datos de la tarjeta a Rapyd y los presenta al cliente.

  3. El cliente completa los campos requeridos y luego selecciona Registrar o Pagar.

  4. Su sitio web envía la solicitud a Rapyd para procesar el pago con tarjeta.

  5. 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
secure-complete-auth.jpg
  1. Su sitio web redirige al cliente al sitio de procesamiento 3DS, donde sigue las instrucciones para la transacción de autenticación.

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

  3. Rapyd envía a su sitio web los detalles de la transacción completada, incluido el token de la tarjeta.

  4. 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&currency=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}&currency={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&currency=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&currency=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}&currency={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:

  • nombre

  • número

  • mes_expiración

  • año_expiración

  • cvv

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:

  • tipo - us_debit_visa_card

  • campos - Ingrese un objeto con los siguientes campos:

    • número - 4111111111111111

    • mes_expiración - 10

    • año_expiración - 29

    • cvv - 123

    • nombre - Nombre del titular de la tarjeta

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 https://error.example.net en el ejemplo con la URL real de su sitio web a la que desea que el sitio 3DS redirija al cliente si el pago falla.

complete_payment_url

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

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:

  • monto es 0,00

  • moneda es GBP

  • A 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.

  • capturado es falso - lo que indica que el monto del pago con tarjeta es 0.

  • redireccionar_url es https://redirect.example.net, que es la URL a la que usted redirige a su cliente invitado para completar el proceso de pago.

  • pagado es falso y el estado es 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:

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

  • monto es 0,00

  • código_moneda es GBP

  • El token del cliente y el método de pago son 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.