---
title: "Bank Redirect"
source_url: https://docs.rapyd.net/en/bank-redirect.html
lang: en
---

# Bank Redirect

Rapyd makes it easy for your eCommerce website customers to pay for online purchases directly from a bank account.

Why offer Bank Redirect? The customer may not have a credit card and there are no local [direct debit](https://docs.rapyd.net/en/glossary.md#UUID-945d98cf-adae-e1cf-2606-c7fae8b4a7e1_direct_debit "Direct debit") capabilities. Bank Redirect is a highly preferred push payment method across Asia and LATAM because of security reasons. During checkout your customers are redirected into a bank login flow, and once completed the customer will arrive back at a confirmation page on your site.

The bank transfer process below explains how to:

- Add bank redirect payments to your business workflow.
- Create a bank redirect payment request.
- Capture the payment response.

### Bank Redirect Checkout

The following screenshots represent a Bank Redirect checkout page workflow.

1. Select your bank account.
2. Click **Place Your Order**.

   ![6480837dafae3.png](image/img-ee33b3816163bc3158d83ba5d3862e1c.png)
3. Complete the bank redirect.

   ![6480838068599.png](image/img-dac5d32ec06468d2047b7773bd7855b9.png)
4. Redirect to the **payment success** page.

   ![64808382e7d11.png](image/img-5a4e48e1af247729b579320ae3a3695e.png)
5. Click **Finish**.

### Online Bank Payment Workflow

Finding the specific bank redirect payment methods you'll accept and the corresponding required fields that customers fill out is described under How it Works.

### Step 1: Processing the Payment

![process-payment.jpg](image/img-c6cbed8ea97be7d880a01a63c01feef3.jpg)

1. Customer checks out with an item and confirms a bank redirect payment on your page.
2. Your website back end requests Rapyd to process the customer's payment, specifying the amount, currency, payment method for the customer's bank, and your payment success URL and error URL.
3. Depending on whether the customer completes the payment with the bank successfully, the bank will redirect the customer to your website's success or error URL.
4. Rapyd processes the transaction and responds with a unique bank URL to which you redirect the customer to complete the payment.
5. The URL is valid only for this payment.
6. Your website redirects the customer to the bank's URL.

### Step 2: Completing the Payment

![complete-payment.jpg](image/img-47bbd93d869557be12bde9c62d8d0650.jpg)

1. On the bank website, the customer follows the bank's instructions to complete the payment.
2. If the payment succeeds, the bank redirects the customer to the URL you specified for a successful payment. If the payment fails, the bank redirects the customer to the error URL you specified.
3. Rapyd is notified by the bank that the payment is complete.
4. Your website back end receives confirmation from Rapyd that the payment was completed.

### Bank Redirect Message Sequences

The message sequence diagrams below describe how information is exchanged between Rapyd, the merchant, the merchant's customers, and the bank.

Create a Bank Redirect Payment

![create-payment-by-bank-redirect---production-environment.svg](image/img-16514042bf1461803fb1a92853c9443a.svg)

Create a Bank Redirect Payment - Transaction Failed

![create-payment-by-bank-redirect---transaction-failed.svg](image/img-dd845840602bce600819cc25bf465c4d.svg)

### How a Bank Redirect Works

### Find Available Payment Methods

Decide the bank redirect payment methods you will accept, so your customer can specify their payment methods on your payment page. To do that, use [List Payment Methods by Country](https://docs.rapyd.net/en/list-payment-methods-by-country.md "List Payment Methods by Country") with the following parameters:

> **Note:**
>
> MX (Mexico) and MXN (Mexican Pesos) is used for country and currency in the sample codes below.

Description of Query Parameters

| Query Parameter | Description |
| --- | --- |
| country | Enter **MX** as the country code for Mexico. |
| currency | Enter **MXN** as the currency code for Mexican Pesos. |

### List Payment Methods by Country Request

Request a list of all available payment methods in MXN (Mexican Pesos).

- - Request

    - ```
      // Request URL: GET https://sandboxapi.rapyd.net/v1/payment_methods/country?country=MX&currency=MXN

      // Message body absent
      ```
- - .NET Core

    - ```

      using System;

      namespace RapydApiRequestSample
      {
          class Program
          {
              static void Main(string[] args)
              {
                  try
                  {
                      string country = "MX";
                      string currency = "MXN";

                      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=MX&currency=MXN');

          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=MX&currency=MXN');
          var_dump($object);
      } catch (Exception $e) {
          echo "Error: $e";
      }
      ?>
      ```
- - Python

    - ```
      from pprint import pprint

      from utilities import make_request

      country = 'MX'
      currency = 'MXN'
      results = make_request(method='get',
                             path=f'/v1/payment_methods/country?country={country}&currency={currency}')
      pprint(results)
      ```

### Response

[List Payment Methods by Country](https://docs.rapyd.net/en/list-payment-methods-by-country.md "List Payment Methods by Country") describes the fields in the response.

- - Response

    - ```
      {
          "status": {
              "error_code": "",
              "status": "SUCCESS",
              "message": "",
              "response_code": "",
              "operation_id": "8065d391-d324-41cb-8b36-a7d97bd0ed6c"
          },
          "data": [{
                  "type": "mx_bbva_bank",
                  "name": "online bank payment BBVA mexico",
                  "category": "bank_redirect",
                  "image": "https://iconslib.rapyd.net/checkout/mx_bbva_bank.png",
                  "country": "mx",
                  "payment_flow_type": "redirect_url",
                  "currencies": [
                      "MXN"
                  ],
                  "status": 1,
                  "is_cancelable": false,
                  "payment_options": [],
                  "is_expirable": false,
                  "is_online": false,
                  "minimum_expiration_seconds": null,
                  "maximum_expiration_seconds": null
              }
          ]
      }
         
      ```

The response shows that **mx_bbva_bank** is an acceptable payment method in the **bank_redirect** category.

> **Note:**
>
> A real response lists many payment methods.

### Find Required Fields for the Payment Method

Identify the fields that your customer needs to complete for the payment method. To do that, use [Get Payment Method Required Fields](https://docs.rapyd.net/en/get-payment-method-required-fields.md "Get Payment Method Required Fields") with the following parameter:

Description of Path Parameters

| Path Parameter | Description |
| --- | --- |
| type | Enter **mx_bbva_bank** as the payment method type. |

### Get Payment Method Required Fields Request

Request the set of required fields for a BBVA Bank payment.

- - Request

    - ```
      // Request URL: GET https://sandboxapi.rapyd.net/v1/payment_methods/mx_bbva_bank/required_fields

      // Message body absent
      ```
- - .NET Core

    - ```

      using System;

      namespace RapydApiRequestSample
      {
          class Program
          {
              static void Main(string[] args)
              {
                  try
                  {
                      string type = "mx_bbva_bank";

                      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);
                  }
              }
          }
      }const makeRequest = require('<path-to-your-utility-file>/utilities').makeRequest;

      async function main() {
        try {
          const result = await makeRequest('GET', '/v1/payment_methods/mx_bbva_bank/required_fields');

          console.log(result);
        } catch (error) {
          console.error('Error completing request', error);
        }
      }
      ```
- - JavaScript

    - ```

      const makeRequest = require('<path-to-your-utility-file>/utilities').makeRequest;

      async function main() {
        try {
          const result = await makeRequest('GET', '/v1/payment_methods/mx_bbva_bank/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/mx_bbva_bank/required_fields');
          var_dump($object);
      } catch (Exception $e) {
          echo "Error: $e";
      }
      ?>
      ```
- - Python

    - ```
      from pprint import pprint

      from utilities import make_request

      payment_method = 'mx_bbva_bank'
      results = make_request(method='get',
                             path=f'/v1/payment_methods/{payment_method}/required_fields')
      pprint(results)
      ```

### Get Payment Method Required Fields Response

[Get Payment Method Required Fields](https://docs.rapyd.net/en/get-payment-method-required-fields.md "Get Payment Method Required Fields") describes the fields in the response.

- - Response

    - ```
      {
          "status": {
              "error_code": "",
              "status": "SUCCESS",
              "message": "",
              "response_code": "",
              "operation_id": "d4b9e9e7-0f9e-4a29-81b6-1e02c7d651af"
          },
          "data": {
              "type": "mx_bbva_bank",
              "fields": [],
              "payment_method_options": [],
              "payment_options": [],
              "minimum_expiration_seconds": null,
              "maximum_expiration_seconds": null
          }
      }
         
      ```

The response shows that no fields are required for an **mx_bbva_bank** payment.

> **Note:**
>
> For some payment method types in this category, 'fields' is mandatory and will need to be completed. See sample code below where payment method type is `in_icici_bank`

- - Request

    - ```
      // Request URL: GET https://sandboxapi.rapyd.net/v1/payment_methods/in_icici_bank/required_fields

      // Message body absent
      ```

The sample response is generated below where `fields` is populated with additional information required for processing this payment.

- - Response

    - ```
          "status": {
              "error_code": "",
              "status": "SUCCESS",
              "message": "",
              "response_code": "",
              "operation_id": "bdb942bd-6c91-4a1c-be66-d78d0c2053bd"
          },
          "data": {
              "type": "in_icici_bank",
              "fields": [
                  {
                      "name": "order_id",
                      "type": "string",
                      "regex": "",
                      "description": "",
                      "is_required": false,
                      "is_updatable": false
                  }
              ],
              "payment_method_options": [],
              "payment_options": [
                  {
                      "name": "customer",
                      "type": "customer",
                      "regex": "",
                      "description": "make sure a customer was created with first_name, last_name and email ad phone_number",
                      "is_required": false,
                      "is_updatable": false
                  }
              ],
              "minimum_expiration_seconds": null,
              "maximum_expiration_seconds": null
          }
      }
         
      ```

### Create the Payment

When your customer checks out on your website, use [Create Payment](https://docs.rapyd.net/en/create-payment.md "Create Payment") with the following parameters to get Rapyd to process your customer's bank payment:

Description of Body Parameters

| Body Parameter | Description |
| --- | --- |
| amount | Enter **200** as the payment amount. |
| currency | Enter **MXN** as the currency code. |
| complete_payment_url | Replace the `https://success_example.net` example with your real website URL where you want the bank to redirect the customer if the payment succeeds. |
| error_payment_url | Replace the `https://error_example.net` example with your real website URL where you want the bank to redirect the customer if the payment fails. |
| payment_method | Enter an object with the following field:`type` - **mx_bbva_bank** |

### Create Payment Request

Request Rapyd to process your customer's payment (200 MXN, in this case) as a redirected bank payment.

- - Request

    - ```
      // Request URL: POST https://sandboxapi.rapyd.net/v1/payments

      // Message body:
      {
          "amount": 200,
          "currency": "MXN",
          "complete_payment_url": "https://success_example.net",
          "error_payment_url": "https://error_example.net",
          "payment_method": {
              "type": "mx_bbva_bank"
          }
      }
      ```
- - .NET Core

    - ```

      using System;
      using System.Text.Json;

      namespace RapydApiRequestSample
      {
          class Program
          {
              static void Main(string[] args)
              {
                  try
                  {
                      var requestObj = new
                      {
                          amount = 200,
                          currency = "MXN",
                          complete_payment_url = "https:success_example.net",
                          error_payment_url = "https:error_example.net",
                          payment_method = new
                          {
                              type = "mx_bbva_bank",
                          }
                      };

                      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: 200,
            currency: 'MXN',
            complete_payment_url: 'https://success_example.net',
            error_payment_url: 'https://error_example.net',
            payment_method: {
              type: 'mx_bbva_bank'
            }
          };
          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" => "200",
          "currency" => "MXN",
          "complete_payment_url" => "https://success_example.net",
          "error_payment_url" => "https://error_example.net",
          "payment_method" => [
              "type" => "mx_bbva_bank"
          ]
      ];

      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": 200,
          "currency": "MXN",
          "complete_payment_url": "https://success_example.net",
          "error_payment_url": "https://error_example.net",
          "payment_method": {
              "type": "mx_bbva_bank"
          }
      }

      create_payment_response = make_request(method='post',
                                             path='/v1/payments',
                                             body=payment_body)
      pprint(create_payment_response)
      pprint(results)
      ```

### Create Payment Response

[Create Payment](https://docs.rapyd.net/en/create-payment.md "Create Payment") describes the fields in the response.

- - Response

    - ```
      {
          "status": {
              "error_code": "",
              "status": "SUCCESS",
              "message": "",
              "response_code": "",
              "operation_id": "5b0e3b02-537d-4a5d-b70b-4b6a4fd35335"
          },
          "data": {
              "id": "payment_d562969cbe32f8ff175c98ad99a82d4e",
              "amount": 200,
              "original_amount": 200,
              "is_partial": false,
              "currency_code": "MXN",
              "country_code": "",
              "status": "ACT",

      //      ...      

              "customer_token": "cus_5572507a5df016dcaf1cc1e0febfbe69",
              "payment_method": "other_c8af858b4d7cececb02a8755467c2a21",

      //      ...      
            
              "captured": true,

      //      ...      

              "redirect_url": "https://sandbox.rapyd.net/complete-bank-payment?token=payment_d562969cbe32f8ff175c98ad99a82d4e",
              "complete_payment_url": "https://success_example.net",
              "error_payment_url": "https://error_example.net",

      //      ...      
       
              "created_at": "1549962206",

      //      ...      
              "paid": false,

      //      ...      

              "instructions": [
                  {
                      "name": "instructions",
                      "steps": [
                          {
                              "step1": "You will be redirected to a bank payment page to complete the payment"
                          }
                      ]
                  }
              ],
                
      //      ...      
       
              "payment_method_type_category": "bank_redirect"
          }}

      }
         
      ```

The response shows:

- The payment `id` is  **payment_d562969cbe32f8ff175c98ad99a82d4e**. When you run this example in your own sandbox, you will get a different ID, which you will need for later steps.
- The `amount` is **200** .
- The `currency_code` is  **MXN** (Mexican pesos).
- The `status` (under `data`) is **ACT** (active). This means that the payment process is active but not complete.
- These URLs are included:

  - `redirect_url` - You redirect your customer to this one-time bank website URL to complete the payment.
  - `complete_payment_url` and  `error_payment_url` - Rapyd provides these URLs to the bank to redirect the customer back to your website depending on whether the purchase succeeded.
- Instructions for your customer to complete the payment.

> **Note:**
>
> Your website shows your customer the instructions and redirects her to the bank website to complete the payment.

### Receive Payment Confirmation

After your customer successfully makes a payment:

1. The bank redirects your customer to the URL you provided for a successful payment.
2. The bank informs Rapyd that the payment was completed successfully.
3. Rapyd sends you a webhook with details of the completed transaction. See Webhook below.

> **Note:**
>
> The [sandbox](https://docs.rapyd.net/en/glossary.md#UUID-945d98cf-adae-e1cf-2606-c7fae8b4a7e1_sandbox "Sandbox") does not directly simulate the action of the customer completing an online bank payment on the bank's website. You can simulate this action with the procedure described in [Complete Payment](https://docs.rapyd.net/en/complete-payment-363014.md "Complete Payment"). For this, you will need the payment ID that you generated in your sandbox.
>
> Configure your system to receive webhooks with the procedure described in [Defining a Webhook Endpoint](https://docs.rapyd.net/en/defining-a-webhook-endpoint.md "Defining a Webhook Endpoint").

The webhook [Webhook - Payment Completed](https://docs.rapyd.net/en/payment-completed-webhook.md "Payment Completed Webhook") is generated.

- - Webhook

    - ```

         {
          "id": "wh_267680ccd8fd308b43da58fdd059cd2b",
          "type": "PAYMENT_COMPLETED”,

      ",
          "data": {
              "id": "payment_d562969cbe32f8ff175c98ad99a82d4e",
              "fee": 0,
              "paid": true,
              "order": null,
              "amount": 200,
              "status": "CLO",

      //      ...      

              "captured": true,

      //      ...      

              "created_at": "1549451666",

      //      ...      

              "description": "bank_redirect",

      //      ...      

              "redirect_url": "https://sandbox.rapyd.net/complete-bank-payment?token=payment_d562969cbe32f8ff175c98ad99a82d4e",

      //      ...      

              "currency_code": "MXN",

      //      ...      

              "customer_token": "cus_5572507a5df016dcaf1cc1e0febfbe69",
              "payment_method": "other_6095cc47e6db1390d170a7fe4a5da6f2",

      //      ...      

              "original_amount": 200,

      //      ...      
         
              "error_payment_url": "https://https://error_example.net",
              "payment_method_type": "",
              "complete_payment_url": "https://success_example.net",

      //      ...      

              "payment_method_type_category": "bank_redirect"
          },

      //      ...      

          "created_at": 1549451.726
      }
      ```

The `data` section of the webhook contains the same type of information as the response to the Create Payment request, except that the  `status` now is **CLO** (closed). This shows that the transaction is complete.

> **Note:**
>
> Want to see the Rapyd API methods and objects that you'll use? Visit the [Merchant API Reference](https://docs.rapyd.net/en/merchant-api-reference.md "Merchant API Reference") for more technical details.
