Bancontact Wallet Initiated Payment (WIP)
Adriana - for review
Only available for certain acquirers in BENELUX
Your account must be enabled for Bancontact WIP
During onboarding, we configure the Bancontact wallet identifier and 3-D Secure capability. These values are merchant configuration and must not be included in Checkout requests.
Introduction
Bancontact Wallet Initiated Payments (WIP) let a merchant tokenize an authenticated Bancontact card during a customer-present Checkout payment, then use the saved token for a later card payment.
Supported Flow
| Step | Customer present | Checkout request |
|---|---|---|
| Register the card and create the WIP token | Yes | SALE or, where enabled, ZERO-AUTH with paymentMethodDetails.createToken |
| Submit a later token payment | No card data is collected | New Checkout session with paymentMethodDetails.tokenBasedTransaction |
Use a SALE when the registration should also collect payment. Use ZERO-AUTH only when Fiserv has confirmed that zero-amount Bancontact WIP registration is enabled for the store. The merchant must obtain the customer's agreement for the initial storage and for any future payments before creating or using a token.
Checkout Contract
This guide applies to POST /v2/checkouts/payment-sessions.
The public Checkout contract differs from the downstream IPG REST API:
- Put
createTokendirectly underpaymentMethodDetails. - Put
tokenBasedTransactiondirectly underpaymentMethodDetails. - Do not send
walletType. Checkout derivesBANCONTACT_WALLETinternally when WIP is enabled for the store. - Do not use the legacy paths
paymentMethodDetails.cards.createTokenorpaymentMethodDetails.cards.tokenBasedTransactionfor new integrations.
1. Register a Bancontact WIP Token
Create the payment session from the merchant backend. The customer completes the card and any required 3-D Secure interaction in the hosted Checkout experience.
POST /v2/checkouts
{
"merchantTransactionId": "WIP-REGISTER-10001",
"storeId": "{{storeId}}",
"transactionType": "SALE",
"transactionAmount": {
"total": 26.00,
"currency": "EUR",
"components": {
"subtotal": 21.00,
"vatAmount": 2.00,
"shipping": 3.00
}
},
"order": {
"orderId": "ORDER-10001"
},
"paymentMethodDetails": {
"createToken": {
"toBeUsedFor": "UNSCHEDULED",
"reusable": true,
"declineDuplicates": false,
"customWalletRegistration": {
"authenticationMethods": [
"BIOMETRICS_AUTHENTICATION"
]
}
}
},
"checkoutSettings": {
"locale": "nl_BE",
"preSelectedPaymentMethod": "Cards",
"webHooksUrl": "https://merchant.example/webhooks/payments",
"redirectBackUrls": {
"successUrl": "https://merchant.example/payments/return/success",
"failureUrl": "https://merchant.example/payments/return/failure"
}
}
}
Registration Fields
| JSON path | Required | Description |
|---|---|---|
transactionType | Yes | Use SALE for a payment plus registration. ZERO-AUTH requires explicit store enablement. |
paymentMethodDetails.createToken.toBeUsedFor | Yes | The intended token schedule. Use the value agreed for the WIP use case; UNSCHEDULED is shown above. |
paymentMethodDetails.createToken.reusable | Yes | Set to true for a token used in later payments. |
paymentMethodDetails.createToken.declineDuplicates | No | Optional duplicate-token behavior. false is shown above. |
paymentMethodDetails.createToken.... ...customWalletRegistration.authenticationMethods | Yes for WIP registration | Array describing how the shopper authenticated to the merchant website or app before registration. Send only methods actually used. |
checkoutSettings.preSelectedPaymentMethod | Recommended | Use Cards to lead the shopper to the card flow. The shopper may still be offered eligible methods according to store configuration. |
Supported authenticationMethod values are:
USERNAME_PASSWORD_PINSECRET_KEY_HARDWARESECRET_KEY_SOFTWARELOCATION_BASED_AUTHENTICATIONENVIRONMENTAL_AUTHENTICATIONBEHAVIORAL_AUTHENTICATIONBIOMETRICS_AUTHENTICATIONOUT_OF_BAND_USER_AUTHENTICATION
Multiple values may be supplied when multiple methods were used. Do not select a value merely because it is supported; the value is an assertion about the merchant's authentication process.
Complete the Registration
- The shopper enters the Bancontact card in the hosted card fields and completes any required 3-D Secure step.
- Process the server-side payment outcome before treating the registration as complete.
- Persist the token only from the authoritative approved response or webhook. Treat the token as an opaque credential and associate it with the customer agreement, store ID, and initial transaction reference.
2. Submit a Subsequent WIP Payment
Create a new Checkout payment session and supply the saved token. No plaintext PAN or CVV belongs in this request.
{
"merchantTransactionId": "WIP-SUBSEQUENT-10002",
"storeId": "{{storeId}}",
"transactionType": "SALE",
"transactionAmount": {
"total": 14.50,
"currency": "EUR"
},
"order": {
"orderId": "ORDER-10002"
},
"paymentMethodDetails": {
"tokenBasedTransaction": {
"value": "{{bancontactWipToken}}",
"transactionSequence": "SUBSEQUENT",
"schemeTransactionId": "{{initialSchemeTransactionId}}"
}
},
"checkoutSettings": {
"locale": "nl_BE",
"webHooksUrl": "https://merchant.example/webhooks/payments",
"redirectBackUrls": {
"successUrl": "https://merchant.example/payments/return/success",
"failureUrl": "https://merchant.example/payments/return/failure"
}
}
}
| JSON path | Required | Description |
|---|---|---|
paymentMethodDetails.tokenBasedTransaction.value | Yes | Saved WIP token. Keep it server-side and never place it in a browser request or URL. |
paymentMethodDetails.tokenBasedTransaction.transactionSequence | Yes | Use SUBSEQUENT for a payment after WIP registration. |
paymentMethodDetails.tokenBasedTransaction.schemeTransactionId | Conditional | Reference from the initial transaction when it is returned and required by the scheme or acquirer. |
Each subsequent payment needs a new merchant transaction and order reference. A valid token does not guarantee approval. Do not retry a decline blindly, and do not attempt to replace the payment with a new customer charge without applying the merchant's agreed customer-notification and retry policy.
Updated about 7 hours ago