Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

In 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-betaling.

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.


Table of ContentsInhoudstafel

Table of Contents


1.

Provide

URLs 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
titleExample of a return URL
linenumberstrue
	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
  • Return = doorverwijzing wanneer de klant op de bevestigingsknop klikt aan het einde van het betaalproces

  • Cancel = doorverwijzing als de klant de betaling annuleert.

  • Webhook = asynchrone en gegarandeerde melding, onafhankelijk van de actie van de klant.


2. Return URL & Cancel URL

Een van deze twee URL's (return 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 je uw eigen identifier (bijv. transId) toe aan de URL's om de retouroproep te koppelen aan je uw interne bestelling.

Voorbeeld van een URL die wordt geactiveerd na betalingsbevestiging door de klant:

  • In groen, door jou u opgegeven URL met transId.
  • In rood, door Axepta BNP Paribas Online toegevoegde PayId


https://myProcessingServer.net/myApi/success.php?transId=95330876-67ae-4949-a11c-b9a29257831b&PayId=b6eae9b16e3343fa90da39d4ee7bf4ad 


Wat te doen bij ontvangst van deze oproep?

  1. Haalt Haal de PayId-parameter op.
  2. Roep de API aan om de daadwerkelijke transactiestatus op te halen: GET /payments/getByPayId/{payId} –  Retrieve payment details by Payment ID
  3. Werk je de bestelling bij op basis van de status en responseCode.


Belangrijke velden in de API-respons:

VeldBeschrijving
Amountvalue, capturedValue, refundedValue
IdentifierspayId, transId, xId, refNr
StatusAUTHORIZED, CAPTURE_REQUEST, OK, FAILED, etc.
ResultaatresponseCode = "00000000" of "0" duidt op succes.

responseDescription = tekstuele beschrijving.


Info

Let op: Een geslaagde transactie kan zowel "00000000" als "0" retourneren, afhankelijk van de betaalfase of -methode.

Controleer altijd beide waarden om succes te bevestigen.



Voorbeelden van samengevatte responsen:

Code Block
languagejson
titlegetByPayId response for a card transaction in AUTHORIZED status
linenumberstrue
 {
	"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
languagejson
titlegetByPayId response for a card transaction in a CAPTURE_REQUEST status
linenumberstrue
 {
	"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


Aan het einde van de transactieverwerking meldt Axepta BNP Paribas Online 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

je

uw systeem.

  • Verzonden via een HTTP REST-oproep naar de webhook-URL die
je
  • u bij de betalingsinitialisatie hebt opgegeven.
  • Wordt verzonden, zelfs als de klant:
    • De browser sluit,
    • De verbinding verliest,
    • Niet terugkeert naar
je
    • 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:


PogingVertraging (uur:min)Totaal (uur:min)

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

Wat moet

je

u doen?

  1. Lees de JSON-payload.
  2. Identificeer de transactie met payId of transId.
  3. Werk je uw systeem bij.
  4. Reageer met HTTP 200 OK.
Tip

Finaliseer een bestelling nooit alleen op basis van de Return-URL.
Vertrouw altijd op de webhook als bron van waarheid.



Webhook Structuur

Meegestuurde velden:

  • merchantId
  • payId
  • transId
  • xId
  • refNr
  • status (AUTHORIZED, FAILED, etc.)
  • responseCode / responseDescription
  • amount
  • paymentMethods
  • creationDate (UTC)
  • channel (ECOM, MOTO, Pay By Link…)


Voorbeeld

Code Block
languagejson
titlewebhook payload
linenumberstrue
{
    "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"
}



Beveiliging en verificatie

Om de authenticiteit van webhookgegevens te garanderen, worden payloads ondertekend met HMAC-SHA256. 

De handtekening wordt meegestuurd in drie HTTP-headers:

Signature headers

X-Paygate-Signature-VersionVersie van het handtekeningformaat (momentaneel v1).
X-Paygate-TimestampUnix-tijdstempel (seconden sinds 1970-01-01T00:00:00Z, UTC).
X-Paygate-SignatureHandtekening in het formaat v1=<hex-hmac>.


Signature Generation (Axepta BNP-Paribas Online)

signed_payload = timestamp + "." + raw_json_body
signature = HMAC_SHA256(secret, signed_payload)
  • secret – HMAC key
  • De gegenereerde handtekening wordt hex-gencodeerd en als header meegegeven:
X-Paygate-Signature: v1=<hex-hmac>


Signature Verification (Merchant)

  1. Extraheer de headers:
    • X-Paygate-Timestamp
    • X-Paygate-Signature
  2. Haalt de raw JSON-payload op (exacte binaire body).
  3. Bereken de HMAC:
    • signed_payload = timestamp + "." + raw_body
    • expected_signature = HMAC_SHA256(secret, signed_payload)
  4. Vergelijk de handtekeningen met een "constant-time"-methode.
  5. Valideer de webhook als:
    • De handtekeningen identiek zijn,
    • Het tijdstempel binnen ±5 minuten van
je
    • uw lokale klok valt.


Voorbeeld van authenticiteitsverificatie:

  • Handelaars-ID: BNP_DEMO_MID
  • HMAC-sleutel: zie Sandbox & Testpagina.
  • Transactiedatum: 19 mei 2026, 09:23:20 (Parijse tijd, GMT+2).


Code Block
titleWebhook received
collapsetrue
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"
}



Verificatie:

ControlepuntHeader/waardeResultaat
Is de handtekeningsversie v1?X-Paygate-Signature-VersionCORRECT
Valideert het tijdstempel (±5 min)?X-Paygate-Timestamp: 1779175402CORRECT
Komen de handtekeningen overeen?X-Paygate-SignatureCORRECT

Berekening:

  • Data voor handtekening: 1779175402.<volle JSON-body>
  • Verwachte HMAC-SHA256 (met sleutel 6Gp_A!8f)3zZ9K]gb7S?2*tN(yH54[wB): df1f4aa6022460a9821832f9b89df82d92d01b35c80dddf596e97ff26e0abb14


Best Pratices voor Integratie

Tip
  • Verifieer de transactie altijd via het getByPayId-eindpunt, zelfs als de front-end "succes" meldt.
  • Verwerk altijd webhook-meldingen.
  • Valideer de authenticiteit van webhookgegevens door de handtekening te controleren.
  • Log alle return/cancel/webhook-oproepen voor auditing.