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 Razorpay account.
- Watch this video to know how to raise a feature enablement request on the Razorpay Dashboard.
- .
- .
- 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.
You can create an order:
- Using the sample code on the Razorpay Postman Public Workspace.
- By manually integrating the API sample codes on your server.
You can use the Postman workspace below to create an order:
Handy Tips
Under the Authorization section in Postman, select Basic Auth and add the Key Id and secret as the Username and Password, respectively.
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": 500,"currency": "INR","receipt": "qwsaq1","partial_payment": true,"first_payment_min_amount": 230,"notes": {"key1": "value3","key2": "value2"}}'
{"id": "order_IluGWxBm9U8zJ8","entity": "order","amount": 5000,"amount_paid": 0,"amount_due": 5000,"currency": "INR","receipt": "rcptid_11","offer_id": null,"status": "created","attempts": 0,"notes": [],"created_at": 1642662092}
amount
mandatory
integer
Payment amount in the smallest currency sub-unit. For example, if the amount to be charged is ₹299.00, then pass 29900
in this field. In the case of three decimal currencies, such as KWD, BHD and OMR, to accept a payment of 295.991, pass the value as 295990. And in the case of zero decimal currencies such as JPY, to accept a payment of 295, pass the value as 295.
Watch Out!
As per payment guidelines, you should pass the last decimal number as 0 for three decimal currency payments. For example, if you want to charge a customer 99.991 KD for a transaction, you should pass the value for the amount parameter as 99990
and not 99991
.
currency
mandatory
string
The currency in which the transaction should be made. See the
Handy Tips
Razorpay has added support for zero decimal currencies, such as JPY, and three decimal currencies, such as KWD, BHD, and OMR, allowing businesses to accept international payments in these currencies. Know more about
(May 2024).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 ₹7,000.00 is to be received from the customer in two installments of #1 - ₹5,000.00, #2 - ₹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?