Übersicht

Was es ist

Apple Pay Zahlungen über MONDO akzeptieren

Was Sie brauchen

MONDO Konto-ID + Geheimschlüssel

Was Sie senden

Apple Pay Token + Betrag + Währung

Was Sie bekommen

ABGESCHLOSSEN oder ABGELEHNT Status

Wie es funktioniert

Kunde
Apple Pay
Sie
MONDO
Fertig

Option A: Selbstgehostet

Sie zeigen den Apple Pay-Button auf Ihrer Seite an und senden uns das Token

Option B: MONDO-Hosted

Wir kümmern uns um alles - leiten Sie Ihren Kunden einfach an uns weiter

Schnellstart (Selbstgehostet)

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"
}

Über Apple Pay

Apple Pay bietet eine schnelle, sichere und private Zahlungsmöglichkeit für Kunden. Mit MONDO als Ihrem Zahlungsdienstleister (PSP) können Sie Apple Pay akzeptieren, ohne ein eigenes Apple-Entwicklerkonto zu benötigen.

MONDO als Ihr PSP

  • MONDO besitzt die Apple-Händler-ID
  • MONDO verwaltet Apple Pay-Zertifikate
  • MONDO übernimmt Händlervalidierung
  • MONDO entschlüsselt und verarbeitet Zahlungstoken
Was Sie NICHT benötigen: Kein Apple-Entwicklerkonto, keine Apple-Händler-ID, keine Zertifikate zu verwalten.

Token-Verwaltung — Wer macht was?

Apple Pay verwendet eine Ende-zu-Ende-Verschlüsselung, um Kartendaten zu schützen. Hier ist die Aufteilung der Verantwortlichkeiten:

Apfel (Kundengerät) Erzeugt ein verschlüsseltes Zahlungstoken mit Kartendaten, Kryptogramm und Authentifizierungsdetails
Sie (Händler) Übergeben Sie das verschlüsselte Token direkt an MONDO über den apple_pay_token Parameter — versuchen Sie NICHT, es zu entschlüsseln
MONDO (PSP) Entschlüsselt das Token mit unserem Apple Pay Zahlungsverarbeitungszertifikat und verarbeitet die Zahlung mit CardCorp
Wichtig: Sie sehen oder verarbeiten niemals rohe Kartennummern. Das Token, das Sie von Apple erhalten, ist verschlüsselt und kann nur von MONDO mit unserem Händlerzertifikat entschlüsselt werden.

Wählen Sie Ihre Integrationsmethode

Beste für: Vollständige Kontrolle über das Aussehen und die Benutzererfahrung des Apple Pay-Buttons auf Ihrer eigenen Checkout-Seite.

📋 Voraussetzungen

  • Partnerkonto-ID - Ihr eindeutiger MONDO-Kontokenner
  • Partner-Geheimcode - Ihr API-Authentifizierungsschlüssel
  • HTTPS - Ihre Website muss HTTPS verwenden

⚠️ Domänenverifizierung erforderlich

Ihr Domain muss einmalig über MONDO bei Apple registriert werden.

  1. Gehe zu GETMONDO.CO
  2. LoginDeveloperApple PayAdd Apple Pay Domain

🔄 Zahlungsablauf

1
Benutzer klickt auf Apple Pay Button
Auf Ihrer Webseite
2
Apple Pay-Blatt öffnet sich
Native Apple Pay-Oberfläche
3
Händlerüberprüfung
Ihr JS ruft MONDOs Validierungs-Endpunkt auf
4
Benutzer authentifiziert
Face ID / Touch ID
5
Token an MONDO gesendet
POST to /payment/ with apple_pay_token
6
3D Secure & Umleitung
Benutzer zur Erfolg-/Fehler-URL umgeleitet

🔗 API-Endpunkt

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

Händler-Validierungs-Endpunkt

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

Händler-Validierungsparameter

ParameterTypErforderlichBeschreibung
validationURLstring✓ JaDie von Apple bereitgestellte URL onvalidatemerchant Ereignis
company_account_idstring✓ JaIhr MONDO Partnerkonto-ID
gateway_secret_keystring✓ JaIhr MONDO Partner Geheimschlüssel
domain_namestring○ BedingtIhre Apple Pay-Domain (z. B. paynow.yoursite.com). Erforderlich für Server-zu-Server-Anrufe, bei denen der Browser-Origin-Header nicht verfügbar ist. Nicht erforderlich, wenn direkt vom Browser aus aufgerufen wird.
Server-zu-Server-Integration Hinweis:
Wenn Ihr Backend die Händlervalidierungsanfrage weiterleitet (d.h. Ihr Server ruft MONDO auf, anstatt dass der Browser direkt anruft), müssen Sie einschließen domain_name auf die Domain einstellen, auf der Ihr Apple Pay-Button angezeigt wird. Dies stellt sicher, dass die Apple Pay-Sitzung Ihrer Zahlungsseitendomain entspricht.

📝 Erforderliche Parameter (Zahlungsabwicklung)

ParameterTypBeschreibung
company_account_idstringIhr MONDO Partnerkonto-ID
gateway_secret_keystringIhr MONDO Partner Geheimschlüssel
apple_pay_tokenobjectVerschlüsselt Token von event.payment.token — pass directly to MONDO as-is (nicht entschlüsseln)
transaction_amountdecimalZahlungsbetrag (z. B. 99,99)
transaction_currency_iso3stringWährungscode (EUR, USD, GBP)
cardholder_email_addressstringKunden-E-Mail

Optionale Parameter

ParameterBeschreibung
partner_return_url_completedURL für erfolgreiche Zahlungsweiterleitung
partner_return_url_rejectedURL für abgelehnte Zahlungsumleitung
partner_webhook_urlURL für Webhook-Benachrichtigungen
live_or_sandboxlive oder sandbox

📤 API-Antwort

Apple Pay Zahlungen werden sofort verarbeitet. Die Antwort enthält den endgültigen Transaktionsstatus:

{
    "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"
}

Antwortfelder

FeldBeschreibung
statussuccess oder error
transaction_statusCOMPLETED oder REJECTED
gateway_session_idEindeutiger Sitzungsbezeichner für diese Transaktion
transaction_idEindeutige Transaktions-ID - zur Korrelation mit Callbacks verwenden
gateway_messageMenschlich lesbare Statusmeldung
redirect_urlURL zur Weiterleitung nach Zahlung (optional - nur für UX)
Sofortige Verarbeitung
Im Gegensatz zu Kartenzahlungen, die eine 3D-Secure-Weiterleitung erfordern, werden Apple Pay-Transaktionen sofort verarbeitet. Die Zahlung ist bereits abgeschlossen, wenn Sie die Antwort erhalten.

🍎 Apple Pay JS-Integration

Schritt 1: Apple Pay-Button hinzufügen

<apple-pay-button buttonstyle="black" type="plain" locale="en" onclick="startApplePayPayment()"></apple-pay-button>

Schritt 2: Verfügbarkeit prüfen

if (window.ApplePaySession && ApplePaySession.canMakePayments()) {
    document.getElementById('apple-pay-button').style.display = 'block';
}

Schritt 3: Umsetzung abschließen

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 unterstützt zwei Testmodi. Das Verständnis der Unterschiede ist entscheidend für eine erfolgreiche Integration.

SANDBOX zum Testen

Was passiert

  • ✅ Tokenstruktur ist validiert
  • ✅ Alle erforderlichen Felder sind geprüft
  • ⏭️ Entschlüsselung übersprungen (Testdaten zurückgegeben)
  • ⏭️ CardCorp API-Aufruf übersprungen
  • ✅ Zahlungsvorgang abgeschlossen
💡
Schlüsselpunkt: Sie müssen ein korrekt strukturiertes Token senden - im gleichen Format wie für den LIVE-Modus erforderlich.
LIVE Für Produktion

Was passiert

  • ✅ Tokenstruktur ist validiert
  • ✅ Alle erforderlichen Felder sind geprüft
  • ✅ Echte kryptografische Entschlüsselung
  • ✅ Echte CardCorp API-Verarbeitung
  • ✅ Echtes Geld wird berechnet
🔒
Schlüsselpunkt: Nur im LIVE-Modus mit echten Apple Pay-Token von tatsächlichen Geräten verwenden.

🎯 Warum SANDBOX dieselbe Token-Struktur benötigt

Dieses Design stellt sicher, dass beim Wechsel von SANDBOX zu LIVE Ihre Integration sofort ohne Codeänderungen funktioniert.

🧪
SANDBOX
Test mit gültiger Struktur
Bestätigt
Struktur bestätigt
🚀
LIVE
Funktioniert sofort

⚙️ Modus einstellen

Einschließen live_or_sandbox Parameter in Ihrer API-Anfrage:

{
    "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
}

🎭 Sandbox: Transaktionsergebnis erzwingen

Im SANDBOX-Modus können Sie ein spezifisches Transaktionsergebnis zum Testen erzwingen:

ParameterWertErgebnis
sandbox_force_transaction_status COMPLETED ✅ Zahlung genehmigt
sandbox_force_transaction_status REJECTED ❌ Zahlung abgelehnt

Apple Pay Tokenstruktur

Der Apple Pay-Token muss folgende Struktur haben. Dies gilt sowohl für den SANDBOX- als auch für den LIVE-Modus.

Wichtig: Ungültige Tokenstruktur senden (wie nur "***") führt zu einem Fehler, auch im SANDBOX-Modus.

Erforderliche Token-Struktur

{
    "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"
}

Feldbeschreibungen

Feld Erforderlich Beschreibung
paymentData.versionImmer EC_v1
paymentData.dataBase64-verschlüsselte Zahlungsdaten von Apple
paymentData.signatureBase64-Signatur zur Überprüfung
paymentData.header.ephemeralPublicKeyBase64 ephemeraler öffentlicher Schlüssel
paymentData.header.publicKeyHashBase64-Hash des öffentlichen Schlüssels des Händlers
paymentData.header.transactionIdEindeutige Transaktionskennung
paymentMethod.networkKarten-Netzwerk (Visa, Mastercard, Amex)
paymentMethod.displayNameAnzeigename aus Apple Wallet

= Erforderlich  |  = Empfohlen

Sandbox-Test-Token

Kopieren Sie diesen Token für SANDBOX-Tests. Die verschlüsselten Werte müssen nicht echt sein - nur die Struktur wird validiert.

{
    "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"
}

Häufige Token-Fehler

Fehler Ursache Lösung
Invalid token format Token ist kein JSON-Objekt Token als Objekt senden, nicht als Zeichenfolge
Missing paymentData Token hat keine paymentData-Eigenschaft Fügen Sie das vollständige Token von Apple Pay JS ein
Missing header fields ephemeralPublicKey, publicKeyHash oder transactionId fehlen Stellen Sie sicher, dass alle Kopfzeilenfelder vorhanden sind

Woher kommt das Token?

Im LIVE-Modus stammt das Token von Apple Pay JS, wenn der Benutzer die Zahlung autorisiert:

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
            ...
        })
    });
};

Transaktionsstatus

Transaktionsstatus verstehen und abfragen ist für eine vollständige Integration essenziell.

Endgültige Transaktionsstatus

Dies sind die möglichen Endstatus, die Sie per Webhook oder beim Abfragen des /details-Endpunkts erhalten werden:

COMPLETED
Zahlung erfolgreich
REJECTED
Zahlung vom Prozessor abgelehnt
CANCELED
Zahlung abgebrochen
FAILED
Technischer Fehler aufgetreten

Zwischenstatus

INITIATED

Die Transaktion wurde erstellt, wird aber noch bearbeitet. Dies kann passieren, wenn:

  • Benutzer führt 3D-Secure-Authentifizierung durch
  • Zahlung wird vom Kartennetzwerk verarbeitet
  • Benutzer hat den Zahlungsvorgang abgebrochen

Wann sollten Sie den Transaktionsstatus abfragen?

Beste Praxis: Verlasse dich immer auf Webhooks als primäre Benachrichtigungsmethode. Nutze das /details-Endpunkt nur als Ausweichlösung, falls:
  • Webhook nicht innerhalb der erwarteten Zeit erhalten (z. B. 5 Minuten)
  • Sie müssen den Transaktionsstatus manuell überprüfen
  • Ihr Webhook-Endpunkt war vorübergehend nicht verfügbar

Transaktionsstatus abfragen

Um den Status einer Transaktion zu überprüfen, senden Sie eine POST-Anfrage an den Details-Endpunkt:

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

Anfrageparameter

Parameter Erforderlich Beschreibung
company_account_id Ihr MONDO Partnerkonto-ID
gateway_secret_key Ihr MONDO Partner Geheimschlüssel
gateway_session_id Die Sitzungs-ID der anfänglichen Zahlungsanforderung

Beispielanfrage

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"
  }'

Beispielantwort

{
    "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"
}

Statusaktualisierungen empfangen

Es gibt zwei Wege, den endgültigen Transaktionsstatus zu erhalten:

Methode Wie es funktioniert Wann verwenden
Webhook Empfohlen MONDO sendet eine POST-Anfrage an dein partner_webhook_url Primärmethode - automatisch, Echtzeit
Redirect URL Benutzer wird weitergeleitet zu Ihrem partner_return_url_completed oder partner_return_url_rejected Für Benutzerbestätigung
Query /details Sie machen eine POST-Anfrage, um den Status zu prüfen Fallback, falls Webhook nicht empfangen

Wenn Transaktion INITIIERT bleibt

Wenn eine Transaktion länger als 15 Minuten den Status INITIIERT behält, bedeutet dies wahrscheinlich:

  • Der Nutzer hat die 3D-Secure-Herausforderung abgebrochen
  • Der Nutzer hat seinen Browser während der Zahlung geschlossen
  • Es gab ein Netzwerkproblem während der Verarbeitung

Aktion: Abfrage des /details Endpunkts für den aktuellen Status. Diese Transaktionen werden letztendlich ablaufen und in den Status FEHLGESCHLAGEN oder ABGEBROCHEN wechseln.