Bank Transfer on Custom Checkout
Know how to integrate bank transfer as a payment method on Razorpay Custom Checkout.
You can now accept payments from customers in the form of online bank transfers using the Razorpay Custom Checkout.
- Customer selects bank transfer as the payment method on Checkout.
- A Customer Identifier is created with the bank account number and IFSC details and displayed to the customer.
- The customer copies these details and makes a netbanking payment from their online banking portal.
These Customer Identifiers are linked to the bank account you have registered with Razorpay. The payments are settled in your account as per the settlement schedule.
Feature Request
This is an on-demand feature. Please raise a request with our
to get this feature activated on your Curlec account.- .
- .
- Integrate with .
- .
- .
- .
Order is an important step in the payment process.
- An order should be created for every payment.
- You can create an order using the . It is a server-side API call. Know how to Orders API.
- The
order_id
received in the response should be passed to the checkout. This ties the order with the payment and secures the request from being tampered.
Use this endpoint to create an order using the Orders API.
curl -X POST https://api.razorpay.com/v1/orders-U [YOUR_KEY_ID]:[YOUR_KEY_SECRET]-H 'content-type:application/json'-d '{"amount": 100,"currency": "MYR","receipt": "qwsaq1","partial_payment": true,"first_payment_min_amount": 230,"notes": {"key1": "value3","key2": "value2"}}'
amount
mandatory
integer
The amount to be paid by the customer in sen. For example, if the amount is MYR 500.00, enter 50000
.
currency
mandatory
string
The currency in which the payment should be made by the customer. Length must be of 3 characters.
receipt
optional
string
Your receipt id for this order should be passed here. Maximum length is 40 characters.
notes
optional
json object
Key-value pair that can be used to store additional information about the entity. Maximum 15 key-value pairs, 256 characters (maximum) each. For example, "note_key": "Beam me up Scotty”
.
partial_payment
optional
boolean
Indicates whether the customer can make a partial payment. Possible values:
true
: The customer can make partial payments.false
(default): The customer cannot make partial payments.
first_payment_min_amount
optional
integer
Minimum amount that must be paid by the customer as the first partial payment. For example, if an amount of MYR 7,000.00 is to be received from the customer in two installments of #1 - MYR 5,000.00, #2 - MYR 2,000.00 then you can set this value as 500000
. This parameter should be passed only if partial_payment
is true
.
Know more about
.Descriptions for the response parameters are present in the
parameters table.The error response parameters are available in the
.Use the method fetchVirtualAccount
to create and fetch the virtual account details. The method is called with the following data.
var data = {order_id: 'order_CuEzONfnOI86Ab',// Replace with Order ID generated in Step 1customer_id: "cust_1Aa00000000004",notes: {address: 'Ground Floor, SJR Cyber, Laskar Hosur Road, Bengaluru',}};razorpay.fetchVirtualAccount(data).then((response) => {console.log(response)}).catch((error) => {//});
order_id
_mandatorystring
The unique identifier of the order created in the previous step.
customer_id
optional
string
The unique identifier of the customer. Learn how to create a customer using the
notes
optional
object
Key-value pair that can be used to store additional information about the entity. Maximum 15 key-value pairs, 256 characters (maximum) each. For example, "note_key": "Beam me up Scotty”
.
id
string
The unique identifier of the virtual account.
name
string
The merchant billing label
as it appears on the Razorpay Dashboard.
entity
string
Indicates the type of entity. Here, it is virtual account
.
status
string
Indicates whether the virtual account is in active
or closed
state.
description
string
A brief description about the virtual account.
amount_paid
integer
The amount paid by the customer.
notes
json object
Any custom notes you might want to add to the virtual account can be entered here. Refer
customer_id
string
Unique identifier of the customer to whom the virtual account is linked. Refer the
receivers
json object
Configuration of desired receivers for the virtual account.
id
string
The unique identifier of the virtual bank account or virtual UPI ID. Sample IDs for:
- virtual bank account
ba_Di5gbQsGn0QSz3
- virtual UPI ID
vpa_CkTmLXqVYPkbxx
.
entity
string
Name of the entity. Possible values:
bank_account
vpa
ifsc
string
The IFSC for the virtual bank account created. For example, RAZR0000001
. This parameter appears in the response only when bank_account
is passed as the receiver type
.
bank_name
string
The bank associated with the virtual bank account. For example, RBL Bank
. This parameter appears in the response only when bank_account
is passed as the receiver type
.
account_number
string
The unique account number provided by the bank. For example, 1112220061746877
. This parameter appears in the response only when bank_account
is passed as the receiver type
.
name
string
The merchant billing label
as it appears on the Razorpay Dashboard. This parameter appears in the response only when bank_account
is passed as the receiver type
.
notes
json object
Any custom notes you might want to add to the virtual bank account or virtual UPI ID can be entered here. Refer
bank_account
is passed as the receiver type
.username
string
The UPI ID consists of the username and the bank handle. The username
consists of the namespace
(assigned by the bank to Razorpay), the merchant prefix
(which can be customised by you) and the descriptor
(which you provide to identify the customer). The unique identifier which forms the first half of the virtual UPI ID. For example, rpy.payto00000gaurikumari
. This parameter appears in the response only when vpa
is passed as the receiver type
.
handle
string
The bank name that forms the second half of the virtual UPI ID. For example, icici
. This parameter appears in the response only when vpa
is passed as the receiver type
.
address
string
The UPI ID that combines the username
and the handle
with the @
symbol. For example, rpy.payto00000gaurikumari@icici
. This parameter appears in the response only when vpa
is passed as the receiver type
.
close_by
integer
UNIX timestamp at which the virtual account is scheduled to be automatically closed. The time must be at least 15 minutes after the current time. The date range can be set till 2147483647
in UNIX timestamp format (equivalent to Tuesday, January 19, 2038 8:44:07 AM GMT+05:30).
Any request beyond
2147483647
UNIX timestamp will fail.closed_at
integer
UNIX timestamp at which the virtual account is automatically closed.
created_at
integer
UNIX timestamp at which the virtual account was created.
Handy Tips
The above flow also works with the following cases:
- With the Customer Fee bearer model, the amount validation should happen with Amount + Fee.
- You can pass the customer id in Checkout to ensure that a static virtual account is created for each customer.
You must subscribe to the virtual_account.credited
webhook event on the Razorpay Dashboard to receive notifications whenever customers make payments using bank transfers. Learn how to
{"entity": "event","account_id": "acc_BFQ7uQEaa7j2z7","event": "virtual_account.credited","contains": ["payment","virtual_account","bank_transfer"],"payload": {"payment": {"entity": {"id": "pay_DETA2KrOlhqQzF","entity": "payment","amount": 50000,"currency": "INR","status": "captured","order_id": "order_DBJOWzybf0sJbb","invoice_id": null,"international": false,"method": "bank_transfer","amount_refunded": 0,"amount_transferred": 0,"refund_status": null,"captured": true,"description": "NA","card_id": null,"bank": null,"wallet": null,"vpa": null,"email": "gaurav.kumar@example.com","contact": "+919000090000","customer_id": "cust_1Aa00000000004","notes": [],"fee": 731,"tax": 112,"error_code": null,"error_description": null,"created_at": 1567675983}},"virtual_account": {"entity": {"id": "va_DET8z3wBxfPB5L","name": "Acme Corp","entity": "virtual_account","status": "active","description": "Virtual Account to test webhook","amount_expected": null,"notes": {"Important": "Notes for Internal Reference"},"amount_paid": 50000,"customer_id": "cust_1Aa00000000004","close_by": null,"closed_at": null,"created_at": 1567675923,"receivers": [{"id": "ba_DET8z5Z5ghv4hW","entity": "bank_account","ifsc": "RATN0VAAPIS","bank_name": "RBL Bank","name": "Acme Corp","account_number": "1112220006712324"}]}},"bank_transfer": {"entity": {"id": "bt_DETA2KSUJ3uCM9","entity": "bank_transfer","payment_id": "pay_DETA2KrOlhqQzF","mode": "NEFT","bank_reference": "156767598340","amount": 50000,"payer_bank_account": {"id": "ba_DETA2UuuKtKLR1","entity": "bank_account","ifsc": "KKBK0000007","bank_name": "Kotak Mahindra Bank","name": "Gaurav Kumar","account_number": "765432123456789"},"virtual_account_id": "va_DET8z3wBxfPB5L"}}},"created_at": 1567675983}
Is this integration guide useful?