Skip to main content

Documentación

Pago con FX

Pague a sus empleados en la moneda correcta. | Empresarial

Rapyd facilita que los empleadores paguen a sus empleados en moneda extranjera. El empleador tiene la opción de confirmar la tasa FX antes de que se complete el pago.

Los casos de uso comunes pueden incluir:

  • Una plataforma de trabajos temporales paga a un banco extranjero del trabajador en la moneda que éste prefiera por un proyecto finalizado

  • Su empresa comienza a contratar trabajadores en el extranjero y ofrece pagarles en su moneda local.

Actualización: puede realizar un desembolso con FX con el lado del remitente fijo

En el ejemplo actual, mostramos un desembolso FX con un monto de beneficiario fijo. La API de desembolsos de Rapyd también permite fijar el monto del remitente (débito).

Por ejemplo, el remitente quiere pagar 1000 USD y el beneficiario recibirá la cantidad equivalente de BGN (lev búlgaro), según la tasa FX actual.

Nota: Para completar el desembolso con FX sin necesidad de realizar una segunda llamada a la API, puede configurar confirma_automatically a verdadero.

Su plataforma de trabajos temporales utiliza el Client Portal, que está en USD (dólares estadounidenses). Uno de los trabajadores vive en Bulgaria y necesita que le paguen en BGN (lev búlgaro).

payout-with-fx.jpg
  1. Solicita el desembolso del salario de la cuenta en USD de su billetera a la cuenta bancaria en BGN del empleado con Crear un pago.

  2. Rapyd procesa la solicitud y le envía la tasa de cambio.

  3. Confirma el tipo de cambio con Confirmar el desembolso con FX.

  4. Rapyd procesa el desembolso a la cuenta bancaria de los empleados y le envía una respuesta.

  5. Recibirá la confirmación del desembolso. Cuando el banco confirme la recepción de los fondos, también recibirá un webhook.

Los siguientes diagramas de secuencia de mensajes describen cómo se intercambia la información entre Rapyd, el comercio y el beneficiario.

Crear un desembolso con FX - Confirmación automática

create-payout-with-automatic-confirmation-of-exchange-rate---success.svg

Crear un desembolso con FX - Confirmación manual

create-payout-with-manual-confirmation-of-exchange-rate---success.svg

El siguiente diagrama de estados finitos resume los estados de los desembolsos con FX.

payout.svg

Descripción de los estados

Estado

Descripción

Creado

Se creó el desembolso.

Pendiente

El desembolso se está procesando. Se debe confirmar la tasa FX.

Confirmación

El beneficiario ha recibido los fondos del desembolso.

Completado

El desembolso se ha completado. El beneficiario ha recibido los fondos del desembolso.

Cancelado

Se canceló el desembolso.

Error

El desembolso no se ha creado o el desembolso ha fallado.

Expirado

El desembolso ha caducado.

Prerrequisitos

Para ejecutar los ejemplos de este caso de uso, debe ejecutar las siguientes llamadas a la API:

Nota: Si no es necesaria la confirmación de la tarifa, puede realizar toda la operación de pago automáticamente. Establecer automatic_confirmation a verdadero.

Nota: Puede comprobar la tasa de cambio actual con Obtenga tasa FX.

El administrador de nóminas solicita un desembolso en USD (dólares estadounidenses) para enviar 2000 BGN (lev búlgaro) a la cuenta bancaria del empleado.

Para eso, usar Crear Desembolso con los siguientes parámetros:

Descripción de los parámetros del cuerpo

Parámetro del cuerpo

Descripción

beneficiary

Completar el objeto «beneficiary» con los siguientes detalles:

payment_type - prioridad

address - 456 Calle Segunda

city - Plovdiv

first_name - Prueba

last_name - Empleado

iban - BG80BNBG96611020345678

bic_swift - BUINGSF

beneficiary_country

Introducir BG como el código de país del beneficiario.

beneficiary_entity _type

Introducir individual como el tipo de entidad para el beneficiario.

confirm_automatically

Introducir falso para indicar que se requiere una confirmación manual.

description

Introducir Salario como la descripción.

ewallet

Introducir el «ID» de la billetera que recibió cuando creó la billetera en su sandbox. Para los fines de esta lección de caso de uso, estamos usando ewallet_82dd0417a86aebb564da2f96936ce2d2, que es el ID de la billetera que hemos creado en nuestro sandbox.

payout_amount

Introducir 2000 como la cantidad de moneda a comprar, en unidades del buy_currency.

payout_currency

Introducir BGN como moneda de pago. Un código ISO 4217 de tres letras para la moneda que se va a comprar.

payout_method_type

Introducir bg_general_bank como tipo de método. Usar Listar los tipos de métodos de desembolso y Obtener los campos obligatorios del desembolso.

sender

Complete el objeto «sender» con los siguientes detalles:

first name - Prueba

last_name - Gerente

address - 123 Calle Primera

city - Sofia

date_of_birth - 22/02/1980

sender_country

Introducir BG como el código de país para Bulgaria.

sender_currency

Introducir USD como moneda del remitente.

sender_entity_type

Introducir empresa como tipo de entidad remitente.

Solicita a Rapyd que procese el desembolso del administrador de nóminas de 2000 BGN (lev búlgaro) a la cuenta bancaria del empleado.

Crear solicitud de desembolso
    • Solicitud

      • // Request URL: POST https://sandboxapi.rapyd.net/v1/payouts
        
        // Message body: 
        {
            "beneficiary": {
                "payment_type": "priority",
                "address": "456 Second Street",
                "city": "Plovdiv",
                "first_name": "Test",
                "last_name": "Employee",
                "iban": "DE3376599444263666923298",
                "bic_swift": "BUINBGSF"
            },
            "beneficiary_country": "BG",
            "beneficiary_entity_type": "individual",
            "confirm_automatically": false,
            "description": "Salary",
            "ewallet": "ewallet_82dd0417a86aebb564da2f96936ce2d2",
            "payout_amount": "2000",
            "payout_currency": "BGN",
            "payout_method_type": "bg_general_bank",
            "sender": {
                "first_name": "Test",
                "last_name": "Manager",
                "address": "123 First Street",
                "city": "Sofia",
                "date_of_birth": "22/02/1980"
            },
            "sender_country": "BG",
            "sender_currency": "USD",
            "sender_entity_type": "company"
        }
    • .NET Core

      • using System;
        using System.Text.Json;
        
        namespace RapydApiRequestSample
        {
            class Program
            {
                static void Main(string[] args)
                {
                    try
                    {
                        var requestObj = new
                        {
                            beneficiary = new
                            {
                                payment_type = "priority",
                                address = "456 Second Street",
                                city = "Plovdiv",
                                first_name = "John",
                                last_name = "Doe",
                                iban = "DE3376599444263666923298",
                                bic_swift = "BUINBGSF"
                            },
                            beneficiary_country = "BG",
                            beneficiary_entity_type = "individual",
                            confirm_automatically = false,
                            description = "Salary",
                            ewallet = "ewallet_82dd0417a86aebb564da2f96936ce2d2",
                            payout_amount = "2000",
                            payout_currency = "BGN",
                            payout_method_type = "bg_general_bank",
                            sender = new
                            {
                                first_name = "Jane",
                                last_name = "Doe",
                                address = "123 First Street",
                                city = "Sofia",
                                date_of_birth = "22/02/1980"
                            },
                            sender_country = "BG",
                            sender_currency = "USD",
                            sender_entity_type = "company"
                        };
        
                        string request = JsonSerializer.Serialize(requestObj);
        
                        string result = RapydApiRequestSample.Utilities.MakeRequest("POST", "/v1/payouts", 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 = {
              beneficiary: {
                payment_type: 'priority',
                address: '456 Second Street',
                city: 'Plovdiv',
                first_name: 'John',
                last_name: 'Doe',
                iban: 'DE3376599444263666923298',
                bic_swift: 'BUINBGSF'
              },
              beneficiary_country: 'BG',
              beneficiary_entity_type: 'individual',
              confirm_automatically: false,
              description: 'Salary',
              ewallet: 'ewallet_82dd0417a86aebb564da2f96936ce2d2',
              payout_amount: '2000',
              payout_currency: 'BGN',
              payout_method_type: 'bg_general_bank',
              sender: {
                first_name: 'Jane',
                last_name: 'Doe',
                address: '123 First Street',
                city: 'Sofia',
                date_of_birth: '22/02/1980'
              },
              sender_country: 'BG',
              sender_currency: 'USD',
              sender_entity_type: 'company'
            };
            const result = await makeRequest('POST', '/v1/payouts', 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 = [
            "beneficiary" => array(
                "payment_type" => "priority",
                "address" => "456 Second Street",
                "city" => "Plovdiv",
                "first_name" => "John",
                "last_name" => "Doe",
                "iban" => "DE3376599444263666923298",
                "bic_swift" => "BUINBGSF"
            ),
            "beneficiary_country" => "BG",
            "beneficiary_entity_type" => "individual",
            "confirm_automatically" => false,
            "description" => "Salary",
            "ewallet" => "ewallet_82dd0417a86aebb564da2f96936ce2d2",
            "payout_amount" => "2000",
            "payout_currency" => "BGN",
            "payout_method_type" => "bg_general_bank",
            "sender" => array(
                "first_name" => "Jane",
                "last_name" => "Doe",
                "address" => "123 First Street",
                "city" => "Sofia",
                "date_of_birth" => "22/02/1980"
            ),
            "sender_country" => "BG",
            "sender_currency" => "USD",
            "sender_entity_type" => "company"
        ];
        
        try {
            $object = make_request('post', '/v1/payouts', $body);
            var_dump($object);
        } catch (Exception $e) {
            echo "Error: $e";
        }
        ?>
    • Python

      • from pprint import pprint
        
        from utilities import make_request
        
        beneficiary_fields = {
            "payment_type": "priority",
            "address": "456 Second Street",
            "city": "Plovdiv",
            "first_name": "John",
            "last_name": "Doe",
            "iban": "DE3376599444263666923298",
            "bic_swift": "BUINBGSF"
        }
        
        sender_fields = {
            "first_name": "Jane",
            "last_name": "Doe",
            "address": "123 First Street",
            "city": "Sofia",
            "date_of_birth": "22/02/1980"
        }
        
        payout_body = {
            "beneficiary": beneficiary_fields,
            "beneficiary_country": "BG",
            "beneficiary_entity_type": "individual",
            "confirm_automatically": False,
            "description": "Salary",
            "ewallet": "ewallet_82dd0417a86aebb564da2f96936ce2d2",
            "payout_amount": "2000",
            "payout_currency": "BGN",
            "payout_method_type": "bg_general_bank",
            "sender": sender_fields,
            "sender_country": "BG",
            "sender_currency": "USD",
            "sender_entity_type": "company"
        }
        result = make_request(method='post', path='/v1/payouts', body=payout_body)
        pprint(result)
Crear respuesta de desembolso

Veamos la respuesta.

    • Respuesta

      • {
            "status": {
                "error_code": "",
                "status": "SUCCESS",
                "message": "",
                "response_code": "",
                "operation_id": "77745716-89fc-4313-abbe-162a4d25f12f"
            },
            "data": {
                "id": "payout_56010c333d71789b6110fd36bc5066ca",
                "payout_type": "bank",
                "payout_method_type": "bg_general_bank",
                "amount": 2000,
                "payout_currency": "BGN",
                "sender_amount": 1191.1,
                "sender_currency": "USD",
                "status": "Confirmation",
                "sender_country": "BG",
                "sender": {
                    "last_name": "Manager",
                    "first_name": "Test",
                    "country": "BG",
                    "entity_type": "company",
                    "address": "123 First Street",
                    "name": "Test Manager",
                    "date_of_birth": "22/02/1980",
                    "city": "Sofia",
                    "currency": "USD"
                },
                "beneficiary_country": "BG",
                "beneficiary": {
                    "last_name": "Employee",
                    "first_name": "Test",
                    "country": "BG",
                    "entity_type": "individual",
                    "address": "456 Second Street",
                    "name": "Test Employee",
                    "city": "Plovdiv",
                    "currency": "BGN",
                    "bic_swift": "BUINBGSF",
                    "iban": "DE3376599444263666923298",
                    "payment_type": "priority"
                },
                "fx_rate": 0.59555,
                "instructions": {
                          
        //              ...       
                  
                },
                "ewallets": [
                    {
                        "ewallet_id": "ewallet_82dd0417a86aebb564da2f96936ce2d2",
                        "amount": 1191.1,
                        "percent": 100
                    }
                ],
                "metadata": {},
                "description": "Salary"
                  
        //              ...       
                  
           }
        }

La sección data de esta respuesta muestra:

  • El Id del objeto «payout» es payout_56010c333d71789b6110fd36bc5066ca. Cuando ejecute este ejemplo en su sandbox, obtendrá un ID diferente, que necesitará para un paso posterior en este caso de uso.

  • El fx_rate es 0,59555.

Cuando reciba la respuesta, dispone de poco tiempo para aprobar la tasa de cambio. El tiempo exacto varía de un método de pago a otro.

Confirme la solicitud de desembolso

Para confirmar el desembolso, usar Confirmar el pago con FX con los siguientes parámetros:

Descripción de los parámetros de ruta

Parámetro de ruta

Descripción

Payout ID

Introducir el «ID» del desembolso que recibió cuando creó el desembolso en su sandbox. Para los fines de esta lección de caso de uso, estamos usando payout_56010c333d71789b6110fd36bc5066ca, que es el ID del desembolso que hemos creado en nuestro sandbox.

    • Solicitud

      • // Request URL: POST https://sandboxapi.rapyd.net/v1/payouts/confirm/payout_56010c333d71789b6110fd36bc5066ca
        
        // Message body absent.
    • .NET Core

      • using System;
        
        namespace RapydApiRequestSample
        {
            class Program
            {
                static void Main(string[] args)
                {
                    try
                    {
        
                        string payout = "payout_56010c333d71789b6110fd36bc5066ca";
        
                        string result = RapydApiRequestSample.Utilities.MakeRequest("POST", $"/v1/payouts/confirm/{payout}");
        
                        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 = {};
            const result = await makeRequest(
              'POST',
              '/v1/payouts/confirm/payout_56010c333d71789b6110fd36bc5066ca',
              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);
        
        try {
            $object = make_request('post', '/v1/payouts/confirm/payout_56010c333d71789b6110fd36bc5066ca');
            var_dump($object);
        } catch (Exception $e) {
            echo "Error: $e";
        }
        ?>
    • Python

      • from pprint import pprint
        
        from utilities import make_request
        
        payout = 'payout_56010c333d71789b6110fd36bc5066ca'
        results = make_request(method='post',
                               path=f'/v1/payouts/confirm/{payout}')
        pprint(results)
Confirme la respuesta del desembolso

Veamos la respuesta.

    • Respuesta

      • {
            "status": {
                "error_code": "",
                "status": "SUCCESS",
                "message": "",
                "response_code": "",
                "operation_id": "bb05d0a9-295d-4cad-958c-e20dd8dbe461"
            },
            "data": {
                "id": "payout_89a8df5e8716b9785f4f1de42e453bac",
                "payout_type": "bank",
                "payout_method_type": "bg_general_bank",
                "amount": 2000,
                "payout_currency": "BGN",
                "sender_amount": 1191.1,
                "sender_currency": "USD",
                "status": "Created",
                "sender_country": "BG",
                "sender": {
                    "id": "sender_4bc400c5c08fd6e6d4655d5ddef73e4e",
                    "last_name": "Manager",
                    "first_name": "Test",
                    "country": "BG",
                    "entity_type": "company",
                    "address": "123 First Street",
                    "name": "Test Manager",
                    "date_of_birth": "22/02/1980",
                    "city": "Sofia",
                    "currency": "USD"
                },
                "beneficiary_country": "BG",
                "beneficiary": {
                    "id": "beneficiary_97f8a3c6955967280a11223f7c3114ca",
                    "last_name": "Employee",
                    "first_name": "Test",
                    "country": "BG",
                    "entity_type": "individual",
                    "address": "456 Second Street",
                    "name": "Test Employee",
                    "city": "Plovdiv",
                    "currency": "BGN",
                    "bank_name": "Test Employee",
                    "bic_swift": "BUINBGSF",
                    "iban": "DE3376599444263666923298",
                    "payment_type": "priority"
                },
                "fx_rate": 0.59555,
                "instructions": {
                  
        //              ...       
                  
                   }
                ],
                "ewallets": [
                    {
                        "ewallet_id": "ewallet_82dd0417a86aebb564da2f96936ce2d2",
                        "amount": 1191.1,
                        "percent": 100
                    }
                ],
                "metadata": {},
                "description": "Salary",
                "created_at": 1583676917,
                  
        //              ...       
                  
            }
        }

La sección data de esta respuesta muestra:

  • status - Creado - Esto indica que el proceso de desembolso ha comenzado.

  • amount - La cantidad de dinero que será transferida a la cuenta bancaria del empleado: 2000 BGN.

  • payout_currency - La moneda enviada a la cuenta bancaria del empleado: BGN.

  • sender_currency - La moneda de su cuenta de eWallet: USD.

  • created at - La hora en que se creó el desembolso, en tiempo de Unix.

El objeto ewallets muestra la siguiente información:

  • ewallet_id - El ID de la billetera de su empresa.

  • amount - El monto en USD tomado de su billetera, 1191,10 USD.

Simular la finalización de un desembolso

El sandbox no simula directamente la acción del beneficiario que recibe los fondos del desembolso. Puede simular esta acción con el procedimiento descrito en Completar desembolso. Para ello, necesitará el ID y el monto del desembolso que generó en su sandbox.

Cuando se simula la finalización de un desembolso, Rapyd envía un webhook. Configure su sistema para recibir webhooks siguiendo el procedimiento descrito en Definición de un endpoint de webhook

Después de simular que el banco del empleado finaliza la recepción del salario, Rapyd le envía Webhook: desembolso completado. Para indicar que el pago se completó, el campo status cambia a Completado.

¿Busca información técnica más detallada?

¿Desea ver los métodos y objetos de la API de Rapyd que utilizará? Ver Merchant API Reference para obtener más detalles técnicos.