Ü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
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
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 |
Wählen Sie Ihre Integrationsmethode
📋 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.
- Gehe zu GETMONDO.CO
- Login → Developer → Apple Pay → Add Apple Pay Domain
🔄 Zahlungsablauf
Auf Ihrer Webseite
Native Apple Pay-Oberfläche
Ihr JS ruft MONDOs Validierungs-Endpunkt auf
Face ID / Touch ID
POST to /payment/ with apple_pay_token
Benutzer zur Erfolg-/Fehler-URL umgeleitet
🔗 API-Endpunkt
Händler-Validierungs-Endpunkt
Händler-Validierungsparameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| validationURL | string | ✓ Ja | Die von Apple bereitgestellte URL onvalidatemerchant Ereignis |
| company_account_id | string | ✓ Ja | Ihr MONDO Partnerkonto-ID |
| gateway_secret_key | string | ✓ Ja | Ihr MONDO Partner Geheimschlüssel |
| domain_name | string | ○ Bedingt | Ihre 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. |
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)
| Parameter | Typ | Beschreibung |
|---|---|---|
| company_account_id | string | Ihr MONDO Partnerkonto-ID |
| gateway_secret_key | string | Ihr MONDO Partner Geheimschlüssel |
| apple_pay_token | object | Verschlüsselt Token von event.payment.token — pass directly to MONDO as-is (nicht entschlüsseln) |
| transaction_amount | decimal | Zahlungsbetrag (z. B. 99,99) |
| transaction_currency_iso3 | string | Währungscode (EUR, USD, GBP) |
| cardholder_email_address | string | Kunden-E-Mail |
Optionale Parameter
| Parameter | Beschreibung |
|---|---|
| partner_return_url_completed | URL für erfolgreiche Zahlungsweiterleitung |
| partner_return_url_rejected | URL für abgelehnte Zahlungsumleitung |
| partner_webhook_url | URL für Webhook-Benachrichtigungen |
| live_or_sandbox | live 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
| Feld | Beschreibung |
|---|---|
| status | success oder error |
| transaction_status | COMPLETED oder REJECTED |
| gateway_session_id | Eindeutiger Sitzungsbezeichner für diese Transaktion |
| transaction_id | Eindeutige Transaktions-ID - zur Korrelation mit Callbacks verwenden |
| gateway_message | Menschlich lesbare Statusmeldung |
| redirect_url | URL zur Weiterleitung nach Zahlung (optional - nur für UX) |
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.
Was passiert
- ✅ Tokenstruktur ist validiert
- ✅ Alle erforderlichen Felder sind geprüft
- ⏭️ Entschlüsselung übersprungen (Testdaten zurückgegeben)
- ⏭️ CardCorp API-Aufruf übersprungen
- ✅ Zahlungsvorgang abgeschlossen
Was passiert
- ✅ Tokenstruktur ist validiert
- ✅ Alle erforderlichen Felder sind geprüft
- ✅ Echte kryptografische Entschlüsselung
- ✅ Echte CardCorp API-Verarbeitung
- ✅ Echtes Geld wird berechnet
🎯 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.
⚙️ 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:
| Parameter | Wert | Ergebnis |
|---|---|---|
| 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.
"***") 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.version | ✓ | Immer EC_v1 |
| paymentData.data | ✓ | Base64-verschlüsselte Zahlungsdaten von Apple |
| paymentData.signature | ✓ | Base64-Signatur zur Überprüfung |
| paymentData.header.ephemeralPublicKey | ✓ | Base64 ephemeraler öffentlicher Schlüssel |
| paymentData.header.publicKeyHash | ✓ | Base64-Hash des öffentlichen Schlüssels des Händlers |
| paymentData.header.transactionId | ✓ | Eindeutige Transaktionskennung |
| paymentMethod.network | ○ | Karten-Netzwerk (Visa, Mastercard, Amex) |
| paymentMethod.displayName | ○ | Anzeigename 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:
Zwischenstatus
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?
- 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:
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.