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

Klant
Apple Pay
U
MONDO
Klaar

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
Wat u NIET nodig heeft: Geen Apple-ontwikkelaarsaccount, geen Apple-handelaars-ID, geen certificaten om te beheren.

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
Belangrijk: U ziet of verwerkt nooit ruwe kaartnummers. Het token dat u van Apple ontvangt is versleuteld en kan alleen door MONDO ontcijferd worden met ons handelaarscertificaat.

Kies uw integratiemethode

Beste voor: Volledige controle over het uiterlijk van de Apple Pay-knop en de gebruikerservaring op je eigen afrekenpagina.

📋 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.

  1. Ga naar GETMONDO.CO
  2. LoginDeveloperApple PayAdd Apple Pay Domain

🔄 Betalingsstroom

1
Gebruiker klikt op Apple Pay-knop
Op uw website
2
Apple Pay-scherm opent
Inheemse Apple Pay-interface
3
Handelaarsvalidatie
Uw JS roept MONDO's validatie-eindpunt aan
4
Gebruiker Authenticeert
Face ID / Touch ID
5
Token Verzonden naar MONDO
POST to /payment/ with apple_pay_token
6
3D Secure & Omleiden
Gebruiker doorgestuurd naar succes/fout URL

🔗 API-eindpunt

POST https://server-to-server.getmondo.co/payment/

Handelaarsvalidatie Endpoint

POST https://server-to-server.getmondo.co/payment/apple_pay_validate_merchant.php

Handelaarsvalidatieparameters

ParameterTypeVereistBeschrijving
validationURLstring✓ JaDe URL verstrekt door Apple in de onvalidatemerchant evenement
company_account_idstring✓ JaUw MONDO Partner Account-ID
gateway_secret_keystring✓ JaUw MONDO Partner Geheime Sleutel
domain_namestring○ ConditioneelUw 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.
Server-tot-Server Integratie Opmerking:
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)

ParameterTypeBeschrijving
company_account_idstringUw MONDO Partner Account-ID
gateway_secret_keystringUw MONDO Partner Geheime Sleutel
apple_pay_tokenobjectVersleuteld token van event.payment.token — pass directly to MONDO as-is (niet ontcijferen)
transaction_amountdecimalBetalingsbedrag (bv. 99,99)
transaction_currency_iso3stringValutacode (EUR, USD, GBP)
cardholder_email_addressstringKlant's e-mail

Optionele Parameters

ParameterBeschrijving
partner_return_url_completedURL voor succesvolle betalingsomleiding
partner_return_url_rejectedURL voor afgekeurde betaling omleiding
partner_webhook_urlURL voor webhook-meldingen
live_or_sandboxlive 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

VeldBeschrijving
statussuccess of error
transaction_statusCOMPLETED of REJECTED
gateway_session_idUnieke sessie-ID voor deze transactie
transaction_idUnieke transactie-ID - gebruik dit om te correleren met callbacks
gateway_messageMenselijk leesbare statusmelding
redirect_urlURL om gebruiker door te sturen na betaling (optioneel - alleen voor UX)
Directe Verwerking
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.

SANDBOX voor testen

Wat gebeurt

  • ✅ Tokenstructuur is gevalideerd
  • ✅ Alle verplichte velden zijn gecontroleerd
  • ⏭️ Decryptie overgeslagen (nepgegevens geretourneerd)
  • ⏭️ CardCorp API-aanroep overgeslagen
  • ✅ Volledige betalingsstroom uitgevoerd
💡
Kernpunt: U moet een correct gestructureerde token versturen - hetzelfde formaat vereist voor LIVE modus.
LIVE Voor Productie

Wat gebeurt

  • ✅ Tokenstructuur is gevalideerd
  • ✅ Alle verplichte velden zijn gecontroleerd
  • ✅ Echte cryptografische ontsleuteling
  • ✅ Echte CardCorp API-verwerking
  • ✅ Echt geld wordt in rekening gebracht
🔒
Kernpunt: Gebruik LIVE modus alleen met echte Apple Pay tokens van echte apparaten.

🎯 Waarom SANDBOX dezelfde tokenstructuur vereist

Dit ontwerp zorgt ervoor dat wanneer je overschakelt van SANDBOX naar LIVE, je integratie direct werkt zonder code wijzigingen.

🧪
SANDBOX
Test met geldige structuur
Gevalideerd
Structuur bevestigd
🚀
LIVE
Werkt direct

⚙️ 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:

ParameterWaardeResultaat
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.

Belangrijk: Ongeldige tokenstructuur verzenden (zoals gewoon "***") 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.versionAltijd EC_v1
paymentData.dataBase64 versleutelde betalingsgegevens van Apple
paymentData.signatureBase64-handtekening voor verificatie
paymentData.header.ephemeralPublicKeyBase64 tijdelijke openbare sleutel
paymentData.header.publicKeyHashBase64-hash van openbare sleutel van handelaar
paymentData.header.transactionIdUnieke transactie-ID
paymentMethod.networkKaartnetwerk (Visa, Mastercard, Amex)
paymentMethod.displayNameWeergavenaam 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:

COMPLETED
Betaling geslaagd
REJECTED
Betaling geweigerd door verwerker
CANCELED
Gebruiker heeft betaling geannuleerd
FAILED
Technische fout opgetreden

Tussenstatus

INITIATED

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?

Beste Praktijk: Vertrouw altijd op webhooks als uw primaire notificatiemethode. Raadpleeg alleen het /details eindpunt als reserve als:
  • 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:

POST https://server-to-server.getmondo.co/details/

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.