Introduction
This document contains the API definition to be used by Radixx and Sky for their Sky integration.
Credit card payments (Web)
Openpay supports credit card payments using either Transbank or Global Collect as payment provider. This requires the use of the Openpay.js library to allow the customer to enter their card information in the website and send it directly to Openpay.
The flow for this integration is the following:
- The customer chooses to pay using their credit card.
- The customer enters their card information in a form, which is sent directly to Openpay using the Openpay javascript library.
- The library returns a Token which should be sent to the Ezy website. This token represents the card stored in Openpay, and is a single use token.
- Optionally, the customer is given the choice to pay in installments, if the charge allows it. For now, this is to be allowed only for payments in Chilean peso. (CLP)
- Once the customer confirms their transaction, they send the information to the Ezy website.
- Ezy then requests a transaction to Openpay, using the token returned by the library.
- Openpay returns the result of the transaction.
Creating a new Token
You can see how to use the Openpay Javascript library to create tokens here.
Note that for Ezy and Radixx the credit card’s billing address is required. Also, the street name and house number should be sent in the following fields:
Property | Description |
---|---|
line1 | string (required) Use this field to send the Billing Address’ Street. |
line2 | string (required) Use this field to send the Billing Address’ House number. |
Requesting the installments available
Definition
POST /v1/{merchantId}/cards/{cardId}/shares
After the card token has been created, Ezy can optionally request the availability of installments for this payment. Openpay will return an array with the available installments of the ones requested. Unavailable installments won’t appear in this array.
The user could then select any of the installment options that Openpay returns, or choose to not pay in installments. These installments may or may not add interest, depending on the number of installments.
Note that currently only payments in CLP should return available installments. For other charges, the customer will only be able to pay in one installment.
Request
Example request
{
"amount": "6000",
"currency" : "CLP",
"shares": [3, 6, 9, 12]
}
Property | Description |
---|---|
amount | numeric (required) The total amount of the transaction. e.g.: “amount” : 6000 |
currency | string (required, length = 3) The currency of the charge. It must be either “CLP” or “USD”. e.g.: “currency” : “CLP” |
shares | numeric array (required) Number of installments to search for. e.g.: “shares” : [3] |
Response
Example response
{
"amount" : "6000",
"currency" : "CLP",
"available" : [
{
"share_id": "1234",
"shares" : "3",
"share_amount": "2000"
},
{
"share_id": "5678",
"shares" : "6",
"share_amount": "1000"
},
{
"share_id": "9012",
"shares" : "9",
"share_amount": "677"
},
{
"share_id": "3456",
"shares" : "12",
"share_amount": "510",
"deferred" : [
{
"months" : 1,
"amount" : 511.00
},
{
"months" : 2,
"amount" : 512.00
}
]
}
]
}
Returns a Shares object with the installment information, or an error response.
Completing the charge
Definition
POST /v1/{merchantId}/charges
To complete the transaction, the transaction information should be sent to Openpay, along with information regarding the customer and the flight. After this is done, Openpay will return the transaction result.
For each transaction, Ezy should send a unique Order ID in order to avoid duplicate charges. This Order ID can also be used to search for attempted transactions. This Order ID will be unique among successful transactions, which means that if a transaction fails or is rejected, the Order ID is allowed to be reused.
If the transaction is rejected by the payment provider, or if the Risk Assessment service determines that the transaction is risky, an error will be returned by Openpay. Other errors may also be returned in different situations. Please refer to this list for a list of possible errors.
Request
Example request
{
"method": "card",
"source_id": "kmui8z3yo45pvzcpqckx",
"amount": 15.00,
"currency": "USD",
"provider": {
"data": {
"point_of_sale": "web_retail",
"card_brand": "mastercard"
}
},
"description": "Reservation B4JOW6 Payment 2016-05-21",
"order_id": "B4JOW6 2016-05-21 15:23:12",
"customer": {
"name": "Eli",
"last_name": "Lopez",
"phone_number": "1234567890",
"email": "eli.lopez@openpay.mx"
},
"gc_risk_assessment": {
"website": "http://www.skyairline.cl/",
"is_previous_customer": false,
"airline_data": {
"airline_code": "123",
"airline_name": "Sky",
"passenger_name": "Eli Lopez",
"pnr": "B4JOW6",
"flight_date": "2016-02-01",
"agency_number": 12345678,
"flight_legs": [
{
"carrier_code": "12",
"airline_class": "1",
"origin": "ABC",
"destination": "DEF",
"departure_date": "2015-01-01",
"departure_time": "12:55",
"flight_number": 123,
"fare": "FARE",
"fare_basis": "FAREBASIS",
"allow_stopover": true
}
],
"is_third_party": false,
"ticket_number": "1231212345678",
"ticket_issue_date": "2016-02-01",
"is_eticket": false,
"is_restricted_ticket": true,
"ticket_delivery_method": "eticket",
"airline_customer_id": "123456",
"is_registered_customer": false,
"airline_invoice_number": "123123"
}
},
"metadata": {
"reservation_number": "123456"
}
}
Property | Description |
---|---|
method | string (required) It must contain the value “card” in order to specify the charge will be made from card. e.g.: “method” : “card” |
source_id | string (required) Token created previously with the customer’s card information. e.g.: “source_id” : “kmui8z3yo45pvzcpqckx” |
amount | numeric (required) Amount to charge. Must be an amount greater than zero, with up to two decimal digits. e.g.: “amount” : 1500.23 |
currency | String (required, length = 3) Currency to use. For Sky it can be either CLP or USD. e.g.: “currency” : “USD” |
provider | Object (required) Information required for specific providers. In this case it needs to be a Direct charge provider object. |
description | string (required, length = 250) A description for the charge. |
order_id | string (optional, length = 100) Unique identifier of charge. Must be unique among all successful transactions. |
customer | object (required) Information of the customer, sent in a Customer object. |
gc_risk_assessment | Object (required) Information required to use Global Collect’s risk assessment. See Global Collect Risk Assessment object. |
metadata | list(key, value) (optional) Custom information about the transaction that can be stored. |
Response
Example response
{
"id": "trzl3uze5jxnu3ab5cqm",
"authorization": "OK2348",
"method": "card",
"operation_type": "in",
"transaction_type": "charge",
"card": {
"type": "unknown",
"brand": "mastercard",
"address": {
"line1": "Hidalgo St.",
"line2": "120",
"line3": "apt. 23",
"state": "Queretaro",
"city": "Queretaro",
"postal_code": "76000",
"country_code": "MX"
},
"card_number": "XXXXXXXXXXXX1732",
"holder_name": "Eli Lopez",
"expiration_year": "20",
"expiration_month": "12",
"allows_charges": true,
"allows_payouts": false,
"bank_name": null,
"bank_code": "000"
},
"status": "completed",
"conciliated": true,
"creation_date": "2016-06-01T12:24:39-05:00",
"operation_date": "2016-06-01T12:24:43-05:00",
"description": "Reservation B4JOW6 Payment 2016-05-21",
"error_message": null,
"order_id": "B4JOW6 2016-05-21 15:23:12",
"amount": 15,
"provider": {
"name": "global_collect"
},
"currency": "USD",
"metadata": {
"reservation_number": "123456"
}
}
The response will return a Transaction object. The following are some of the important fields in the response:
Property | Description |
---|---|
id | string Contains the transaction identifier. This is unique among all transactions. e.g.: “id” : “tr9chzkyjbjfu6idj0o5” |
status | string The transaction status. For this kind of payment, the possible values are “completed” or “failed”. e.g.: “status” : “completed” |
authorization | string Authorization code for the transaction, returned by the payment provider. e.g.: “authorization” : “392034” |
operation_date | ISO 8601 date Date when the card was charged. e.g.: “operation_date” : “2016-06-01T12:24:43-05:00” |
card > brand |
string Card Brand, currently can be “visa”, “mastercard”, “american_express”, “jcb”, “diners” or “other”. Note: For future compatibility, handle any unknown value as a value of “other”. |
card > number |
string The masked card number. It shows the last 4 digits of the card. The first 6 digits may or may not be returned. |
provider > name |
string Name of the provider used for the transaction. For card charges it can be either “transbank” or “global_collect”. |
Openpay payment webpage (Radixx)
Definition
POST /v1/{merchantId}/charges
For payments through the Radixx application, Openpay will provide a webpage where the customer can enter their card information in order to complete a payment.
Creating the charge
Request example
{
"confirm": "false",
"method": "card",
"amount": 15.00,
"currency": "USD",
"provider": {
"data": {
"point_of_sale": "web_retail",
"card_brand": "mastercard"
}
},
"order_id": "B4JOW6 Payment 1",
"description": "B4JOW6 ABC-DEF 2016-05-06 32:34",
"customer": {
"name": "Eli",
"last_name": "Lopez",
"phone_number": "1234567890",
"email": "eli.lopez@openpay.mx",
"address": {
"postal_code": "7600000",
"city": "City",
"line1": "Street",
"line2": "12",
"state": "State",
"country_code": "US"
}
},
"gc_risk_assessment": {
"website": "http://www.openpay.mx",
"is_previous_customer": false,
"airline_data": {
"airline_code": "123",
"airline_name": "Sky",
"passenger_name": "Juan Vazquez Juarez",
"pnr": "4FW1O2",
"flight_date": "2016-02-01",
"agency_number": 12345678,
"flight_legs": [
{
"carrier_code": "12",
"airline_class": "1",
"origin": "ABC",
"destination": "DEF",
"departure_date": "2015-01-01",
"departure_time": "12:55",
"flight_number": 123,
"fare": "FARE",
"fare_basis": "FAREBASIS",
"allow_stopover": true
}
],
"is_third_party": false,
"ticket_number": "1231212345678",
"ticket_issue_date": "2016-02-01",
"is_eticket": false,
"is_restricted_ticket": true,
"ticket_delivery_method": "eticket",
"airline_customer_id": "123456",
"is_registered_customer": false,
"airline_invoice_number": "123123"
}
},
"metadata": {
"reservation_number": "123456"
}
}
For this, Openpay will receive all the transaction information in a request, except for the card, and the parameter confirm set to false.
Note that, in this case, the customer billing address should be sent in the customer object.
Response example
{
"id": "trtrhonzuawsojmrovww",
"status": "charge_pending",
"method": "card",
"operation_type": "in",
"transaction_type": "charge",
"creation_date": "2016-06-01T09:48:38-05:00",
"description": "B4JOW6 ABC-DEF 2016-05-06 32:34",
"amount": 15,
"order_id": "B4JOW6 Payment 1",
"currency": "USD",
"payment_method": {
"type": "redirect",
"url": "https://dev-api.openpay.mx/v1/m71mp8sc0zih82p6jb7n/charges/trtrhonzuawsojmrovww/card_capture/"
},
"metadata": {
"reservation_number": "123456"
}
}
Openpay will return the created transaction and an URL pointing to the webpage to show to the user. This webpage will request the customer’s card information in order to complete payment.
Receiving the Webhook
Webhook example
{
"type": "charge.succeeded",
"event_date": "2016-06-01T09:49:43-05:00",
"transaction": {
"id": "trtrhonzuawsojmrovww",
"authorization": "OK2348",
"method": "card",
"operation_type": "in",
"transaction_type": "charge",
"card": {
"type": "unknown",
"brand": "mastercard",
"address": {
"postal_code": "7600000",
"city": "City",
"line1": "Street",
"line2": "12",
"state": "State",
"country_code": "US"
},
"card_number": "542418XXXXXX1732",
"holder_name": "Eli Lopez Rangel",
"expiration_year": "20",
"expiration_month": "12"
},
"status": "completed",
"conciliated": true,
"creation_date": "2016-06-01T09:48:38-05:00",
"operation_date": "2016-06-01T09:49:43-05:00",
"description": "B4JOW6 ABC-DEF 2016-05-06 32:34",
"order_id": "B4JOW6 Payment 1",
"amount": 15,
"provider": {
"name": "global_collect"
},
"currency": "USD"
},
"metadata": {
"reservation_number": "123456"
}
}
Once the payment is completed, Openpay will send a webhook to Radixx to confirm the payment. This webhook will be of type charge.succeeded if the transaction was successful, or charge.failed if the card was rejected.
Redirect payments (Web)
Definition
POST /v1/{merchantId}/charges
Some payment providers require the customer to be redirected to their webpage in order to enter their payment information. For these kind of payments, Openpay receives the transaction request without card information, and returns an URL to which the customer must be redirected.
The payment providers that support this method of payment are Transbank (T. Normal), Travel Club (Banco de Chile), and Khipu.
Creating the charge
Example Request
{
"method": "card",
"amount": 125.00,
"currency": "USD",
"description": "Redirect Payment",
"order_id": "L0WP34-1",
"customer": {
"name": "Eli",
"last_name": "Lopez",
"phone_number": "1234567890",
"email": "eli.lopez@openpay.mx"
},
"provider": {
"name": "transbank",
"data": {
"url_success": "http://www.skyairline.cl/payment/",
"url_failure": "http://www.skyairline.cl/payment/"
}
}
}
The request required for these kind of payments is almost the same for all of them. The only difference is the name field of the provider object, and the method field.
Provider name | method |
---|---|
transbank | card |
travel_club | card |
khipu | bank_account |
For all of them, once the transaction is completed, the customer will be redirected to the URL sent in the field url_success if the transaction is successful, or the one in url_failure if it was rejected. The Transaction ID will be sent as a GET query parameter.
Example: http://www.skyairline.cl/payment/?id=tr9chzkyjbjfu6idj0o5
Example Response
{
"id": "tr9chzkyjbjfu6idj0o5",
"amount": 125.00,
"currency": "USD",
"authorization": null,
"method": "card",
"operation_type": "in",
"transaction_type": "charge",
"status": "charge_pending",
"conciliated": true,
"creation_date": "2016-06-01T17:09:04-05:00",
"description": "Redirect Payment",
"error_message": null,
"order_id": "L0WP34-1",
"due_date": "2016-06-01T18:09:04-05:00",
"payment_method": {
"type": "redirect",
"url": "https://dev-api.openpay.mx/v1/m71mp8sc0zih82p6jb7n/charges/tr9chzkyjbjfu6idj0o5/redirect/"
},
"provider": {
"name": "transbank"
},
"metadata": {
"reservation_number": "123456"
}
}
The following are the most relevant fields returned in the transaction:
Property | Description |
---|---|
id | string Contains the transaction identifier. This is unique among all transactions. e.g.: “id” : “tr9chzkyjbjfu6idj0o5” |
status | string The transaction status. For this kind of payment, the initial status once the transaction is created is “charge_pending”. e.g.: “status” : “charge_pending” |
due_date | ISO 8601 date The limit date for the customer to complete payment. Once this date expires, the customer won’t be able to complete their payment. Note that Openpay will wait for the confirmation from the provider up to 30 minutes after this date. e.g.: “due_date” : “2016-06-01T18:09:04-05:00” |
payment_method > url |
string URL to which the customer needs to be redirected in order to complete payment. e.g.: “url” : “https://dev-api.openpay.mx/v1/m71mp8sc0zih82p6jb7n /charges/tr9chzkyjbjfu6idj0o5/redirect/” |
Take into consideration that Openpay will allow up to 30 minutes after the payment due date in order to confirm a payment.
Receiving the confirmation
Example webhook
{
"type": "charge.succeeded",
"event_date": "2016-06-01T17:46:48-05:00",
"transaction": {
"id": "tr9chzkyjbjfu6idj0o5",
"status": "completed",
"authorization": "80039",
"amount": 125.00,
"currency": "USD",
"method": "card",
"operation_type": "in",
"transaction_type": "charge",
"conciliated": true,
"metadata": {
"transbank_buy_order": "tr9chzkyjbjfu6idj0o5",
"shares": 3
},
"card": {
"type": "credit",
"brand": "other",
"card_number": "XXXXXXXXXXXX6623",
"holder_name": "Eli Lopez",
"expiration_year": "20",
"expiration_month": "12",
"allows_charges": false,
"allows_payouts": false,
"bank_name": null,
"bank_code": "000"
},
"creation_date": "2016-06-01T17:09:04-05:00",
"operation_date": "2016-06-01T17:26:10-05:00",
"description": "Redirect Payment",
"error_message": null,
"order_id": "L0WP34-1",
"due_date": "2016-06-01T18:46:10-05:00",
"payment_method": {
"type": "redirect",
"url": "https://dev-api.openpay.mx/v1/m71mp8sc0zih82p6jb7n/charges/tr9chzkyjbjfu6idj0o5/redirect/"
},
"provider": {
"name": "transbank"
},
"metadata": {
"reservation_number": "123456"
}
}
}
Once Openpay redirects to these pages or sends you a webhook, you must verify the current transaction status by calling the API. Depending on the returned status, you should do one of the following:
- completed: This means the transaction has been processed by the payment provider, and the reservation can be confirmed. When a transaction is set to this status, a webhook of type charge.succeeded will be sent.
- failed: In this case, the transaction was rejected by the payment provider. When a charge fails, a webhook of type charge.failed will be sent.
- in_progress: If this status is returned, it means the customer has completed the payment, but the payment provider has not verified it yet. Once the transaction has been verified, the status will change to completed. If the payment is rejected or can’t be verified, the status will change to failed. It is recommended to show the customer a webpage informing them that the payment is being verified and that it might take a while before it is completed.
- charge_pending: A transaction in this state means the customer has not completed the process in the charge provider website.
- cancelled: This status means the time to complete the transaction has expired and the payment cannot be completed anymore.
The following are the important fields to consider in the Webhook:
Property | Description |
---|---|
type | string Type of webhook received. It can be either charge.succeeded for successful transactions, or charge.failed if the payment was rejected. |
transaction > id |
string ID of the transaction that is being reported in the webhook. This should be used to retrieve the transaction information. |
Once the transaction is retrieved from Openpay, you can verify the following fields:
Property | Description |
---|---|
status | string The transaction status. Depending on the transaction status it can be completed, failed, in_progress, cancelled, or charge_pending. e.g.: “status” : “completed” |
authorization | string Authorization code returned by the payment provider when a transaction is successful. e.g.: “authorization” : “80039” |
card > card_number |
string The masked card number used for the payment, with only the last four digits showing. This can only be retrieved when the redirect payment was made through Transbank. |
Khipu Email (Web & Radixx)
Definition
POST /v1/{merchantId}/charges
Khipu can also be used to accept a payment by sending the customer an email with an URL to a webpage where the customer can complete their payment.
Requesting payment
Request example
{
"method": "bank_account",
"amount": 1000,
"currency": "CLP",
"description": "Khipu email payment",
"order_id": "B4JOW2-20180401-1400",
"due_date" : "2016-06-01T11:23:29-05:00",
"customer": {
"name": "Eli",
"last_name": "Lopez",
"phone_number": "1234567890",
"email": "eli.lopez@openpay.mx"
},
"provider": {
"name": "khipu",
"data": {
"send_email" : true,
"url_success": "http://www.skyairline.cl/payment/",
"url_failure": "http://www.skyairline.cl/payment/"
}
},
"metadata": {
"reservation_number": "123456"
}
}
To use Khipu in this way, set the send_email field to true. The email will be sent to the one included in the request’s customer object.
You can optionally specify redirect URLs for the customer to be redirected to once they complete payment.
Response
{
"id": "trncmwqlsdtcgixq01ue",
"method": "card",
"operation_type": "in",
"transaction_type": "charge",
"status": "charge_pending",
"creation_date": "2016-06-01T10:53:29-05:00",
"description": "Khipu email payment",
"order_id": "B4JOW2-20180401-1400",
"due_date" : "2016-06-01T11:23:29-05:00",
"amount": 1000,
"currency": "CLP",
"provider": {
"name": "khipu"
},
"metadata": {
"reservation_number": "123456"
}
}
Once the transaction is created, Khipu will send an email to the customer requesting their payment through their website.
Verifying payment
Example webhook
{
"type": "charge.succeeded",
"event_date": "2016-06-01T17:46:48-05:00",
"transaction": {
"id": "trncmwqlsdtcgixq01ue",
"status": "completed",
"authorization": "80039",
"amount": 1000.00,
"currency": "CLP",
"method": "card",
"operation_type": "in",
"transaction_type": "charge",
"conciliated": true,
"creation_date": "2016-06-01T17:09:04-05:00",
"operation_date": "2016-06-01T17:26:10-05:00",
"description": "Khipu email payment",
"error_message": null,
"order_id": "L0WP34-1",
"due_date": "2016-06-01T18:46:10-05:00",
"provider": {
"name": "khipu"
},
"metadata": {
"reservation_number": "123456"
}
}
}
After the customer completes their payment and Khipu sends the confirmation to Openpay, Openpay will send a webhook of type charge.succeeded, indicating that the payment was completed.
When you receive the webhook, you must call the Openpay API to verify the status of the transaction using the Transaction ID.
Khipu without redirect (Web)
Another option to integrate Khipu is to implement both Khipu options on the website, reducing the need to redirect the customer to the Khipu website. These options are Khipu Simplified Transfer, which uses the Khipu browser extension to complete the payment, and Khipu Regular Transfer, which shows the customer the necessary information to go to their bank’s website and proceed with the transfer.
This section will explain how to implement both flows.
Requesting Bank and Email
Definition
GET /v1/{MERCHANT_ID}/providers/khipu/banks
Response
{
"banks" : [
{
"bank_id" : "Bawdf",
"name" : "DemoBank",
"min_amount" : 200.0
}
]
}
As a starting point for either flow, the customer needs to select which bank to use for their Khipu transfer, as well as provide their email to the website.
For the bank selection you will need a list of banks allowed by Khipu. Openpay provides an API that allows you to request this list. The selected bank’s ID should be used for future requests.
Khipu Simplified Transfer
Example Request
{
"method": "bank_account",
"amount": 10000,
"currency": "CLP",
"description": "Khipu Simplified Transfer",
"order_id": "W56DB7-1",
"customer": {
"name": "Eli",
"last_name": "Lopez",
"phone_number": "1234567890",
"email": "eli.lopez@openpay.mx"
},
"provider": {
"name": "khipu",
"data": {
"url_success": "http://www.skyairline.cl/payment/",
"url_failure": "http://www.skyairline.cl/payment/",
"bank_id": "Bawdf"
}
},
"metadata": {
"reservation_number": "123456"
}
}
With the email and bank information, you can attempt to create a Khipu Simplified Transfer. For this, you need to create the transaction using Khipu and sending the bank ID and the customer email as parameters.
Example Response
{
"id": "trczfzjweqvvzpoeya5d",
"method": "bank_account",
"operation_type": "in",
"transaction_type": "charge",
"status": "charge_pending",
"creation_date": "2016-04-27T11:09:16-05:00",
"description": "Khipu Simplified Transfer",
"due_date": "2016-04-27T11:09:21-05:00",
"order_id": "W56DB7-1",
"amount": 10000,
"currency": "CLP",
"provider": {
"name": "khipu"
},
"payment_method": {
"type": "redirect",
"url": "http://dev-api.openpay.mx/v1/m71mp8sc0zih82p6jb7n/charges/trczfzjweqvvzpoeya5d/redirect/",
"khipu_data" : {
"payment_id": "uqqdrwodfptb"
}
},
"metadata": {
"reservation_number": "123456"
}
}
Note that the bank selected might not allow for a Simplified Transfer charge. In that case, an error will be returned, and you should attemt a Khipu Regular Transfer.
If the transaction is successful, you can use the Khipu Javascript Library to integrate the payment in your webpage.
Khipu Regular Transfer
Example Request
{
"method": "bank_account",
"amount": 10000,
"currency": "CLP",
"description": "Khipu Simplified Transfer",
"order_id": "W56DB7-1",
"customer": {
"name": "Eli",
"last_name": "Lopez",
"phone_number": "1234567890",
"email": "eli.lopez@openpay.mx"
},
"provider": {
"name": "khipu",
"data": {
"url_success": "http://www.skyairline.cl/payment/",
"url_failure": "http://www.skyairline.cl/payment/",
"bank_id": "Bawdf",
"payer_personal_identifier": "11.111.111-1",
"request_bank_data": "true"
}
},
"metadata": {
"reservation_number": "123456"
}
}
For the Khipu Regular Transfer, in addition to the customer’s email and bank, we require the customer’s RUT. The parameter request_bank_data should also be set to true.
Example Response
{
"id": "trczfzjweqvvzpoeya5d",
"method": "bank_account",
"operation_type": "in",
"transaction_type": "charge",
"status": "charge_pending",
"creation_date": "2016-04-27T11:09:16-05:00",
"description": "Khipu Simplified Transfer",
"due_date": "2016-04-27T11:09:21-05:00",
"order_id": "W56DB7-1",
"amount": 10000,
"currency": "CLP",
"provider": {
"name": "khipu"
},
"payment_method": {
"type": "redirect",
"url": "http://dev-api.openpay.mx/v1/m71mp8sc0zih82p6jb7n/charges/trczfzjweqvvzpoeya5d/redirect/",
"khipu_data" : {
"payment_id": "uqqdrwodfptb",
"allows_simplified" : false,
"source_bank_name" : "Demo Bank",
"source_bank_url" : "https://www.bancodemo.com",
"destination_bank_name": "Banco Demo",
"destination_bank_url" : "https://www.bancodemo.com",
"account_identifier" : 1234567890,
"account_type" : "Cuenta corriente",
"account_holder_personal_identifier" : "76.187.287-7",
"account_holder_name" : "khipu dev a",
"account_holder_email" : "transferencias@khipu.com"
}
},
"metadata": {
"reservation_number": "123456"
}
}
Once you have the bank account information, you need to show the customer this information and direct them to their bank’s website (source_bank_url) so they can complete the payment.