الانتقال إلى المحتوى الرئيسي
تُصدر مراقبة المعاملات ثلاثة أحداث webhook تغطي معاً دورة حياة المعاملة كاملةً، بالإضافة إلى حدث رابع اختياري يعلن عن اقتراحات قواعد جديدة. تعتمد جميعها على البنية التحتية القياسية لـ webhook في Didit مع توقيع HMAC-SHA256. راجع مرجع webhooks للوجهات والتوقيع والاختبار.

كتالوج الأحداث

يمكن أيضاً أن تُطلق أحداث الكيانات (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، ويحمل ثلاث ترويسات للتوقيع مع طابع زمني:
راجع مرجع webhook للاطلاع على كود التحقق الكامل، بما في ذلك فحص حداثة الطابع الزمني.

إعادة المحاولات وضمانات التسليم

  • عند استجابة 5xx أو 404 أو انتهاء المهلة أو فشل الاتصال، يعيد Didit المحاولة حتى مرتين: بعد حوالي دقيقة من الفشل الأولي، ثم بعد حوالي 4 دقائق إضافية.
  • تعيد التسليمات المعاد محاولتها استخدام event_id نفسه، لذا أزل التكرار بالاعتماد عليه في معالج الحدث لديك.
  • بعد الفشل النهائي يتوقف تسليم ذلك الحدث وتُبلَّغ مؤسستك، ولا تُعطَّل الوجهات أبداً بصمت.
  • أعِد استجابة 2xx بسرعة (ضع الطلب في قائمة الانتظار ثم عالجه)، فإقرارات الاستلام البطيئة تعرّض الطلبات لانتهاء المهلة وتؤدي إلى تسليمات مكررة.

idempotency

عالج كل webhook مرة واحدة فقط، وذلك بتخزين event_id في مخزن إزالة التكرار الخاص بك. قد تحدث إعادة تسليم للحدث نفسه إذا استغرقت endpoint وقتاً طويلاً في الإقرار بالاستلام (ACK) أو انقطع الاتصال في منتصف الطلب.

الاشتراك

الخطوات التالية

مرجع webhook

الوجهات والتوقيع وإعادة المحاولات.

الحالات

آلة الحالات الكاملة.

دليل التكامل

معالجة webhook في الإنتاج.
آخر تعديل في ٧ نوفمبر ٢٠٢٦