payment.customer_email_required.
How it works
- You initialise the payment as usual.
- From checkout, you request a virtual account for that payment.
- You show the bank name, account number, account name and a countdown.
- The customer transfers the exact amount from their bank.
- Vestrapay detects the credit, completes the payment and posts
payment.completedto your webhook. - You verify and fulfil.
Request an account
After initialise, request the account from checkout using the access code, not the secret key. There is no request body.
Display the bank name, account number, account name and a countdown driven by
expiresInSeconds. Repeating the request while the account is still valid returns the same account, so it is safe to call again after a page refresh.
Confirm the transfer
The customer pays at their bank, so your system learns about it asynchronously.- Subscribe to
payment.completedandpayment.failedon your webhook. - If your pay screen shows live progress, listen to the checkout events
checkout.awaiting_transferand thencheckout.completedon GET/v1/payment/checkout/events. - Verify the reference before you fulfil.
success counts.
When things go wrong
Test mode
In the sandbox, you do not need to move money. Call the simulate endpoint with the access code and choose the outcome:success, failed and abandoned. The endpoint is rejected on live with HTTP 403.
When the GTBank sandbox is the active transfer processor, success creates a sandbox virtual account and funds it, so the payment completes through the same webhook path as production. That makes the simulation a faithful test of your webhook handler. See Test payments.