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

Klient
Apple Pay
Ty
MONDO
Gotowe

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
Czego NIE potrzebujesz: Brak konta dewelopera Apple, brak identyfikatora handlowca Apple, brak certyfikatów do zarządzania.

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_tokennie 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
Ważne: Nigdy nie widzisz ani nie obsługujesz surowych numerów kart. Otrzymany od Apple token jest zaszyfrowany i tylko MONDO może go odszyfrować, używając naszego certyfikatu handlowego.

Wybierz metodę integracji

Najlepsze dla: Pełna kontrola nad wyglądem przycisku Apple Pay i doświadczeniem użytkownika na własnej stronie płatności.

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

  1. Idź do GETMONDO.CO
  2. LoginDeveloperApple PayAdd Apple Pay Domain

🔄 Przepływ płatności

1
Użytkownik Klika Przycisk Apple Pay
Na twojej stronie
2
Otwarcie karty Apple Pay
Natywny interfejs Apple Pay
3
Walidacja sprzedawcy
Twoje wywołania JS korzystają z punktu końcowego walidacji MONDO
4
Użytkownik Uwierzytelnia
Face ID / Touch ID
5
Token wysłany do MONDO
POST to /payment/ with apple_pay_token
6
3D Secure i przekierowanie
Użytkownik przekierowany na adres URL sukcesu/porażki

🔗 Punkt końcowy API

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

Punkt weryfikacji sprzedawcy

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

Parametry Walidacji Sprzedawcy

ParametrTypWymaganeOpis
validationURLstring✓ TakURL dostarczony przez Apple w onvalidatemerchant wydarzenie
company_account_idstring✓ TakTwoje ID konta partnera MONDO
gateway_secret_keystring✓ TakTwój klucz tajny MONDO Partner
domain_namestring○ WarunkowyTwoja 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.
Notatka integracyjna serwer-serwer:
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)

ParametrTypOpis
company_account_idstringTwoje ID konta partnera MONDO
gateway_secret_keystringTwój klucz tajny MONDO Partner
apple_pay_tokenobjectZaszyfrowane token z event.payment.token — przejdź bezpośrednio do MONDO tak jak jest (nie odszyfruj)
transaction_amountdecimalKwota płatności (np. 99,99)
transaction_currency_iso3stringKod waluty (EUR, USD, GBP)
cardholder_email_addressstringE-mail klienta

Parametry opcjonalne

ParametrOpis
partner_return_url_completedURL przekierowania po udanej płatności
partner_return_url_rejectedURL przekierowania odrzuconej płatności
partner_webhook_urlURL dla powiadomień webhook
live_or_sandboxlive 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

PoleOpis
statussuccess lub error
transaction_statusCOMPLETED lub REJECTED
gateway_session_idUnikalny identyfikator sesji dla tej transakcji
transaction_idUnikalny identyfikator transakcji - użyj tego do korelacji z wywołaniami zwrotnymi
gateway_messageKomunikat o stanie czytelny dla człowieka
redirect_urlURL przekierowania po płatności (opcjonalnie - tylko dla UX)
Natychmiastowa obróbka
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.

SANDBOX do testowania

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
💡
Kluczowy punkt: Musisz wysłać poprawnie sformatowany token - w takim samym formacie, jak wymagany dla trybu LIVE.
LIVE Do produkcji

Co się dzieje

  • ✅ Struktura tokenu zweryfikowana
  • ✅ Wszystkie wymagane pola zostały sprawdzone
  • ✅ Prawdziwe kryptograficzne deszyfrowanie
  • ✅ Przetwarzanie API Real CardCorp
  • ✅ Pobierane są prawdziwe pieniądze
🔒
Kluczowy punkt: Używaj tylko trybu NA ŻYWO z prawdziwymi tokenami Apple Pay z rzeczywistych urzą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.

🧪
SANDBOX
Test ze sprawdzoną strukturą
Zweryfikowano
Struktura potwierdzona
🚀
LIVE
Działa natychmiast

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

ParametrWartość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.

Ważne: Wysyłanie nieprawidłowej struktury tokenu (jak tylko "***") 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.versionZawsze EC_v1
paymentData.dataDane płatności zakodowane w Base64 od Apple
paymentData.signaturePodpis Base64 do weryfikacji
paymentData.header.ephemeralPublicKeyKlucz publiczny Base64
paymentData.header.publicKeyHashKlucz publiczny sprzedawcy w Base64
paymentData.header.transactionIdUnikalny identyfikator transakcji
paymentMethod.networkSieć kart (Visa, Mastercard, Amex)
paymentMethod.displayNameWyś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:

COMPLETED
Płatność zakończona успешно
REJECTED
Płatność odrzucona przez procesor
CANCELED
Użytkownik anulował płatność
FAILED
Wystąpił błąd techniczny

Status pośredni

INITIATED

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?

Najlepsza praktyka: Zawsze polegaj na webhookach jako głównej metodzie powiadomień. Odpytuj punkt końcowy /details tylko w przypadku awarii, jeśli:
  • 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:

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

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.