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 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.
The following screenshots represent a Bank Redirect checkout page workflow.
Select your bank account.
Click Place Your Order.
Complete the bank redirect.
Redirect to the payment success page.
Click Finish.
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.
Customer checks out with an item and confirms a bank redirect payment on your page.
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.
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.
Rapyd processes the transaction and responds with a unique bank URL to which you redirect the customer to complete the payment.
The URL is valid only for this payment.
Your website redirects the customer to the bank's URL.
On the bank website, the customer follows the bank's instructions to complete the payment.
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.
Rapyd is notified by the bank that the payment is complete.
Your website back end receives confirmation from Rapyd that the payment was completed.
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 a Bank Redirect Payment - Transaction Failed
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 with the following parameters:
Country and Currency Examples
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¤cy=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}¤cy={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¤cy=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¤cy=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}¤cy={currency}') pprint(results)
Response
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.
List Payment Methods Response
A real response lists many payment methods.
Identify the fields that your customer needs to complete for the payment method. To do that, use 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 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.
Payment Method Type
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 } }
When your customer checks out on your website, use 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 |
error_payment_url | Replace the |
payment_method | Enter an object with the following field: |
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 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
(underdata
) 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
anderror_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.
Bank Redirect URL
Your website shows your customer the instructions and redirects her to the bank website to complete the payment.
After your customer successfully makes a payment:
The bank redirects your customer to the URL you provided for a successful payment.
The bank informs Rapyd that the payment was completed successfully.
Rapyd sends you a webhook with details of the completed transaction. See Webhook below.
Simulating an Online Bank Payment
The 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. 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.
The webhook Webhook - Payment Completed 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.
Looking for More In-Depth Technical Information?
Want to see the Rapyd API methods and objects that you'll use? Visit the API Reference for more technical details.