In this section, you will find everything you need to manage the various entry points that your application will receive during and after an dit gedeelte vind je alles wat je nodig hebt om de verschillende instappunten te beheren die je applicatie ontvangt tijdens en na een Axepta BNP Paribas Online payment-betaling.
You will learn:
- Which URLs to transmit when creating a payment,
- The order in which they are called,
- How to interpret the returned information,
- How to verify the actual status of a transaction,
- How to manage the webhook.
Je leert:
- Welke URL's je moet doorgeven bij het aanmaken van een betaling,
- De volgorde waarin ze worden aangeroepen,
- Hoe je de geretourneerde informatie moet interpreteren,
- Hoe je de daadwerkelijke status van een transactie kunt verifiëren,
- Hoe je de webhook beheert.
InhoudstafelTable of Contents
Table of Contents
1.
ProvideURLs doorgeven: return, cancel, webhook
When initializing the payment, you must provide a URLs object:Bij het initialiseren van de betaling moet u een URLs-object opgeven.
| Code Block | ||||
|---|---|---|---|---|
| ||||
urls{
"return":"https://myProcessingServer.net/myApi/success.php?transId=95330876-67ae-4949-a11c-b9a29257831b",
"cancel":"https://myProcessingServer.net/myApi/cancel.php?transId=95330876-67ae-4949-a11c-b9a29257831b",
"webhook":"https://myBackOfficeServer.net/webhook.php"
} |
| Info |
|---|
|
2. Return URL & Cancel URL
Een van deze twee URL's (return
or cancel) will be called at the end of the transaction processing in order to:- Redirect the customer back to the merchant website at the end of the transaction
- Inform the merchant of the transaction status: (successful or not)
- Return to the merchant’s back-office the unique transaction identifier payId generated by Axepta Online
When one of these URLs is called, Axepta BNP Paribas Online automatically appends the following parameter : PayId=<paymentId generated by Axepta> - see Integration recommendation
of cancel) wordt aangeroepen aan het einde van de transactieverwerking om:
- De klant terug te sturen naar de website van de handelaar,
- De handelaar te informeren over de transactiestatus (geslaagd of niet),
- Het unieke transactie-ID (payId) door te geven aan het back-officesysteem van de handelaar.
Axepta BNP Paribas Online voegt automatisch de volgende parameter toe: zie Integratieaanbevelingen
| Tip |
|---|
Belangrijk: Voeg uw eigen identifier (bijv. transId) toe aan de URL's om de retouroproep te koppelen aan uw interne bestelling. Voorbeeld van een URL die wordt geactiveerd na betalingsbevestiging door de klant:
|
| Tip |
You should include your own identifier in the URLs to link the return call to your internal order. Example of a URL triggered after customer payment validation:
https://myProcessingServer.net/myApi/success.php?transId=95330876-67ae-4949-a11c-b9a29257831b&PayId=b6eae9b16e3343fa90da39d4ee7bf4ad |
What to Do When You Receiving This Call?
Wat te doen bij ontvangst van deze oproep?
- Haal de PayId-parameter op.
- Roep de API aan om de daadwerkelijke transactiestatus op te halen
When one of these URLs is triggered:
Retrieve the PayId parameter.
Call the API to get the actual transaction status- : GET /payments/getByPayId/{payId} -
- – Retrieve payment details by Payment ID Update your order based on the status and
- Werk de bestelling bij op basis van de status en responseCode.
Key fields Belangrijke velden in the API Responsede API-respons:
| Veld | Beschrijving |
|---|---|
| Amount |
value, capturedValue, refundedValue | |
| Identifiers |
payId, transId, xId, refNr | |
| Status |
AUTHORIZED, CAPTURE_REQUEST, OK, FAILED, etc. |
| Resultaat | responseCode = "00000000" |
of "0" |
| duidt op succes. | |
responseDescription = |
| tekstuele beschrijving. |
| Info |
|---|
A successful transaction may return either Let op: Een geslaagde transactie kan zowel "00000000" or als "0" depending on the payment stage or method. You must check both values to determine success, "00000000" OR "0" retourneren, afhankelijk van de betaalfase of -methode. Controleer altijd beide waarden om succes te bevestigen. |
Voorbeelden van samengevatte responsen:Examples of summarized responses
| Code Block | ||||||
|---|---|---|---|---|---|---|
| ||||||
{
"amount":{
"value":126,
"currency":"EUR",
"capturedValue":0,
"refundedValue":0
},
"payId":"91a6299a704147bf934aabd79fd1dc5d",
"merchantId":"MY_MERCHANT_ID",
"transId":"Trans361039",
"xId":"b55e68b7e4644a90836ae31effe1fc60",
"refNr":"refNb77254",
"status":"AUTHORIZED",
"responseCode":"00000000",
"responseDescription":"Transaction successful",
"paymentMethods":{
"type":"CARD"
}
} |
| Code Block | ||||||
|---|---|---|---|---|---|---|
| ||||||
{
"amount":{
"value":1200,
"currency":"EUR",
"capturedValue":0,
"refundedValue":0
},
"payId":"09526745fa704e9c8584dbe893c31f99",
"merchantId":"MY_MERCHANT_ID",
"transId":"1230861007",
"xId":"2781d7d379e5449e9717c901ba6f9ff7",
"refNr":"Q1ovVxioaZ6n",
"status":"CAPTURE_REQUEST",
"responseCode":"0",
"responseDescription":"REQUEST",
"paymentMethods":{
"type":"CARD"
}
} |
3. Webhook
At the end of transaction processing, Aan het einde van de transactieverwerking meldt Axepta BNP Paribas Online notifies the merchant website of the final transaction result.
The webhook notification is the only reliable way to be informed of transaction completion.
It is mandatory for the merchant system to process webhook calls.
It is sent via an HTTP REST call to the webhook URL provided during payment initialization.
It is sent even if the customer:
- Closes their browser,
- Loses connection,
- Does not return to your website.
When is it sent?
het definitieve transactieresultaat aan de website van de handelaar. De webhook-melding is de enige betrouwbare manier om op de hoogte te worden gebracht van de voltooiing van een transactie. Verplicht voor handelaren: verwerk webhook-oproepen in uw systeem.
- Verzonden via een HTTP REST-oproep naar de webhook-URL die u bij de betalingsinitialisatie hebt opgegeven.
- Wordt verzonden, zelfs als de klant:
- De browser sluit,
- De verbinding verliest,
- Niet terugkeert naar uw website.
Wanneer wordt de webhook verzonden?
Na elke asynchrone verwerking van een betaling. Als het eindpunt niet beschikbaar is, wordt de melding tot 8 keer opnieuw verzonden:
| Poging | Vertraging (uur:min) | Totaal (uur:min) |
|---|
After each asynchronous payment processing completion
If the endpoint is unavailable, the notification is retried up to 8 times
Attempt | Delay | Time after 1st notification|
|---|---|---|
0 | Instantaneous | 0 |
1 | 00:01 h | 00:01 h |
2 | 00:08 h | 00:09 h |
3 | 00:27 h | 00:36 h |
4 | 01:04 h | 01:40 h |
5 | 02:05 h | 03:45 h |
6 | 03:36 h | 07:21 h |
7 | 05:43 h | 13:04 h |
8 | 08:32 h | 21:36 h |
What you must do
- Read the JSON payload
- Identify the transaction using payId or transId
- Update your system accordingly
- Respond with HTTP 200 OK
| Tip |
|---|
Important: Never finalize an order based solely on the Return URL. Always rely on the webhook as the source of truth. |
Wat moet u doen?
- Lees de JSON-payload.
- Identificeer de transactie met payId of transId.
- Werk uw systeem bij.
- Reageer met HTTP 200 OK.
| Tip |
|---|
Finaliseer een bestelling nooit alleen op basis van de Return-URL. |
Webhook Structuur
Meegestuurde velden:
Webhook Structure
Provided Fields
- merchantId
- payId
- transId
- xId
- refNr
- status (AUTHORIZED, FAILED, etc.)
- responseCode / responseDescription
- amount
- paymentMethods
- creationDate (UTC)
- channel (ECOM, MOTO, Pay By Link…)
ExampleVoorbeeld
| Code Block | ||||||
|---|---|---|---|---|---|---|
| ||||||
{
"merchantId": "YOUR_MERCHANT_ID",
"payId": "91a6299a704147bf934aabd79fd1dc5d",
"transId": "Trans361039",
"xid": "b55e68b7e4644a90836ae31effe1fc60",
"refNr": "refNb77254",
"status": "AUTHORIZED",
"responseCode": "00000000",
"responseDescription": "Transaction successful",
"amount": {
"value": 126,
"currency": "EUR"
},
"paymentMethods": {
"type": "CARD"
},
"creationDate": "2025-10-30T11:27:57Z",
"channel": "ECOM"
}
|
Security and Verification
Beveiliging en verificatie
Om de authenticiteit van webhookgegevens te garanderen, worden payloads ondertekend met To ensure the authenticity of webhook data, payloads are signed using HMAC-SHA256.
De handtekening wordt meegestuurd in drie HTTP-headers:The signature is included in three HTTP headers within the webhook message.
Signature headers
X-Paygate-Signature-Version | Version of the signature format (currently,Versie van het handtekeningformaat (momentaneel v1). | |
X-Paygate-Timestamp | Unix | epoch timestamp (seconds since-tijdstempel (seconden sinds 1970-01-01T00:00:00Z, UTC). |
X-Paygate-Signature | Signature in the format Handtekening in het formaat v1= | <hex-hmac><hex-hmac>. |
Signature Generation (Axepta BNP-Paribas Online)
signed_payload = timestamp + "." + raw_json_body
signature = HMAC_SHA256(secret, signed_payload)
secret– HMAC key- The generated
Signatureis encoded 'hex' and the header is set as followsDe gegenereerde handtekening wordt hex-gencodeerd en als header meegegeven:
X-Paygate-Signature: v1=<hex-hmac>Signature Verification (Merchant)
To verify the authenticity of the webhook message data:
- Extract the data carried by the HTTP
- Extraheer de headers:
X-Paygate-TimestampX-Paygate-Signature
Retrieve the - Haalt de raw JSON-payload op ( exact binary
- exacte binaire body). Compute the HMAC using the extracted data
- Bereken de HMAC:
signed_payload = timestamp + "." + raw_
body bodyexpected_signature = HMAC_SHA256(secret, signed_payload)
Compare the calculated signature with the received signature using a - Vergelijk de handtekeningen met een "constant-time" method
- -methode. Validate the
- Valideer de webhook if
- als:
- The signatures are identical
- The Timestamp is within ±5 minutes of your local clock.
- De handtekeningen identiek zijn,
- Het tijdstempel binnen ±5 minuten van uw lokale klok valt.
Voorbeeld van authenticiteitsverificatie:
Webhook authenticity verification example:
Merchant Id used :- Handelaars-ID:
BNP_DEMO_MID
- HMAC
- -sleutel: zie Sandbox & Testpagina.
- Transactiedatum: 19 mei 2026, 09:23:20 (Parijse tijd, GMT+2).
| Code Block | ||||
|---|---|---|---|---|
| ||||
Headers
{
"Accept-Encoding": "gzip",
"Content-Length": 381,
"Content-Type": "application/json",
"Expect": "100-continue",
"X-Forwarded-Host": "bin.webhookrelay.com",
"X-Forwarded-Proto": "https",
"X-Paygate-Signature": "v1=DF1F4AA6022460A9821832F9B89DF82D92D01B35C80DDDF596E97FF26E0ABB14",
"X-Paygate-Signature-Version": "v1",
"X-Paygate-Timestamp": "1779175402",
"X-Real-Ip": "213.155.65.68"
}
Body
{
"merchantId": "BNP_DEMO_MID",
"payId": "413cef3ff4fd4b08af2245d5a889dbaa",
"transId": "Trans293156",
"xid": "7919a1e81571466ca8f5737d5414f7a4",
"refNr": "refNb81210",
"status": "FAILED",
"responseCode": "22940040",
"responseDescription": "NO RESPONSE",
"amount": {
"value": 460,
"currency": "EUR"},
"paymentMethods": {
"type": "CARD"},
"creationDate": "2026-05-19T07:23:20Z",
"channel": "ECOM"
} |
Webhook ValidationVerificatie:
| Controlepunt | Header/waarde | Resultaat | |
|---|---|---|---|
Is de handtekeningsversie v1? | |||
| Check | Parameter used | Value | Result |
X-Paygate-Signature-Version | |||
| CORRECT | |||
| Valideert het tijdstempel (±5 min)? | X-Paygate-Timestamp | ||
: 1779175402 | CORRECT | ||
| Komen de handtekeningen overeen? | X-Paygate-Signature | ||
| CORRECT | |||
BerekeningSignature verification:
1779175402.{"merchantId": "BNP_DEMO_MID","payId": "413cef3ff4fd4b08af2245d5a889dbaa","transId": "Trans293156","xid": "7919a1e81571466ca8f5737d5414f7a4","refNr": "refNb81210","status": "FAILED","responseCode": "22940040","responseDescription": "NO RESPONSE","amount": {"value": 460,"currency": "EUR"},"paymentMethods": {"type": "CARD"},"creationDate": "2026-05-19T07:23:20Z","channel": "ECOM"}
Computed HMAC-SHA256 with previous value as input, using- Data
Value:
- voor handtekening:
1779175402.<volle JSON-body> - Verwachte HMAC-SHA256 (met sleutel
6Gp_A!8f)3zZ9K]gb7S?2*tN(yH54[wB
- ):
df1f4aa6022460a9821832f9b89df82d92d01b35c80dddf596e97ff26e0abb14
Nota: signature verification should be done without case sensitivity
Best Pratices voor Integratie
| Tip |
|---|
|