Przegląd
Co to jest
Akceptuj płatności Apple Pay przez MONDO
Co potrzebujesz
ID konta MONDO + Klucz tajny
To, co wysyłasz
Token Apple Pay + kwota + waluta
Co dostajesz
STATUS: ZAKOŃCZONE lub ODRZUCONE
Jak to działa
Opcja A: Samodzielnie hostowany
Wyświetlasz przycisk Apple Pay na swojej stronie i wysyłasz nam token
Opcja B: MONDO-Hosted
Zajmiemy się wszystkim - po prostu przekieruj do nas swojego klienta
Szybki start (własny hosting)
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"
}
O Apple Pay
Apple Pay oferuje szybki, bezpieczny i prywatny sposób płatności dla klientów. Z MONDO jako Twoim Dostawcą Usług Płatniczych (PSP), możesz akceptować płatności Apple Pay bez potrzeby posiadania własnego konta deweloperskiego Apple.
MONDO jako Twój PSP
- ✓ MONDO posiada identyfikator handlowy Apple
- ✓ MONDO zarządza certyfikatami Apple Pay
- ✓ MONDO obsługuje weryfikację sprzedawców
- ✓ MONDO deszyfruje i przetwarza tokeny płatnicze
Obsługa tokenów — Kto co robi?
Apple Pay używa szyfrowania typu end-to-end, aby chronić dane posiadaczy kart. Oto jak podzielone są obowiązki:
| Apple (Urządzenie klienta) | Generuje szyfrowany token płatniczy zawierający dane karty, kryptogram i szczegóły uwierzytelniania |
| Ty (Sprzedawca) | Przekaż zaszyfrowany token bezpośrednio do MONDO za pomocą parametru apple_pay_token — nie próbuj deszyfrować |
| MONDO (PSP) | Odszyfrowuje token przy użyciu naszego certyfikatu przetwarzania płatności Apple Pay i przetwarza płatność za pomocą CardCorp |
Wybierz metodę integracji
📋 Wymagania wstępne
- ✓ ID konta partnera - Twój unikalny identyfikator konta MONDO
- ✓ Klucz tajny partnera - Twój klucz uwierzytelniający API
- ✓ HTTPS - Twoja strona musi używać HTTPS
⚠️ Wymagana weryfikacja domeny
Twoja domena musi być zarejestrowana w Apple przez MONDO. To ustawienie jednorazowe.
- Idź do GETMONDO.CO
- Login → Developer → Apple Pay → Add Apple Pay Domain
🔄 Przepływ płatności
Na twojej stronie
Natywny interfejs Apple Pay
Twoje wywołania JS korzystają z punktu końcowego walidacji MONDO
Face ID / Touch ID
POST to /payment/ with apple_pay_token
Użytkownik przekierowany na adres URL sukcesu/porażki
🔗 Punkt końcowy API
Punkt weryfikacji sprzedawcy
Parametry Walidacji Sprzedawcy
| Parametr | Typ | Wymagane | Opis |
|---|---|---|---|
| validationURL | string | ✓ Tak | URL dostarczony przez Apple w onvalidatemerchant wydarzenie |
| company_account_id | string | ✓ Tak | Twoje ID konta partnera MONDO |
| gateway_secret_key | string | ✓ Tak | Twój klucz tajny MONDO Partner |
| domain_name | string | ○ Warunkowy | Twoja domena Apple Pay (np. paynow.yoursite.com). Wymagane do połączeń serwer-serwer, gdy nagłówek Origin przeglądarki nie jest dostępny. Nie jest potrzebne przy połączeniach bezpośrednio z przeglądarki. |
Jeśli Twój backend pełni rolę proxy dla wywołania weryfikacji sprzedawcy (tj. Twój serwer wywołuje MONDO zamiast bezpośredniego wywołania przez przeglądarkę), musisz dołączyć
domain_name ustaw dla domeny, na której wyświetlany jest przycisk Apple Pay. Zapewnia to zgodność sesji Apple Pay z domeną Twojej strony płatności. 📝 Wymagane parametry (Przetwarzanie płatności)
| Parametr | Typ | Opis |
|---|---|---|
| company_account_id | string | Twoje ID konta partnera MONDO |
| gateway_secret_key | string | Twój klucz tajny MONDO Partner |
| apple_pay_token | object | Zaszyfrowane token z event.payment.token — przejdź bezpośrednio do MONDO tak jak jest (nie odszyfruj) |
| transaction_amount | decimal | Kwota płatności (np. 99,99) |
| transaction_currency_iso3 | string | Kod waluty (EUR, USD, GBP) |
| cardholder_email_address | string | E-mail klienta |
Parametry opcjonalne
| Parametr | Opis |
|---|---|
| partner_return_url_completed | URL przekierowania po udanej płatności |
| partner_return_url_rejected | URL przekierowania odrzuconej płatności |
| partner_webhook_url | URL dla powiadomień webhook |
| live_or_sandbox | live lub sandbox |
📤 Odpowiedź API
Płatności Apple Pay są przetwarzane natychmiast. Odpowiedź zawiera ostateczny status transakcji:
{
"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"
}
Pola odpowiedzi
| Pole | Opis |
|---|---|
| status | success lub error |
| transaction_status | COMPLETED lub REJECTED |
| gateway_session_id | Unikalny identyfikator sesji dla tej transakcji |
| transaction_id | Unikalny identyfikator transakcji - użyj tego do korelacji z wywołaniami zwrotnymi |
| gateway_message | Komunikat o stanie czytelny dla człowieka |
| redirect_url | URL przekierowania po płatności (opcjonalnie - tylko dla UX) |
W przeciwieństwie do płatności kartą, które wymagają przekierowania 3D Secure, transakcje Apple Pay są przetwarzane natychmiast. Płatność jest już zakończona, gdy otrzymujesz odpowiedź.
🍎 Integracja Apple Pay JS
Krok 1: Dodaj przycisk Apple Pay
<apple-pay-button buttonstyle="black" type="plain" locale="en" onclick="startApplePayPayment()"></apple-pay-button>
Krok 2: Sprawdź dostępność
if (window.ApplePaySession && ApplePaySession.canMakePayments()) {
document.getElementById('apple-pay-button').style.display = 'block';
}
Krok 3: Zakończ implementację
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();
}
Tryby testowania
MONDO obsługuje dwa tryby testowania. Zrozumienie różnicy jest kluczowe dla udanej integracji.
Co się dzieje
- ✅ Struktura tokenu zweryfikowana
- ✅ Wszystkie wymagane pola zostały sprawdzone
- ⏭️ Odszyfrowanie pominięte (zwrócono dane testowe)
- ⏭️ Pominięto wywołanie API CardCorp
- ✅ Pełny proces płatności został wykonany
Co się dzieje
- ✅ Struktura tokenu zweryfikowana
- ✅ Wszystkie wymagane pola zostały sprawdzone
- ✅ Prawdziwe kryptograficzne deszyfrowanie
- ✅ Przetwarzanie API Real CardCorp
- ✅ Pobierane są prawdziwe pieniądze
🎯 Dlaczego SANDBOX Wymaga Takiej Samej Struktury Tokenów
Ten projekt zapewnia, że przy przełączeniu z SANDBOX na LIVE, integracja działa od razu bez zmian w kodzie.
⚙️ Ustawianie trybu
Dołącz do live_or_sandbox parametr w Twoim żądaniu API:
{
"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: Wymuś wynik transakcji
W trybie SANDBOX możesz wymusić określony wynik transakcji do testowania:
| Parametr | Wartość | Wynik |
|---|---|---|
| sandbox_force_transaction_status | COMPLETED |
✅ Płatność zatwierdzona |
| sandbox_force_transaction_status | REJECTED |
❌ Płatność odrzucona |
Struktura tokena Apple Pay
Token Apple Pay musi mieć następującą strukturę. Dotyczy to zarówno trybu SANDBOX, jak i LIVE.
"***") spowoduje błąd, nawet w trybie SANDBOX. Wymagana struktura tokenów
{
"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"
}
Opisy pól
| Pole | Wymagane | Opis |
|---|---|---|
| paymentData.version | ✓ | Zawsze EC_v1 |
| paymentData.data | ✓ | Dane płatności zakodowane w Base64 od Apple |
| paymentData.signature | ✓ | Podpis Base64 do weryfikacji |
| paymentData.header.ephemeralPublicKey | ✓ | Klucz publiczny Base64 |
| paymentData.header.publicKeyHash | ✓ | Klucz publiczny sprzedawcy w Base64 |
| paymentData.header.transactionId | ✓ | Unikalny identyfikator transakcji |
| paymentMethod.network | ○ | Sieć kart (Visa, Mastercard, Amex) |
| paymentMethod.displayName | ○ | Wyświetl nazwę z Apple Wallet |
✓ = Wymagane | ○ = Polecane
Token testowy
Skopiuj ten token do testów SANDBOX. Zaszyfrowane wartości nie muszą być prawdziwe - walidowana jest tylko struktura.
{
"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"
}
Częste błędy tokenów
| Błąd | Przyczyna | Rozwiązanie |
|---|---|---|
| Invalid token format | Token nie jest obiektem JSON | Wyślij token jako obiekt, nie ciąg |
| Missing paymentData | Token nie ma właściwości paymentData | Dołącz pełny token z Apple Pay JS |
| Missing header fields | Brak ephemeralPublicKey, publicKeyHash lub transactionId | Upewnij się, że wszystkie pola nagłówka są obecne |
Skąd pochodzi token?
W trybie NA ŻYWO token pochodzi z Apple Pay JS, gdy użytkownik autoryzuje płatność:
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
...
})
});
};
Status transakcji
Zrozumienie statusów transakcji i sposobów ich zapytania jest kluczowe dla pełnej integracji.
Statusy Ostatecznych Transakcji
Oto możliwe ostateczne statusy, które otrzymasz za pośrednictwem webhooka lub podczas zapytania do punktu końcowego /details:
Status pośredni
Transakcja została utworzona, ale jest jeszcze przetwarzana. Może się tak zdarzyć, gdy:
- Użytkownik przechodzi uwierzytelnianie 3D Secure
- Płatność jest przetwarzana przez sieć kart
- Użytkownik przerwał proces płatności
Kiedy zapytać o status transakcji?
- Nie otrzymano webhooka w oczekiwanym czasie (np. 5 minut)
- Musisz ręcznie zweryfikować status transakcji
- Twój punkt końcowy webhook był tymczasowo niedostępny
Status transakcji
Aby sprawdzić status transakcji, wykonaj żądanie POST do punktu końcowego szczegółów:
Parametry żądania
| Parametr | Wymagane | Opis |
|---|---|---|
| company_account_id | ✓ | Twoje ID konta partnera MONDO |
| gateway_secret_key | ✓ | Twój klucz tajny MONDO Partner |
| gateway_session_id | ✓ | Identyfikator sesji zwrócony z początkowego żądania płatności |
Przykładowe zapytanie
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"
}'
Przykładowa odpowiedź
{
"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"
}
Odbieranie aktualizacji statusu
Istnieją dwa sposoby otrzymania ostatecznego statusu transakcji:
| Metoda | Jak to działa | Kiedy użyć |
|---|---|---|
| Webhook Polecane | MONDO wysyła żądanie POST do twojego partner_webhook_url |
Główna metoda - automatyczna, w czasie rzeczywistym |
| Redirect URL | Użytkownik jest przekierowany do twojej partner_return_url_completed lub partner_return_url_rejected |
Dla potwierdzenia użytkownika |
| Query /details | Dokonujesz żądania POST, aby sprawdzić status | Awaryjne, jeśli webhook nie został odebrany |
Jeśli transakcja pozostanie ZAINICJOWANA
Jeśli transakcja pozostaje w statusie ZAINICJOWANA przez więcej niż 15 minut, prawdopodobnie oznacza to:
- Użytkownik przerwał wyzwanie 3D Secure
- Użytkownik zamknął przeglądarkę podczas płatności
- Wystąpił problem z siecią podczas przetwarzania
Akcja: Zapytaj punkt końcowy /details, aby uzyskać aktualny status. Te transakcje ostatecznie przekroczą limit czasu i przejdą na status NIEUDANE lub ANULOWANE.