Accept bank transfer payments
You can accept payments in three simple steps:
- Initialize a Payment Intent
- Generate Transfer Instructions
- Query the Payment Status
Step 2. Generate Transfer Instructions
The transfer instructions provided will be tailored to the currency of the payment intent.
USD
EUR
GBP
SGD
Handling virtual account availability issues
Some currencies, especially SGD, have a limit on the number of virtual bank account numbers that can be created within a short period. If this limit is reached, the system will return the following error code.
To prevent disruptions, please contact your Account Manager in advance if you anticipate high transaction volumes to request a limit increase.
Step 3. Query the Payment Status
To get the payment result, we recommend polling the status of the Payment Intent via the Retrieve a Payment Intent API API.
In addition, Airwallex will notify you of the payment result asynchronously via webhooks. Please refer to the webhook documentation to set up your webhook accordingly.
Sample webhook
Since bank transfers depend on when and how much the customer sends, the actual received_amount
may differ from the expected amount. Webhook status updates are also determined based on your reconciliation preferences .
Description | Event |
---|---|
Customer transferred the exact amount. |
payment_intent.succeeded payment_attempt.capture_requested payment_attempt.capture_amount = payment_intent.amount
|
Customer transferred more than the expected amount. The extra amount is set to be returned. |
payment_intent.succeeded payment_attempt.capture_requested payment_attempt.capture_amount = payment_intent.amount The extra amount will be returned. |
Customer transferred less than the expected amount. The partial amount is set to be accepted after the expiry time. |
payment_intent.succeeded payment_attempt.capture_requested payment_attempt.capture_amount = payment_attempt.received_amount
|
Customer transferred less than the expected amount. The partial amount is set to be returned after the expiry time. |
payment_intent.requires_payment_method payment_attempt.expired The received amount will be returned. |
No transfer or transfer received after expiry time. |
payment_intent.requires_payment_method payment_attempt.expired The received amount will be returned. |
Demo scenarios
You can simulate different payment and refund scenarios in the demo environment by adjusting the payment intent amount as below.
Payment scenarios
Description | Payment intent amount |
---|---|
Customer transferred the exact amount. | 200 |
Customer transferred more than the expected amount. | 190 (200 received) |
Customer transferred less than the expected amount. | 210 (200 received) |
Customer did not transfer any amount before the payment expires. | Any amount other than the above. |
Refund scenarios Once a payment has been successfully processed, you can initiate a refund.
Refund scenarios | Refund amount |
---|---|
Successfully refund | Any amount other than 40 and not greater than the payment amount. |
Failed to refund | 40 |