Overzicht
Wat het is
Accepteer Apple Pay-betalingen via MONDO
Wat je nodig hebt
MONDO Account ID + Geheime Sleutel
Wat je stuurt
Apple Pay-token + bedrag + valuta
Wat je krijgt
VOLTOOID of AFGEWEZEN status
Hoe het werkt
Optie A: Zelfgehost
U toont de Apple Pay-knop op uw site en stuurt ons de token
Optie B: MONDO-Hosted
Wij regelen alles - stuur uw klant gewoon naar ons door
Snel Starten (Zelfgehost)
POST https://server-to-server.getmondo.co/payment/
{
"company_account_id": "your_id",
"gateway_secret_key": "your_key",
"apple_pay_token": { /* from Apple Pay JS */ },
"transaction_amount": "99.99",
"transaction_currency_iso3": "EUR",
"live_or_sandbox": "sandbox"
}
Over Apple Pay
Apple Pay biedt een snelle, veilige en privé manier voor klanten om te betalen. Met MONDO als uw Payment Service Provider (PSP) kunt u Apple Pay accepteren zonder een eigen Apple Developer account nodig te hebben.
MONDO als je PSP
- ✓ MONDO is eigenaar van de Apple Merchant ID
- ✓ MONDO beheert Apple Pay certificaten
- ✓ MONDO behandelt handelaarsvalidatie
- ✓ MONDO decodeert en verwerkt betaaltokens
Tokenbeheer — Wie doet wat?
Apple Pay gebruikt end-to-end encryptie om kaarthoudergegevens te beschermen. Zo zijn de verantwoordelijkheden verdeeld:
| Apple (Klant's Apparaat) | Genereert een gecodeerde betaal token met kaartgegevens, cryptogram en authenticatiedetails |
| U (Handelaar) | Geef de versleutelde token direct door aan MONDO via de apple_pay_token parameter — probeer NIET te ontcijferen |
| MONDO (PSP) | Ontcijfert de token met ons Apple Pay-betalingsverwerkingscertificaat en verwerkt de betaling met CardCorp |
Kies uw integratiemethode
📋 Vereisten
- ✓ Partneraccount-ID - Uw unieke MONDO-account-ID
- ✓ Partner Geheime Sleutel - Uw API-verificatiesleutel
- ✓ HTTPS - Uw website moet HTTPS gebruiken
⚠️ Domeinverificatie Vereist
Uw domein moet via MONDO bij Apple geregistreerd worden. Dit is een eenmalige instelling.
- Ga naar GETMONDO.CO
- Login → Developer → Apple Pay → Add Apple Pay Domain
🔄 Betalingsstroom
Op uw website
Inheemse Apple Pay-interface
Uw JS roept MONDO's validatie-eindpunt aan
Face ID / Touch ID
POST to /payment/ with apple_pay_token
Gebruiker doorgestuurd naar succes/fout URL
🔗 API-eindpunt
Handelaarsvalidatie Endpoint
Handelaarsvalidatieparameters
| Parameter | Type | Vereist | Beschrijving |
|---|---|---|---|
| validationURL | string | ✓ Ja | De URL verstrekt door Apple in de onvalidatemerchant evenement |
| company_account_id | string | ✓ Ja | Uw MONDO Partner Account-ID |
| gateway_secret_key | string | ✓ Ja | Uw MONDO Partner Geheime Sleutel |
| domain_name | string | ○ Conditioneel | Uw Apple Pay-domein (bijv. paynow.yoursite.com). Vereist voor server-naar-server oproepen waar de browser Origin header niet beschikbaar is. Niet nodig als er rechtstreeks vanuit de browser wordt gebeld. |
Als uw backend de validatieoproep van de handelaar proxyt (d.w.z. uw server belt MONDO in plaats van dat de browser direct belt), moet u opnemen
domain_name stel in op het domein waar uw Apple Pay-knop wordt weergegeven. Dit zorgt ervoor dat de Apple Pay-sessie overeenkomt met uw betalingspagina domein. 📝 Vereiste Parameters (Betaling Verwerking)
| Parameter | Type | Beschrijving |
|---|---|---|
| company_account_id | string | Uw MONDO Partner Account-ID |
| gateway_secret_key | string | Uw MONDO Partner Geheime Sleutel |
| apple_pay_token | object | Versleuteld token van event.payment.token — pass directly to MONDO as-is (niet ontcijferen) |
| transaction_amount | decimal | Betalingsbedrag (bv. 99,99) |
| transaction_currency_iso3 | string | Valutacode (EUR, USD, GBP) |
| cardholder_email_address | string | Klant's e-mail |
Optionele Parameters
| Parameter | Beschrijving |
|---|---|
| partner_return_url_completed | URL voor succesvolle betalingsomleiding |
| partner_return_url_rejected | URL voor afgekeurde betaling omleiding |
| partner_webhook_url | URL voor webhook-meldingen |
| live_or_sandbox | live of sandbox |
📤 API-antwoord
Apple Pay-betalingen worden direct verwerkt. De reactie bevat de definitieve transactiestatus:
{
"status": "success",
"transaction_status": "COMPLETED",
"gateway_session_id": "73d68b79579eeaa4a1f35f667509ba19",
"transaction_id": "37819a4707f3736b6fb42148d98f05ab",
"gateway_message": "Transaction succeeded",
"redirect_url": "https://yoursite.com/success?gateway_session_id=...&payment_status=COMPLETED"
}
Reactievelden
| Veld | Beschrijving |
|---|---|
| status | success of error |
| transaction_status | COMPLETED of REJECTED |
| gateway_session_id | Unieke sessie-ID voor deze transactie |
| transaction_id | Unieke transactie-ID - gebruik dit om te correleren met callbacks |
| gateway_message | Menselijk leesbare statusmelding |
| redirect_url | URL om gebruiker door te sturen na betaling (optioneel - alleen voor UX) |
In tegenstelling tot kaartbetalingen die een 3D Secure-omleiding vereisen, worden Apple Pay-transacties direct verwerkt. De betaling is al voltooid wanneer u de reactie ontvangt.
🍎 Apple Pay JS Integratie
Stap 1: Voeg Apple Pay-knop toe
<apple-pay-button buttonstyle="black" type="plain" locale="en" onclick="startApplePayPayment()"></apple-pay-button>
Stap 2: Controleer Beschikbaarheid
if (window.ApplePaySession && ApplePaySession.canMakePayments()) {
document.getElementById('apple-pay-button').style.display = 'block';
}
Stap 3: Voltooi Implementatie
async function startApplePayPayment() {
const paymentRequest = {
countryCode: 'US',
currencyCode: 'EUR',
merchantCapabilities: ['supports3DS'],
supportedNetworks: ['visa', 'masterCard'],
total: { label: 'Your Company', amount: '99.99', type: 'final' }
};
const session = new ApplePaySession(3, paymentRequest);
// Merchant Validation
session.onvalidatemerchant = async (event) => {
const resp = await fetch('https://server-to-server.getmondo.co/payment/apple_pay_validate_merchant.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
validationURL: event.validationURL,
company_account_id: 'YOUR_ACCOUNT_ID',
gateway_secret_key: 'YOUR_SECRET_KEY',
domain_name: 'your-domain.com' // Required for server-to-server; optional if browser calls directly
})
});
session.completeMerchantValidation(await resp.json());
};
// Payment Authorization - Apple provides ENCRYPTED token in event.payment.token
// IMPORTANT: Pass the token directly to MONDO - do NOT attempt to decrypt it
session.onpaymentauthorized = async (event) => {
const resp = await fetch('https://server-to-server.getmondo.co/payment/', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
company_account_id: 'YOUR_ACCOUNT_ID',
gateway_secret_key: 'YOUR_SECRET_KEY',
apple_pay_token: event.payment.token, // Encrypted token - MONDO decrypts
transaction_amount: '99.99',
transaction_currency_iso3: 'EUR',
cardholder_email_address: 'customer@example.com',
partner_return_url_completed: 'https://yoursite.com/success',
partner_return_url_rejected: 'https://yoursite.com/failed',
live_or_sandbox: 'live'
})
});
const result = await resp.json();
if (result.transaction_status === 'COMPLETED') {
session.completePayment(ApplePaySession.STATUS_SUCCESS);
// Payment already processed - redirect is optional for user experience
if (result.redirect_url) {
window.location.href = result.redirect_url;
}
} else {
session.completePayment(ApplePaySession.STATUS_FAILURE);
if (result.redirect_url) {
window.location.href = result.redirect_url;
}
}
};
session.begin();
}
Testmodi
MONDO ondersteunt twee testmodi. Het begrijpen van het verschil is cruciaal voor succesvolle integratie.
Wat gebeurt
- ✅ Tokenstructuur is gevalideerd
- ✅ Alle verplichte velden zijn gecontroleerd
- ⏭️ Decryptie overgeslagen (nepgegevens geretourneerd)
- ⏭️ CardCorp API-aanroep overgeslagen
- ✅ Volledige betalingsstroom uitgevoerd
Wat gebeurt
- ✅ Tokenstructuur is gevalideerd
- ✅ Alle verplichte velden zijn gecontroleerd
- ✅ Echte cryptografische ontsleuteling
- ✅ Echte CardCorp API-verwerking
- ✅ Echt geld wordt in rekening gebracht
🎯 Waarom SANDBOX dezelfde tokenstructuur vereist
Dit ontwerp zorgt ervoor dat wanneer je overschakelt van SANDBOX naar LIVE, je integratie direct werkt zonder code wijzigingen.
⚙️ Modus instellen
Insluiten live_or_sandbox parameter in uw API-verzoek:
{
"company_account_id": "your_account_id",
"gateway_secret_key": "your_secret_key",
"apple_pay_token": { ... },
"transaction_amount": "99.99",
"transaction_currency_iso3": "EUR",
"live_or_sandbox": "sandbox" // or "live" for production
}
🎭 Zandbak: Transactieresultaat Forceren
In SANDBOX-modus kunt u een specifieke transactie-uitkomst forceren voor testen:
| Parameter | Waarde | Resultaat |
|---|---|---|
| sandbox_force_transaction_status | COMPLETED |
✅ Betaling goedgekeurd |
| sandbox_force_transaction_status | REJECTED |
❌ Betaling geweigerd |
Apple Pay Tokenstructuur
De Apple Pay-token moet de volgende structuur hebben. Dit is hetzelfde voor zowel SANDBOX als LIVE modi.
"***") zal resulteren in een fout, zelfs in SANDBOX-modus. Vereiste Tokenstructuur
{
"paymentData": {
"version": "EC_v1",
"data": "BASE64_ENCRYPTED_PAYMENT_DATA",
"signature": "BASE64_SIGNATURE",
"header": {
"ephemeralPublicKey": "BASE64_EPHEMERAL_KEY",
"publicKeyHash": "BASE64_PUBLIC_KEY_HASH",
"transactionId": "UNIQUE_TRANSACTION_ID"
}
},
"paymentMethod": {
"displayName": "Visa 1234",
"network": "Visa",
"type": "debit"
},
"transactionIdentifier": "APPLE_TRANSACTION_ID"
}
Veldbeschrijvingen
| Veld | Vereist | Beschrijving |
|---|---|---|
| paymentData.version | ✓ | Altijd EC_v1 |
| paymentData.data | ✓ | Base64 versleutelde betalingsgegevens van Apple |
| paymentData.signature | ✓ | Base64-handtekening voor verificatie |
| paymentData.header.ephemeralPublicKey | ✓ | Base64 tijdelijke openbare sleutel |
| paymentData.header.publicKeyHash | ✓ | Base64-hash van openbare sleutel van handelaar |
| paymentData.header.transactionId | ✓ | Unieke transactie-ID |
| paymentMethod.network | ○ | Kaartnetwerk (Visa, Mastercard, Amex) |
| paymentMethod.displayName | ○ | Weergavenaam uit Apple Wallet |
✓ = Vereist | ○ = Aanbevolen
Zandbak Test Token
Kopieer deze token voor SANDBOX-testen. De versleutelde waarden hoeven niet echt te zijn - alleen de structuur wordt gevalideerd.
{
"paymentData": {
"version": "EC_v1",
"data": "c2FuZGJveF9lbmNyeXB0ZWRfZGF0YV8xNzAyMjU2MDAwMDAw",
"signature": "c2FuZGJveF9zaWduYXR1cmVfMTcwMjI1NjAwMDAwMA==",
"header": {
"ephemeralPublicKey": "c2FuZGJveF9lcGhlbWVyYWxfa2V5XzE3MDIyNTYwMDAwMDA=",
"publicKeyHash": "c2FuZGJveF9wdWJsaWNfa2V5X2hhc2g=",
"transactionId": "SANDBOX_TXN_1702256000000_a1b2c3d4e5f6"
}
},
"paymentMethod": {
"displayName": "Visa 4242",
"network": "Visa",
"type": "debit"
},
"transactionIdentifier": "SANDBOX_TXN_1702256000000_a1b2c3d4e5f6"
}
Veelvoorkomende Tokenfouten
| Fout | Oorzaak | Oplossing |
|---|---|---|
| Invalid token format | Token is geen JSON-object | Verzend token als object, niet als tekst |
| Missing paymentData | Token heeft geen paymentData eigenschap | Voeg volledige token toe van Apple Pay JS |
| Missing header fields | ephemerePublicKey, publicKeyHash of transactionId ontbreekt | Zorg dat alle kopvelden aanwezig zijn |
Waar komt de token vandaan?
In LIVE modus komt de token van Apple Pay JS wanneer de gebruiker betaling autoriseert:
session.onpaymentauthorized = (event) => {
// This is the token you send to MONDO
const token = event.payment.token;
// Send to MONDO API
fetch('/payment/', {
body: JSON.stringify({
apple_pay_token: token, // Pass the entire token object
...
})
});
};
Transactiestatus
Transactiestatussen begrijpen en hoe ze op te vragen is essentieel voor een volledige integratie.
Eindtransactiestatussen
Dit zijn de mogelijke eindstatussen die u ontvangt via webhook of bij het opvragen van het /details eindpunt:
Tussenstatus
De transactie is aangemaakt maar wordt nog verwerkt. Dit kan gebeuren wanneer:
- Gebruiker voltooit 3D Secure-verificatie
- Betaling wordt verwerkt door het kaartnetwerk
- Gebruiker heeft de betalingsprocedure verlaten
Wanneer moet u de transactiestatus opvragen?
- U heeft geen webhook ontvangen binnen de verwachte tijd (bijv. 5 minuten)
- U moet handmatig een transactiestatus verifiëren
- Uw webhook-eindpunt was tijdelijk niet beschikbaar
Transactiestatus Opvragen
Om de status van een transactie te controleren, doe een POST-verzoek naar het details-eindpunt:
Verzoekparameters
| Parameter | Vereist | Beschrijving |
|---|---|---|
| company_account_id | ✓ | Uw MONDO Partner Account-ID |
| gateway_secret_key | ✓ | Uw MONDO Partner Geheime Sleutel |
| gateway_session_id | ✓ | De sessie-ID van het initiële betaalverzoek |
Voorbeeldverzoek
curl -X POST https://server-to-server.getmondo.co/details/ \
-H "Content-Type: application/json" \
-d '{
"company_account_id": "your_account_id",
"gateway_secret_key": "your_secret_key",
"gateway_session_id": "sess_abc123xyz"
}'
Voorbeeldreactie
{
"success": true,
"transaction_status": "COMPLETED",
"gateway_session_id": "sess_abc123xyz",
"transaction_amount": "99.99",
"transaction_currency_iso3": "EUR",
"card_last_4_digits": "4242",
"card_brand": "VISA",
"gateway_result_code": "000.000.000",
"gateway_result_description": "Transaction succeeded",
"created_at": "2024-12-10T22:30:00Z",
"completed_at": "2024-12-10T22:31:15Z"
}
Statusupdates ontvangen
Er zijn twee manieren om de definitieve transactiestatus te ontvangen:
| Methode | Hoe het werkt | Wanneer te gebruiken |
|---|---|---|
| Webhook Aanbevolen | MONDO verstuurt een POST-verzoek naar uw partner_webhook_url |
Primaire methode - automatisch, real-time |
| Redirect URL | Gebruiker wordt doorgestuurd naar uw partner_return_url_completed of partner_return_url_rejected |
Voor gebruikersbevestiging |
| Query /details | U maakt een POST-verzoek om de status te controleren | Fallback als webhook niet ontvangen |
Als Transactie INITIËREN Blijft
Als een transactie langer dan 15 minuten in de status INITIATED blijft, betekent dit waarschijnlijk:
- De gebruiker heeft de 3D Secure-uitdaging verlaten
- De gebruiker heeft zijn browser gesloten tijdens de betaling
- Er was een netwerkprobleem tijdens de verwerking
Actie: Raadpleeg het /details eindpunt voor de huidige status. Deze transacties zullen uiteindelijk verlopen en overgaan naar de status MISLUKT of GEANNULEERD.