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
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
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 |
Entegrasyon Yönteminizi Seçin
📋 Ö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.
- Git GETMONDO.CO
- Login → Developer → Apple Pay → Add Apple Pay Domain
🔄 Ödeme Akışı
Web sitenizde
Yerel Apple Pay arayüzü
JS çağrılarınız MONDO'nun doğrulama uç noktasını kullanıyor
Face ID / Touch ID
POST to /payment/ with apple_pay_token
Kullanıcı başarı/başarısızlık URL'sine yönlendirildi
🔗 API Noktası
Tüccar Doğrulama Uç Noktası
Tüccar Doğrulama Parametreleri
| Parametre | Tür | Gerekli | Açıklama |
|---|---|---|---|
| validationURL | string | ✓ Evet | Apple tarafından sağlanan URL onvalidatemerchant etkinlik |
| company_account_id | string | ✓ Evet | MONDO Ortak Hesap Kimliğiniz |
| gateway_secret_key | string | ✓ Evet | MONDO Ortak Gizli Anahtarınız |
| domain_name | string | ○ Koşullu | Apple 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. |
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)
| Parametre | Tür | Açıklama |
|---|---|---|
| company_account_id | string | MONDO Ortak Hesap Kimliğiniz |
| gateway_secret_key | string | MONDO Ortak Gizli Anahtarınız |
| apple_pay_token | object | Şifreli jeton kaynaklı event.payment.token — pass directly to MONDO as-is (şifreyi çözme) |
| transaction_amount | decimal | Ödeme tutarı (örn., 99.99) |
| transaction_currency_iso3 | string | Para Birimi Kodu (EUR, USD, GBP) |
| cardholder_email_address | string | Müşteri E-postası |
İsteğe Bağlı Parametreler
| Parametre | Açıklama |
|---|---|
| partner_return_url_completed | Başarılı ödeme yönlendirmesi için URL |
| partner_return_url_rejected | Ödeme Reddi Yönlendirme URL'si |
| partner_webhook_url | Web kancası bildirimleri için URL |
| live_or_sandbox | live 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ı
| Alan | Açıklama |
|---|---|
| status | success veya error |
| transaction_status | COMPLETED veya REJECTED |
| gateway_session_id | Bu işlem için benzersiz oturum tanımlayıcısı |
| transaction_id | Benzersiz 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) |
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.
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ı
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
🎯 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.
⚙️ 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:
| Parametre | Değer | Sonuç |
|---|---|---|
| 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.
"***") 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.version | ✓ | Her Zaman EC_v1 |
| paymentData.data | ✓ | Apple'dan Base64 şifreli ödeme verileri |
| paymentData.signature | ✓ | Doğrulama için Base64 imzası |
| paymentData.header.ephemeralPublicKey | ✓ | Base64 geçici genel anahtar |
| paymentData.header.publicKeyHash | ✓ | Tüccarın genel anahtarının Base64 hash'i |
| paymentData.header.transactionId | ✓ | Eşsiz işlem tanımlayıcısı |
| paymentMethod.network | ○ | Kart ağı (Visa, Mastercard, Amex) |
| paymentMethod.displayName | ○ | Apple 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:
Ara Durum
İş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?
- 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:
İ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.