الانتقال إلى المحتوى الرئيسي
تُخطِر الـ webhooks خادمك عند وقوع أحداث المكالمات. تسجّل endpoint، وتُرسِل إليه Wave عبر POST بيانات JSON موقّعة، وتُعيد المحاولة عند الفشل.

تسجيل endpoint

تُدار الـ webhook endpoints في لوحة تحكّم Wave ضمن Webhooks: أضِف URL، واختر الأحداث، وانسخ الـ signing secret (يُعرَض مرّة واحدة). يجب أن يكون الـ URL رابط https عامًّا. ترفض Wave أيّ URL يشير إلى عنوان loopback أو خاصّ أو link-local أو أيّ عنوان داخلي آخر (400 WEBHOOK_URL_INVALID). تتحقّق Wave من العنوان مرّة أخرى قبل كلّ إرسال، ولا تتبع عمليات إعادة التوجيه.

بيئة واحدة لكلّ endpoint

ينتمي كلّ endpoint إلى بيئة واحدة: sandbox أو production. ويستقبل أحداث بيئته فقط، فلا تصل أحداث الاختبار أبدًا إلى الـ endpoint الحيّ. في مشروع الـ production، تعرض لوحة التحكّم الـ endpoints الخاصّة بعرض البيئة المحدّد، ويأخذ الـ endpoint الجديد بيئة ذلك العرض.
  • يمكنك إضافة الـ URL نفسه مرّة واحدة في كلّ بيئة؛ ولكلّ نسخة signing secret خاصّ بها.
  • الحدّ الأقصى 5 endpoints يُحتسب لكلّ بيئة.
  • لا يستطيع مشروع الـ sandbox إضافة endpoint للـ production. أضِفه في نموذج Go-Live بدلًا من ذلك: يبقى غير نشط حتّى توافق Wave على طلبك، ويعرض النموذج الـ signing secret الخاصّ به مرّة واحدة. إذا رفضت Wave الطلب، يُحذف الـ endpoint.

الأحداث

يمكنك الاشتراك في أيّ حدث أدناه (بحدّ أقصى 5 endpoints لكلّ مشروع).

الحمولة (Payload)

كلّ عمليّة تسليم هي جسم JSON يحتوي على نوع الـ event وenvironment وكائن data. ويحمل الـ X-Wave-Event-Id header معرّفًا فريدًا لضمان عدم التكرار (idempotency).
يقع environment بجانب event وخارج data. وقيمته "sandbox" أو "production". تأخذه Wave من المكالمة: المكالمة التي أجراها sandbox key قيمتها "sandbox"، والمكالمات الواردة "production". أمّا webhook النتيجة voice_auth.completed فيأخذه من مفتاح الـ challenge. ويحمل كلّ حدث بيئة مكالمته، بما في ذلك أحداث Verify والـ callback والبريد الصوتي والمؤتمر والـ IVR والتحويل.

التحقّق من التوقيع

كلّ عمليّة تسليم موقّعة. الـ X-Wave-Signature header هو sha256=<hex> — وهو HMAC-SHA256 لجسم الطلب الخام باستخدام الـ signing secret الخاصّ بالـ endpoint لديك (whsec_…). تحقّق منه عبر مقارنة بزمن ثابت (constant-time) قبل الوثوق بالحمولة:
احسب الـ HMAC على بايتات الجسم الخام، قبل أيّ تحليل/إعادة تسلسل لـ JSON — فإعادة التحويل إلى نصّ قد تُغيّر البايتات وتُفسِد التحقّق.

إعادة المحاولات والـ dead-letter

لكلّ محاولة مهلة قدرها 10 ثوانٍ. تُعاد عمليّات التسليم الفاشلة حتّى 5 محاولات وفق سلّم تراجع (backoff)، ثمّ تُحوَّل إلى dead-letter: تُحوَّل عمليّات التسليم المُستنفَدة إلى dead-letter (تُحفَظ 72 ساعة) وتظهر في سجلّات التسليم بلوحة التحكّم، بعلامة مُحوَّل إلى Dead-letter.