نظرة عامة

ما هو

قبول مدفوعات Apple Pay عبر MONDO

ما تحتاجه

معرف حساب MONDO + المفتاح السري

ما ترسله

رمز Apple Pay + المبلغ + العملة

ما تحصل عليه

حالة مكتملة أو مرفوضة

كيف يعمل

عميل
Apple Pay
أنت
MONDO
تم

الخيار أ: استضافة ذاتية

أنت تعرض زر 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
مهم: لن ترى أو تتعامل مع أرقام البطاقات الخام أبدًا. الرمز الذي تتلقاه من Apple مشفر ولا يمكن فك تشفيره إلا بواسطة MONDO باستخدام شهادة التاجر الخاصة بنا.

اختر طريقة التكامل

الأفضل لـ: التحكم الكامل في مظهر زر Apple Pay وتجربة المستخدم على صفحة الدفع الخاصة بك.

📋 المتطلبات الأساسية

  • معرف حساب الشريك - معرف حسابك الفريد في MONDO
  • مفتاح الشريك السري - مفتاح مصادقة API الخاص بك
  • HTTPS - يجب أن يستخدم موقعك HTTPS

⚠️ مطلوب التحقق من النطاق

يجب تسجيل نطاقك مع Apple من خلال MONDO. هذه إعداد لمرة واحدة.

  1. اذهب إلى GETMONDO.CO
  2. LoginDeveloperApple PayAdd Apple Pay Domain

🔄 تدفق الدفع

1
المستخدم ينقر على زر Apple Pay
على موقعك الإلكتروني
2
تفتح صفحة Apple Pay
واجهة Apple Pay الأصلية
3
التحقق من التاجر
نداء JS الخاص بك يستدعي نقطة التحقق من MONDO
4
المستخدم يتحقق
Face ID / Touch ID
5
تم إرسال الرمز إلى MONDO
POST to /payment/ with apple_pay_token
6
التأمين ثلاثي الأبعاد وإعادة التوجيه
تم توجيه المستخدم إلى عنوان URL للنجاح/الفشل

🔗 نقطة نهاية API

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

نقطة تحقق التاجر

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

معايير التحقق من التاجر

معاملنوعمطلوبالوصف
validationURLstring✓ نعمعنوان URL الذي قدمته Apple onvalidatemerchant حدث
company_account_idstring✓ نعمرقم حساب شريك MONDO الخاص بك
gateway_secret_keystring✓ نعممفتاح الشريك السري لـ MONDO
domain_namestring○ شرطينطاق Apple Pay الخاص بك (مثل. paynow.yoursite.com). مطلوب لمكالمات الخادم إلى الخادم حيث لا يتوفر رأس المنشأ في المتصفح. غير مطلوب إذا كان الاتصال مباشرة من المتصفح.
ملاحظة التكامل بين الخوادم:
إذا كان الخادم الخلفي الخاص بك يعمل كوكيل لمكالمة التحقق من التاجر (أي أن الخادم الخاص بك يتصل بـ MONDO بدلاً من الاتصال المباشر عبر المتصفح)، يجب أن تشمل domain_name تعيين إلى المجال الذي يظهر فيه زر Apple Pay الخاص بك. يضمن ذلك تطابق جلسة Apple Pay مع نطاق صفحة الدفع الخاصة بك.

📝 المعاملات المطلوبة (معالجة الدفع)

معاملنوعالوصف
company_account_idstringرقم حساب شريك MONDO الخاص بك
gateway_secret_keystringمفتاح الشريك السري لـ MONDO
apple_pay_tokenobjectمشفرة رمز من event.payment.token — pass directly to MONDO as-is (لا تفك الشفرة)
transaction_amountdecimalمبلغ الدفع (مثلاً، 99.99)
transaction_currency_iso3stringرمز العملة (EUR, USD, GBP)
cardholder_email_addressstringبريد العميل الإلكتروني

المعاملات الاختيارية

معاملالوصف
partner_return_url_completedعنوان URL لإعادة التوجيه بعد الدفع الناجح
partner_return_url_rejectedعنوان URL لإعادة التوجيه للدفع المرفوض
partner_webhook_urlعنوان URL لإشعارات الويبhooks
live_or_sandboxlive أو 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"
}

حقول الاستجابة

حقلالوصف
statussuccess أو error
transaction_statusCOMPLETED أو 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 يدعم وضعين للاختبار. فهم الفرق أمر حاسم للتكامل الناجح.

SANDBOX للتجربة

ماذا يحدث

  • ✅ تم التحقق من بنية الرمز
  • ✅ تم التحقق من جميع الحقول المطلوبة
  • ⏭️ تم تخطي فك التشفير (تم إرجاع بيانات وهمية)
  • ⏭️ تم تخطي استدعاء واجهة برمجة تطبيقات CardCorp
  • ✅ تم تنفيذ عملية الدفع بالكامل
💡
نقطة رئيسية: يجب أن ترسل رمزًا مهيكلاً بشكل صحيح - بنفس التنسيق المطلوب لوضع التشغيل الفعلي.
LIVE للإنتاج

ماذا يحدث

  • ✅ تم التحقق من بنية الرمز
  • ✅ تم التحقق من جميع الحقول المطلوبة
  • ✅ فك تشفير حقيقي
  • ✅ معالجة واجهة برمجة تطبيقات كاردكورب الحقيقية
  • ✅ يتم تحصيل أموال حقيقية
🔒
نقطة رئيسية: استخدم وضع LIVE فقط مع رموز Apple Pay الحقيقية من أجهزة فعلية.

🎯 لماذا يتطلب SANDBOX نفس هيكل الرمز

هذا التصميم يضمن أنه عند التحويل من وضع التجريبي إلى الوضع الحي، تعمل الإدماجات فورًا دون تغييرات في الكود.

🧪
SANDBOX
اختبار بتركيبة صحيحة
مُصدّق
تم تأكيد الهيكل
🚀
LIVE
يعمل فورًا

⚙️ تعيين الوضع

شمل 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:

COMPLETED
دفع ناجح
REJECTED
تم رفض الدفع من قبل المعالج
CANCELED
تم إلغاء الدفع من قبل المستخدم
FAILED
حدث خطأ تقني

حالة متوسطة

INITIATED

تم إنشاء العملية ولكن لا تزال قيد المعالجة. يمكن أن يحدث هذا عندما:

  • المستخدم يكمل التحقق الأمني 3D
  • يتم معالجة الدفع بواسطة شبكة البطاقة
  • المستخدم ترك عملية الدفع

متى يجب استعلام حالة المعاملة؟

أفضل ممارسة: اعتمد دائمًا على الويب هوكس كطريقة إشعار أساسية. استعلم فقط عن نقطة النهاية /details كخطة بديلة إذا:
  • لم تتلقَ webhook خلال الوقت المتوقع (مثلاً، 5 دقائق)
  • تحتاج إلى التحقق من حالة المعاملة يدويًا
  • نقطة الوصول الخاصة بكانت غير متاحة مؤقتًا

استعلام عن حالة المعاملة

للتحقق من حالة المعاملة، قم بإرسال طلب POST إلى نقطة النهاية للتفاصيل:

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

معاملات الطلب

معامل مطلوب الوصف
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 للحصول على الحالة الحالية. ستنتهي هذه المعاملات في النهاية بالمهلة وتنتقل إلى حالة فشل أو إلغاء.