Genel Bakış

Nedir

MONDO üzerinden Apple Pay ödemelerini kabul et

Ne Gerekir

MONDO Hesap ID + Gizli Anahtar

Gönderdikleriniz

Apple Pay belirteci + miktar + para birimi

Ne Kazanırsınız

TAMAMLANDI veya REDDEDİLDİ durumu

Nasıl Çalışır

Müşteri
Apple Pay
Sen
MONDO
Tamamlandı

Seçenek A: Kendi Sunucunda

Sitenizde Apple Pay düğmesini gösterin ve bize belirteci gönderin

Seçenek B: MONDO-Barındırılan

Her şeyi biz hallederiz - müşterinizi bize yönlendirin

Hızlı Başlat (Kendi Sunucunda)

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

Apple Pay Hakkında

Apple Pay, müşterilerin hızlı, güvenli ve özel bir şekilde ödeme yapmalarını sağlar. MONDO'yu Ödeme Hizmet Sağlayıcınız (PSP) olarak kullanarak, kendi Apple Geliştirici hesabınıza ihtiyaç duymadan Apple Pay'i kabul edebilirsiniz.

MONDO PSP'niz Olarak

  • MONDO, Apple Satıcı Kimliğine sahiptir
  • MONDO, Apple Pay sertifikalarını yönetir
  • MONDO tüccar doğrulamasını yönetir
  • MONDO ödeme simgelerini çözümler ve işler
İhtiyacınız OLMAYANLAR: Apple Geliştirici Hesabı yok, Apple Ticaret Kimliği yok, yönetilecek sertifika yok.

Jeton Yönetimi — Kim Ne Yapar?

Apple Pay, kart sahibi verilerini korumak için uçtan uca şifreleme kullanır. Sorumlulukların nasıl paylaşıldığı işte böyle:

Apple (Müşterinin Cihazı) Kart bilgileri, kriptogram ve kimlik doğrulama detaylarını içeren şifreli ödeme belirteci oluşturur
Siz (Tüccar) Şifreli belirteci doğrudan MONDO'ya apple_pay_token parametresi üzerinden iletin — şifresini çözmeye çalışmayın
MONDO (PSP) Belirteci çöz Apple Pay Ödeme İşleme Sertifikamızı kullanarak ve CardCorp ile ödemeyi işle
Önemli: Kart numaralarını asla görmez veya ellemezsiniz. Apple'dan aldığınız belirteç şifrelenmiştir ve yalnızca MONDO tarafından tüccar sertifikamız kullanılarak şifresi çözülebilir.

Entegrasyon Yönteminizi Seçin

En İyi İçin: Apple Pay düğmesinin görünümü ve kullanıcı deneyimi üzerinde tam kontrol, kendi ödeme sayfanızda.

📋 Önkoşullar

  • Ortak Hesap Kimliği - Benzersiz MONDO hesap kimliğiniz
  • Ortak Gizli Anahtar - API kimlik doğrulama anahtarınız
  • HTTPS - Web siteniz HTTPS kullanmalıdır

⚠️ Alan Doğrulama Gerekiyor

Apple üzerinden MONDO ile alan adınızın kaydedilmesi gerekmektedir. Bu, tek seferlik bir kurulumdur.

  1. Git GETMONDO.CO
  2. LoginDeveloperApple PayAdd Apple Pay Domain

🔄 Ödeme Akışı

1
Kullanıcı Apple Pay'e Tıkladı
Web sitenizde
2
Apple Pay Sayfası Açılıyor
Yerel Apple Pay arayüzü
3
Satıcı Doğrulama
JS çağrılarınız MONDO'nun doğrulama uç noktasını kullanıyor
4
Kullanıcı Doğruluyor
Face ID / Touch ID
5
MONDO'ya Jeton Gönderildi
POST to /payment/ with apple_pay_token
6
3D Güvenlik & Yönlendirme
Kullanıcı başarı/başarısızlık URL'sine yönlendirildi

🔗 API Noktası

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

Tüccar Doğrulama Uç Noktası

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

Tüccar Doğrulama Parametreleri

ParametreTürGerekliAçıklama
validationURLstring✓ EvetApple tarafından sağlanan URL onvalidatemerchant etkinlik
company_account_idstring✓ EvetMONDO Ortak Hesap Kimliğiniz
gateway_secret_keystring✓ EvetMONDO Ortak Gizli Anahtarınız
domain_namestring○ KoşulluApple Pay alanınız (örn. paynow.yoursite.com). Tarayıcı Origin başlığı mevcut olmadığında sunucudan sunucuya çağrılarda gereklidir. Tarayıcıdan doğrudan çağrı yapıyorsanız gerekli değildir.
Sunucudan Sunucuya Entegrasyon Notu:
Arka uç sunucunuz tüccar doğrulama çağrısını proxy'liyorsa (yani sunucunuz doğrudan tarayıcı yerine MONDO'yu arıyorsa), dahil etmelisiniz domain_name Apple Pay düğmenizin görüntülendiği alana ayarlayın. Bu, Apple Pay oturumunun ödeme sayfası alanınızla eşleşmesini sağlar.

📝 Gerekli Parametreler (Ödeme İşleme)

ParametreTürAçıklama
company_account_idstringMONDO Ortak Hesap Kimliğiniz
gateway_secret_keystringMONDO Ortak Gizli Anahtarınız
apple_pay_tokenobjectŞifreli jeton kaynaklı event.payment.token — pass directly to MONDO as-is (şifreyi çözme)
transaction_amountdecimalÖdeme tutarı (örn., 99.99)
transaction_currency_iso3stringPara Birimi Kodu (EUR, USD, GBP)
cardholder_email_addressstringMüşteri E-postası

İsteğe Bağlı Parametreler

ParametreAçıklama
partner_return_url_completedBaşarılı ödeme yönlendirmesi için URL
partner_return_url_rejectedÖdeme Reddi Yönlendirme URL'si
partner_webhook_urlWeb kancası bildirimleri için URL
live_or_sandboxlive veya sandbox

📤 API Yanıtı

Apple Pay ödemeleri hemen işlenir. Yanıt, son işlem durumunu içerir:

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

Yanıt Alanları

AlanAçıklama
statussuccess veya error
transaction_statusCOMPLETED veya REJECTED
gateway_session_idBu işlem için benzersiz oturum tanımlayıcısı
transaction_idBenzersiz işlem tanımlayıcısı - bunu geri çağırmalarla ilişkilendirmek için kullanın
gateway_messageİnsan tarafından okunabilir durum mesajı
redirect_urlÖdeme sonrası yönlendirilecek URL (isteğe bağlı - sadece Kullanıcı Deneyimi için)
Anında İşleme
3D Secure yönlendirmesi gerektiren kart ödemelerinin aksine, Apple Pay işlemleri anında işlenir. Yanıtı aldığınızda ödeme zaten tamamlanmış olur.

🍎 Apple Pay JS Entegrasyonu

Adım 1: Apple Pay Butonu Ekle

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

Adım 2: Müsaitliği Kontrol Et

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

Adım 3: Uygulamayı Tamamla

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

Test Modları

MONDO iki test modunu destekler. Farkı anlamak başarılı entegrasyon için hayati önem taşır.

SANDBOX için test

Ne Olur

  • ✅ Jeton yapısı doğrulandı
  • ✅ Tüm gerekli alanlar kontrol edildi
  • ⏭️ Şifre çözme atlandı (simülasyon verisi döndürüldü)
  • ⏭️ CardCorp API çağrısı atlandı
  • ✅ Ödeme işlemi tamamlandı
💡
Ana Nokta: Canlı mod için gereken aynı formatla düzgün yapılandırılmış bir belirteç göndermelisiniz.
LIVE Üretim İçin

Ne Olur

  • ✅ Jeton yapısı doğrulandı
  • ✅ Tüm gerekli alanlar kontrol edildi
  • ✅ Gerçek kriptografik şifre çözme
  • ✅ Gerçek CardCorp API işleme
  • ✅ Gerçek para tahsil edilir
🔒
Ana Nokta: Gerçek cihazlardan gelen gerçek Apple Pay jetonları ile yalnızca CANLI modu kullanın.

🎯 Neden SANDBOX Aynı Token Yapısını Gerektirir

Bu tasarım, SANDBOX'tan LIVE'a geçtiğinizde, entegrasyonunuzun kod değişiklikleri olmadan hemen çalışmasını sağlar.

🧪
SANDBOX
Geçerli yapı ile test
Doğrulandı
Yapı onaylandı
🚀
LIVE
Hemen çalışır

⚙️ Mod Ayarı

Dahil Et live_or_sandbox API isteğinizdeki parametre:

{
    "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: İşlem Sonucunu Zorla

SANDBOX modunda, test için belirli bir işlem sonucunu zorlayabilirsiniz:

ParametreDeğerSonuç
sandbox_force_transaction_status COMPLETED ✅ Ödeme onaylandı
sandbox_force_transaction_status REJECTED ❌ Ödeme reddedildi

Apple Pay Token Yapısı

Apple Pay belirteci aşağıdaki yapıya sahip olmalıdır. Bu, hem SANDBOX hem de CANLI modlar için aynıdır.

Önemli: Geçersiz bir simge yapısı gönderiliyor (sadece gibi "***") hata oluşturacak, SANDBOX modunda bile.

Gerekli Jeton Yapısı

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

Alan Açıklamaları

Alan Gerekli Açıklama
paymentData.versionHer Zaman EC_v1
paymentData.dataApple'dan Base64 şifreli ödeme verileri
paymentData.signatureDoğrulama için Base64 imzası
paymentData.header.ephemeralPublicKeyBase64 geçici genel anahtar
paymentData.header.publicKeyHashTüccarın genel anahtarının Base64 hash'i
paymentData.header.transactionIdEşsiz işlem tanımlayıcısı
paymentMethod.networkKart ağı (Visa, Mastercard, Amex)
paymentMethod.displayNameApple Cüzdanından Görüntüle Adı

= Gerekli  |  = Önerilen

Kum Test Jetonu

Bu belirteci KUM HAVUZU testi için kopyalayın. Şifrelenmiş değerler gerçek olmak zorunda değil - yalnızca yapı doğrulanır.

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

Yaygın Jeton Hataları

Hata Neden Çözüm
Invalid token format JSON nesnesi değil Nesne olarak gönder, metin değil
Missing paymentData Jetonun paymentData özelliği yok Apple Pay JS'den tam tokeni dahil et
Missing header fields geçiciPublicKey, publicKeyHash veya transactionId eksik Tüm başlık alanlarının mevcut olduğundan emin olun

Jeton Nereden Geliyor?

CANLI modunda, kullanıcı ödeme yetkisini verdiğinde belirteç Apple Pay JS'den gelir:

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

İşlem Durumu

Tam entegrasyon için işlem durumlarını anlamak ve sorgulamak esastır.

Son İşlem Durumları

Bu, webhook aracılığıyla veya /details uç noktasını sorgularken alacağınız olası son durumlar:

COMPLETED
Ödeme başarılı
REJECTED
İşlemci tarafından ödeme reddedildi
CANCELED
Ödeme iptal edildi
FAILED
Teknik hata oluştu

Ara Durum

INITIATED

İşlem oluşturuldu ancak hala işleniyor. Bu, şu durumlarda olabilir:

  • Kullanıcı 3D Secure doğrulamasını tamamlıyor
  • Kart ağı tarafından ödeme işleniyor
  • Ödeme işleminden vazgeçildi

Ne Zaman İşlem Durumunu Sorgulamalısınız?

En İyi Uygulama: Her zaman birincil bildirim yöntemi olarak web kancalarına güvenin. Yalnızca şu durumlarda /details uç noktasını yedek olarak sorgulayın:
  • Beklenen sürede bir webhook alınmadı (örn., 5 dakika)
  • İşlem durumunu manuel olarak doğrulamanız gerekiyor
  • Web kancanız geçici olarak kullanılamıyor

İşlem Durumu Sorgula

Bir işlemin durumunu kontrol etmek için, detaylar uç noktasına bir POST isteği yapın:

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

İstek Parametreleri

Parametre Gerekli Açıklama
company_account_id MONDO Ortak Hesap Kimliğiniz
gateway_secret_key MONDO Ortak Gizli Anahtarınız
gateway_session_id İlk ödeme isteğinden dönen oturum kimliği

Örnek İstek

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

Örnek Yanıt

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

Durum Güncellemeleri Alınıyor

İşlem durumunu almanın iki yolu vardır:

Yöntem Nasıl Çalışır Ne Zaman Kullanılır
Webhook Önerilen MONDO bir POST isteği gönderiyor partner_webhook_url Birincil yöntem - otomatik, gerçek zamanlı
Redirect URL Kullanıcı yönlendirildi partner_return_url_completed veya partner_return_url_rejected Kullanıcı onayı için
Query /details Durum kontrolü için POST isteği yapın Webhook alınamazsa geri dön

İşlem BAŞLATILDI Olarak Kalırsa

Bir işlem 15 dakikadan fazla BAŞLATILDI durumunda kalırsa, bu muhtemelen şu anlama gelir:

  • Kullanıcı 3D Secure görevini terk etti
  • Kullanıcı ödeme sırasında tarayıcısını kapattı
  • İşlem sırasında bir ağ sorunu oluştu

Eylem: /detaylar uç noktasını sorgulayarak güncel durumu öğrenin. Bu işlemler sonunda zaman aşımına uğrayacak ve BAŞARISIZ veya İPTAL durumuna geçecektir.