نظرة عامة
ما هو
قبول مدفوعات Apple Pay عبر MONDO
ما تحتاجه
معرف حساب MONDO + المفتاح السري
ما ترسله
رمز Apple Pay + المبلغ + العملة
ما تحصل عليه
حالة مكتملة أو مرفوضة
كيف يعمل
الخيار أ: استضافة ذاتية
أنت تعرض زر Apple Pay على موقعك وترسل لنا الرمز
الخيار ب: استضافة MONDO
نحن نتولى كل شيء - فقط قم بتوجيه عميلك إلينا
بدء سريع (ذاتي الاستضافة)
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
Apple Pay يوفر طريقة سريعة وآمنة وخاصة للعملاء للدفع. مع MONDO كمزود خدمة الدفع (PSP) الخاص بك، يمكنك قبول Apple Pay دون الحاجة إلى حساب مطور Apple خاص بك.
MONDO كـ PSP الخاص بك
- ✓ MONDO يمتلك معرف التاجر الخاص بـApple
- ✓ MONDO يدير شهادات Apple Pay
- ✓ MONDO يتولى التحقق من التاجر
- ✓ MONDO يفك تشفير ويعالج رموز الدفع
معالجة الرمز — من يقوم بماذا؟
يستخدم Apple Pay التشفير من طرف إلى طرف لحماية بيانات حامل البطاقة. إليك كيفية تقسيم المسؤوليات:
| تفاحة (جهاز العميل) | يولد رمز دفع مشفر يحتوي على بيانات البطاقة، الشفرة، وتفاصيل التوثيق |
| أنت (التاجر) | قم بتمرير الرمز المشفر مباشرة إلى MONDO عبر معامل apple_pay_token — لا تحاول فك التشفير |
| موندو (PSP) | يفك تشفير الرمز باستخدام شهادة معالجة الدفع الخاصة بـ Apple Pay ويعالج الدفع مع CardCorp |
اختر طريقة التكامل
📋 المتطلبات الأساسية
- ✓ معرف حساب الشريك - معرف حسابك الفريد في MONDO
- ✓ مفتاح الشريك السري - مفتاح مصادقة API الخاص بك
- ✓ HTTPS - يجب أن يستخدم موقعك HTTPS
⚠️ مطلوب التحقق من النطاق
يجب تسجيل نطاقك مع Apple من خلال MONDO. هذه إعداد لمرة واحدة.
- اذهب إلى GETMONDO.CO
- Login → Developer → Apple Pay → Add Apple Pay Domain
🔄 تدفق الدفع
على موقعك الإلكتروني
واجهة Apple Pay الأصلية
نداء JS الخاص بك يستدعي نقطة التحقق من MONDO
Face ID / Touch ID
POST to /payment/ with apple_pay_token
تم توجيه المستخدم إلى عنوان URL للنجاح/الفشل
🔗 نقطة نهاية API
نقطة تحقق التاجر
معايير التحقق من التاجر
| معامل | نوع | مطلوب | الوصف |
|---|---|---|---|
| validationURL | string | ✓ نعم | عنوان URL الذي قدمته Apple onvalidatemerchant حدث |
| company_account_id | string | ✓ نعم | رقم حساب شريك MONDO الخاص بك |
| gateway_secret_key | string | ✓ نعم | مفتاح الشريك السري لـ MONDO |
| domain_name | string | ○ شرطي | نطاق Apple Pay الخاص بك (مثل. paynow.yoursite.com). مطلوب لمكالمات الخادم إلى الخادم حيث لا يتوفر رأس المنشأ في المتصفح. غير مطلوب إذا كان الاتصال مباشرة من المتصفح. |
إذا كان الخادم الخلفي الخاص بك يعمل كوكيل لمكالمة التحقق من التاجر (أي أن الخادم الخاص بك يتصل بـ MONDO بدلاً من الاتصال المباشر عبر المتصفح)، يجب أن تشمل
domain_name تعيين إلى المجال الذي يظهر فيه زر Apple Pay الخاص بك. يضمن ذلك تطابق جلسة Apple Pay مع نطاق صفحة الدفع الخاصة بك. 📝 المعاملات المطلوبة (معالجة الدفع)
| معامل | نوع | الوصف |
|---|---|---|
| company_account_id | string | رقم حساب شريك MONDO الخاص بك |
| gateway_secret_key | string | مفتاح الشريك السري لـ MONDO |
| apple_pay_token | object | مشفرة رمز من event.payment.token — pass directly to MONDO as-is (لا تفك الشفرة) |
| transaction_amount | decimal | مبلغ الدفع (مثلاً، 99.99) |
| transaction_currency_iso3 | string | رمز العملة (EUR, USD, GBP) |
| cardholder_email_address | string | بريد العميل الإلكتروني |
المعاملات الاختيارية
| معامل | الوصف |
|---|---|
| partner_return_url_completed | عنوان URL لإعادة التوجيه بعد الدفع الناجح |
| partner_return_url_rejected | عنوان URL لإعادة التوجيه للدفع المرفوض |
| partner_webhook_url | عنوان URL لإشعارات الويبhooks |
| live_or_sandbox | live أو sandbox |
📤 استجابة API
تتم معالجة مدفوعات Apple Pay على الفور. الرد يحتوي على حالة المعاملة النهائية:
{
"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"
}
حقول الاستجابة
| حقل | الوصف |
|---|---|
| status | success أو error |
| transaction_status | COMPLETED أو REJECTED |
| gateway_session_id | معرف الجلسة الفريد لهذه المعاملة |
| transaction_id | معرف المعاملة الفريد - استخدم هذا للربط مع ردود الاتصال |
| gateway_message | رسالة حالة قابلة للقراءة |
| redirect_url | رابط URL لإعادة توجيه المستخدم بعد الدفع (اختياري - لتجربة المستخدم فقط) |
على عكس مدفوعات البطاقات التي تتطلب إعادة توجيه 3D Secure، يتم معالجة معاملات Apple Pay على الفور. يكون الدفع مكتملًا بالفعل عندما تتلقى الرد.
🍎 تكامل Apple Pay JS
الخطوة 1: إضافة زر Apple Pay
<apple-pay-button buttonstyle="black" type="plain" locale="en" onclick="startApplePayPayment()"></apple-pay-button>
الخطوة 2: تحقق من التوفر
if (window.ApplePaySession && ApplePaySession.canMakePayments()) {
document.getElementById('apple-pay-button').style.display = 'block';
}
الخطوة 3: إكمال التنفيذ
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();
}
أوضاع الاختبار
MONDO يدعم وضعين للاختبار. فهم الفرق أمر حاسم للتكامل الناجح.
ماذا يحدث
- ✅ تم التحقق من بنية الرمز
- ✅ تم التحقق من جميع الحقول المطلوبة
- ⏭️ تم تخطي فك التشفير (تم إرجاع بيانات وهمية)
- ⏭️ تم تخطي استدعاء واجهة برمجة تطبيقات CardCorp
- ✅ تم تنفيذ عملية الدفع بالكامل
ماذا يحدث
- ✅ تم التحقق من بنية الرمز
- ✅ تم التحقق من جميع الحقول المطلوبة
- ✅ فك تشفير حقيقي
- ✅ معالجة واجهة برمجة تطبيقات كاردكورب الحقيقية
- ✅ يتم تحصيل أموال حقيقية
🎯 لماذا يتطلب SANDBOX نفس هيكل الرمز
هذا التصميم يضمن أنه عند التحويل من وضع التجريبي إلى الوضع الحي، تعمل الإدماجات فورًا دون تغييرات في الكود.
⚙️ تعيين الوضع
شمل live_or_sandbox معامل في طلب 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_force_transaction_status | COMPLETED |
✅ تمت الموافقة على الدفع |
| sandbox_force_transaction_status | REJECTED |
❌ تم رفض الدفع |
هيكل رمز Apple Pay
يجب أن يكون لرمز Apple Pay الهيكل التالي. هذا متساوٍ لكلا الوضعين SANDBOX و LIVE.
"***") سيؤدي إلى خطأ، حتى في وضع SANDBOX. هيكل الرمز المطلوب
{
"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"
}
وصف الحقول
| حقل | مطلوب | الوصف |
|---|---|---|
| paymentData.version | ✓ | دائمًا EC_v1 |
| paymentData.data | ✓ | بيانات الدفع المشفرة بنظام Base64 من Apple |
| paymentData.signature | ✓ | توقيع Base64 للتحقق |
| paymentData.header.ephemeralPublicKey | ✓ | مفتاح عام مؤقت بترميز Base64 |
| paymentData.header.publicKeyHash | ✓ | تجزئة Base64 لمفتاح التاجر العام |
| paymentData.header.transactionId | ✓ | معرف المعاملة الفريد |
| paymentMethod.network | ○ | شبكة البطاقات (فيزا، ماستركارد، أميكس) |
| paymentMethod.displayName | ○ | اسم العرض من محفظة أبل |
✓ = مطلوب | ○ = موصى به
رمز اختبار الصندوق الرمل
انسخ هذا الرمز لاختبار SANDBOX. لا تحتاج القيم المشفرة إلى أن تكون حقيقية - يتم التحقق من الهيكل فقط.
{
"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"
}
أخطاء الرموز المشتركة
| خطأ | سبب | الحل |
|---|---|---|
| Invalid token format | الرمز ليس كائن JSON | أرسل الرمز ككائن، ليس كنص |
| Missing paymentData | الرمز لا يحتوي على خاصية بيانات الدفع | تضمين الرمز الكامل من Apple Pay JS |
| Missing header fields | مفتاح عام زائل، تجزئة المفتاح العام، أو معرف المعاملة مفقود | تأكد من وجود جميع حقول العنوان |
من أين يأتي الرمز؟
في وضع مباشر، يأتي الرمز من Apple Pay JS عندما يُصرح المستخدم بالدفع:
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
...
})
});
};
حالة المعاملة
فهم حالات المعاملة وكيفية الاستعلام عنها أمر ضروري للتكامل الكامل.
حالات المعاملة النهائية
هذه هي الحالات النهائية الممكنة التي ستتلقاها عبر webhook أو عند الاستعلام عن نقطة النهاية /details:
حالة متوسطة
تم إنشاء العملية ولكن لا تزال قيد المعالجة. يمكن أن يحدث هذا عندما:
- المستخدم يكمل التحقق الأمني 3D
- يتم معالجة الدفع بواسطة شبكة البطاقة
- المستخدم ترك عملية الدفع
متى يجب استعلام حالة المعاملة؟
- لم تتلقَ webhook خلال الوقت المتوقع (مثلاً، 5 دقائق)
- تحتاج إلى التحقق من حالة المعاملة يدويًا
- نقطة الوصول الخاصة بكانت غير متاحة مؤقتًا
استعلام عن حالة المعاملة
للتحقق من حالة المعاملة، قم بإرسال طلب POST إلى نقطة النهاية للتفاصيل:
معاملات الطلب
| معامل | مطلوب | الوصف |
|---|---|---|
| company_account_id | ✓ | رقم حساب شريك MONDO الخاص بك |
| gateway_secret_key | ✓ | مفتاح الشريك السري لـ MONDO |
| gateway_session_id | ✓ | معرف الجلسة الذي تم إرجاعه من طلب الدفع الأولي |
طلب مثال
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"
}'
مثال على الرد
{
"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"
}
تحديثات الحالة
هناك طريقتان لاستلام حالة المعاملة النهائية:
| طريقة | كيف يعمل | متى تستخدم |
|---|---|---|
| Webhook موصى به | MONDO يرسل طلب POST إلى partner_webhook_url |
الطريقة الأساسية - تلقائية، فورية |
| Redirect URL | المستخدم يتم توجيهه إلى صفحتك partner_return_url_completed أو partner_return_url_rejected |
للتأكيد من المستخدم |
| Query /details | أنت تقوم بطلب POST للتحقق من الحالة | استخدام بديل إذا لم يتم استلام الويب هوك |
إذا بقيت العملية مُبادرة
إذا بقيت العملية في حالة "تم البدء" لأكثر من 15 دقيقة، فهذا يعني على الأرجح:
- المستخدم تخلى عن تحدي الأمان ثلاثي الأبعاد
- المستخدم أغلق المتصفح أثناء الدفع
- حدث خطأ في الشبكة أثناء المعالجة
الإجراء: استعلم عن نقطة النهاية /details للحصول على الحالة الحالية. ستنتهي هذه المعاملات في النهاية بالمهلة وتنتقل إلى حالة فشل أو إلغاء.