كتالوج الأحداث
يمكن أيضاً أن تُطلق أحداث الكيانات (
user.status.updated وbusiness.status.updated) نتيجة لنشاط المعاملات؛ راجع webhooks الكيانات.
لا ترسل تطبيقات البيئة التجريبية أحداث webhook من نوع
transaction.created أو transaction.status.updated. لاختبار هذه الأحداث، استخدم تطبيقاً في بيئة الإنتاج أو API & Webhooks → Try Webhook في الكونسول. ترسل تبادلات Travel Rule في البيئة التجريبية أحداث travel_rule.status.updated مع environment: sandbox؛ استخدم Didit Test VASP لاختبار التبادل قبل الإطلاق.الغلاف
تستخدم webhooks في Didit جسماً مسطّحاً: حقول الحدث موجودة في المستوى الأعلى إلى جانب حقول الغلاف، ولا يوجد كائنdata متداخل.
يحمل كل تسليم الحقول التالية:
بنى الحمولة
transaction.created وtransaction.status.updated
يشترك الحدثان في حمولة واحدة: ملخص مختصر مع كتلة action_required (أو null):
GET /v3/transactions/{transaction_id}/، فهو يعيد التفاصيل الكاملة (الأطراف وrule_runs وprovider_results وtravel_rule وcost_breakdown وdecision_reason_code)، بما في ذلك سبب تغيّر الحالة.
transaction_rule_suggestions.created
يتعلق هذا الحدث بمجموعة قواعدك لا بمعاملة واحدة، لذلك لا يتضمن أي معرّف معاملة.
ولا يحتوي أبداً على بيانات شخصية: فقط معرّفات الاقتراحات وأنواعها وعناوينها وأعدادها.
تُضاف حقول الغلاف المعتادة (
event_id وtimestamp وapplication_id وenvironment) إلى الجسم.
travel_rule.status.updated
FINISHED أو CANCELLED أو EXPIRED. وبمجرد أن يصل تحويل إلى إحدى هذه الحالات، لا تُرسل أي أحداث Travel Rule أخرى له.
قد يكرر الحدث حالة الحدث السابق، مثلاً عندما لا تجد إعادة الإرسال مساراً مرة أخرى ويبقى التحويل في COUNTERPARTY_VASP_NOT_FOUND.
تكون قيمة rail إحدى القيم INTERNAL أو TRP أو GTR أو TRUST أو VERIFYVASP أو SYGNA أو EMAIL أو TEST_VASP (تحويل في البيئة التجريبية أجابه Didit Test VASP، ويحمل أيضاً test_vasp: true وtest_vasp_scenario)، أو "" طالما لم يُختر أي مسار (وهي دائماً "" في تسجيلات Sunrise).
عند إنشاء معاملة، أو تسجيل Sunrise، أو استعلام TRP وارد، أو الساق الوارد لمسار INTERNAL، يرسل Didit transaction.created أولاً، ثم تأتي أحداث travel_rule.status.updated الخاصة بالمعاملة بعده.
يمكن أن ترسل قاعدة تغيّر حالة المعاملة خلال هذه الخطوة transaction.status.updated قبل transaction.created.
لا يرسل تسجيل Sunrise الذي يرتبط بمعاملة إيداع أنشأتها مسبقاً أي transaction.created.
يُسلَّم كل webhook ويُعاد إرساله بشكل مستقل، لذا قد يصل حدث أُعيد إرساله بعد حدث لاحق. اربط معالجك بـ transaction_id، وأعد قراءة المعاملة عندما تحتاج إلى حالتها الحالية.
أمثلة على مسارات الحالة
الموافقة المباشرة
المراجعة ثم الموافقة
التحقق المعزز
تحويل Travel Rule
transaction.created في قائمة الانتظار أولاً. يُسلَّم كل webhook بشكل مستقل، لذا لا تعتمد على ترتيب الوصول. لا يحصل تحويل مُرسل عبر TRUST أبداً على حدث COMPLETED، لأن TRUST لا يعيد شيئاً يستطيع Didit قراءته: يبقى التحويل في AWAITING_COUNTERPARTY حتى الموعد النهائي للتأكيد، ثم ينتهي بالحالة EXPIRED. أما عبر GTR وVerifyVASP وSygna Bridge، فيقرأ Didit رد الطرف المقابل من الشبكة، ويأتي الحدث بعده.
التحقق من التوقيع
يُوقَّع كل تسليم بخوارزمية HMAC-SHA256 باستخدام السر المشترك لوجهة webhook، ويحمل ثلاث ترويسات للتوقيع مع طابع زمني:إعادة المحاولات وضمانات التسليم
- عند استجابة
5xxأو404أو انتهاء المهلة أو فشل الاتصال، يعيد Didit المحاولة حتى مرتين: بعد حوالي دقيقة من الفشل الأولي، ثم بعد حوالي 4 دقائق إضافية. - تعيد التسليمات المعاد محاولتها استخدام
event_idنفسه، لذا أزل التكرار بالاعتماد عليه في معالج الحدث لديك. - بعد الفشل النهائي يتوقف تسليم ذلك الحدث وتُبلَّغ مؤسستك، ولا تُعطَّل الوجهات أبداً بصمت.
- أعِد استجابة
2xxبسرعة (ضع الطلب في قائمة الانتظار ثم عالجه)، فإقرارات الاستلام البطيئة تعرّض الطلبات لانتهاء المهلة وتؤدي إلى تسليمات مكررة.
idempotency
عالج كل webhook مرة واحدة فقط، وذلك بتخزينevent_id في مخزن إزالة التكرار الخاص بك. قد تحدث إعادة تسليم للحدث نفسه إذا استغرقت endpoint وقتاً طويلاً في الإقرار بالاستلام (ACK) أو انقطع الاتصال في منتصف الطلب.
الاشتراك
الخطوات التالية
مرجع webhook
الوجهات والتوقيع وإعادة المحاولات.
الحالات
آلة الحالات الكاملة.
دليل التكامل
معالجة webhook في الإنتاج.