مسار الدفع
من إنشاء الدفعة حتى التأكد منها، ولماذا لا تكفي إعادة التوجيه وحدها دليلاً.
تمر الدفعة بأربعة أطراف: خادمك، ومتصفح العميل، والجسر، ومزوّد الدفع (APS اليوم، أو المحاكي في الوضع التجريبي). تتبع هذه الصفحة دفعة واحدة من بدايتها إلى نهايتها.
الخطوات
-
ينشئ خادمك الدفعة. عبر
POST /api/v1/paymentsبالمبلغ ومرجع طلبكorder_reference، ومعهreturn_urlإن شئت. يفتح الجسر الدفعة لدى المزوّد ويرد بـ201ودفعة بحالةpendingومعهاcheckout_url. -
تحوّل العميل إلى
checkout_url. تعرض صفحة الدفع المستضافة اسم تطبيقك وشعاره والمبلغ بالدينار ومرجع الطلب، بالعربية أو الإنجليزية (حسبlocaleفي الدفعة، أو اختيار العميل في الصفحة). يضغط العميل «ادفع» أو يلغي. -
يدفع العميل في صفحة المزوّد. ينقل الجسر العميل إلى صفحة البطاقة الآمنة لدى المزوّد، فلا تمر بيانات البطاقة أبداً عبر الجسر أو عبر تطبيقك.
-
يعود العميل عبر الجسر. يعيد المزوّد العميل إلى الجسر، فيسأل الجسر المزوّد عن النتيجة فوراً. وإن لم يحسم المزوّد النتيجة بعد، يرى العميل صفحة قصيرة «جارٍ تأكيد الدفع» تعيد التحقق كل 3 ثوانٍ لنحو 30 ثانية.
-
يحوّل الجسر العميل إلى
return_urlمع إضافةpayment_idوstatusوorder_referenceإلى الرابط:texthttps://shop.example/return?payment_id=01a13c8c-8592-70f4-9ef9-d3767e74d54c&status=paid&order_reference=ORD-1001إن كان في
return_urlاستعلام مسبق، تُضاف هذه المعاملات إليه. -
يتأكد خادمك. إما أن يستقبل عنوان Webhook الخاص بك الحدث
payment.paid(أو غيره)، أو يستدعي خادمكGET /api/v1/payments/{id}. بعد ذلك فقط تسلّم الطلب.
ويتحقق الجسر أيضاً في الخلفية من كل دفعة معلّقة لدى المزوّد، مرة في الدقيقة تقريباً، حتى تُحسم أو تنتهي مهلتها. فإن أغلق العميل المتصفح قبل أن يعود، تُسجَّل دفعته ويصلك إشعار Webhook رغم ذلك.
لا تعتمد على إعادة التوجيه وحدها
الاستعلام المضاف إلى return_url يكتبه متصفح العميل، وأي شخص يستطيع كتابة status=paid في شريط
العنوان. استخدمه فقط لاختيار ما تعرضه في الصفحة («شكراً لك»، «فشل الدفع»). وقبل أن تشحن أي شيء،
تأكد من الحالة على خادمك عبر إشعار Webhook موثّق التوقيع أو عبر
GET /api/v1/payments/{id}.
إعادة التوجيه بـ status=pending تعني أن المزوّد لم يرد خلال نحو 30 ثانية. أخبر العميل أن الدفعة
قيد التحقق، وسيصلك إشعار Webhook عند حسمها.
عندما لا يدفع العميل
- يلغي من صفحة الدفع: تصبح الدفعة
cancelledويعود العميل إلىreturn_urlمعstatus=cancelled. - تُرفض البطاقة: تصبح الدفعة
failed. - لا يدفع أحد في الوقت المحدد: تنتهي الدفعة غير المدفوعة بعد 30 دقيقة افتراضياً (ويمكن لألفابت
تغيير المدة لكل تطبيق). تصبح
expired، ورابط الدفع المنتهي يعيد العميل إلىreturn_url. - يلغيها خادمك: عبر
POST /api/v1/payments/{id}/cancelما دامتpending.
كل حالة من هذه ترسل إشعار Webhook. ولإعادة المحاولة أنشئ دفعة جديدة، إذ يمكن إعادة استخدام
order_reference نفسه بعد أن تصبح الدفعة السابقة failed أو cancelled أو expired.
الدفعة الملغاة قد تصبح مدفوعة
لا يمكن إغلاق صفحة البطاقة لدى المزوّد من الخارج. فالعميل الذي ما زالت الصفحة مفتوحة أمامه يستطيع
الدفع بعد إلغاء الدفعة عبر الواجهة البرمجية، أو بعد أن أغلقتها ألفابت يدوياً. لذلك يواصل الجسر
التحقق من الدفعة المغلقة لدى المزوّد حتى موعد expires_at الأصلي.
إن أبلغ المزوّد خلال هذه المدة أن الدفعة مدفوعة، تنتقل إلى paid ويصلك الحدث payment.paid
كأي دفعة أخرى. وبما أن مال العميل قد اقتُطع، فعلى تطبيقك عندها أن يسلّم الطلب أو يسترد المبلغ. أما
الدفعات التي رفضها المزوّد نفسه أو انتهت لديه فهي نهائية ولا تتغير بعد ذلك.
من يخبرك بماذا
| القناة | مصدرها | استخدمها لـ |
|---|---|---|
الاستعلام المضاف إلى return_url |
متصفح العميل | اختيار الصفحة التي تعرضها |
| إشعار Webhook | الجسر، موقّع بسرّك | تنفيذ الطلب |
GET /api/v1/payments/{id} |
الجسر، بمفتاح API الخاص بك | تنفيذ الطلب، والتحقق في أي وقت |