Skip to main content

بدء سريع: استقبل أول webhook

ثلاثة أسطح تسليم تُخرج أحداث Orbit من المنصة؛ يساعدك هذا الدليل على اختيار أحدها، ثم يمشي حلقة النقطة المسجلة كاملة — نفق، تسجيل، تحقق، إعادة إرسال — من الطرف إلى الطرف.

Step 1 — Pick a delivery surface

الخط الفاصل بين الأسطح الثلاثة واضح: الـ Tester للتجربة، والنقطة المسجلة لكل ما يحمل قيمة إنتاجية، والـ event sink لبث أحجام كبيرة إلى بنية Kafka أو تجميع دفعات تديرها بنفسك. Start with the Tester when you’re experimenting. Graduate to a registered endpoint as soon as the integration is real — the tester cannot sign requests, so it never exercises your verification logic. Choose an event sink when per-endpoint receivers are the wrong shape — Kafka, batch, or many event types over one destination.
Event-sink delivery is not live yet: the config API (GET/PATCH /api/v1/developer/event-sinks/{kind} for kafka and http_batch) stores configs today, but nothing flows through a sink until the delivery worker ships. Until then, a registered webhook endpoint is the only durable consumer surface. Check the warning block on the Event Sinks API page for the current status.
يمشي بقية هذا الدليل حلقة النقطة المسجلة. إذا كنت هنا للاستكشاف فقط، افتح Webhook Tester وَعُد عندما يفشل طلب في فحوص التوقيع.

Step 2 — Expose a local endpoint with a tunnel

شغّل أي مستمع HTTP مجرد محليًا وضع أمامه عنوان URL عامًا: العنوان الذي تسجله في الخطوة التالية هو عنوان إعادة التوجيه HTTPS الخاص بالنفق. أبقِ النفق يعمل طوال العمل في التسجيل وإعادة الإرسال.

Step 3 — Register the endpoint in the console (or over the API)

في لوحة التحكم انتقل إلى Developer → Webhooks → Add endpoint (ويمكن الوصول إليها أيضًا تحت Settings → Webhooks). الصق عنوان النفق، واشترك في نوع حدث أو اثنين، واحفظ. تعرض وحدة التحكم سرّ التوقيع الصريح (whsec_...) مرة واحدة بالضبط — انسخه الآن إلى متغير بيئة. التسجيل نفسه عبر الواجهة البرمجية أو الـ SDKs:
يرسل Go وRuby وPHP المسار نفسه عبر دالة الطلب غير المكتوبة في كل عميل (client.Request / client.request / $client->request) — الأغلفة المكتوبة تغطي الموارد الأساسية، بينما تمر الـ webhooks عبر ذلك المهرب. تحمل الاستجابة معرف نقطتك (wh_...) والسرّ الصريح الذي يُرى مرة واحدة (whsec_...) — احفظه الآن، لأن كل GET لاحق على النقطة يعيد قيمة مقنعة مثل whsec_********...b7a1:
قوائم events الضيقة تُبقي حركة الاختبار معقولة؛ أما * فقرار إنتاجي لا قرار تطويري.

Step 4 — Receive and verify the signature

تصل حالات التسليم المسجلة موقعة بترويسة X-Orbit-Signature بصيغة t=<unix>,v1=<hex>. على مستقبلك التحقق من HMAC_SHA256(secret, "<t>.<raw body>") على بايتات الطلب الخام — قبل أن يمسّها أي وسيط JSON — ورفض الطوابع الزمنية الأقدم من 5 دقائق. يقوم الـ SDK بذلك في استدعاء واحد؛ أما التوصيلات المحيطة (الجسم الخام، والتراجع في الترويسة، و401 عند الفشل) فهي الجزء الذي عليك إتقانه. مستقبلات كاملة بخمس لغات:
يقرأ كل معالج الجسم الخام قبل أن يلمسه أي محلل JSON، ويتراجع من X-Orbit-Signature إلى X-Devotel-Signature القديم، ويتحقق باستدعاء SDK واحد، ويجيب بـ401 عند الفشل حتى لا تقرّ إعادات المحاولة حركة مزيفة أبدًا. مستقبلات Java وC#، إضافة إلى تدوير الأسرار واستكشاف الأخطاء، في Verify webhook signatures. أعِد 2xx خلال نافذة التسليم البالغة 30 ثانية وأزل التكرار اعتمادًا على id في الظرف — تعيد الإعادات وعمليات إعادة الإرسال الـ id نفسه. العقد الكامل (جدول الإعادات، وطابور الرسائل الميتة، والحالات المؤكدة الموت) في Webhooks overview؛ ويحتوي Build your first webhook receiver تنفيذًا كاملًا بلغتين، فيما يطرح Webhook security أدوات تحقق بسبع لغات.

Step 5 — Replay deliveries from the console

يمكن فحص كل محاولة تسليم تحت Developer → Webhooks → Events — اختر صفًا لرؤية الحمولة والاستجابة التي أعادها خادمك. يمكن إعادة إرسال التسليم الفاشل بزر Replay على صف التسليم، فتصلح مستقبلك وتعيد إطلاق الحدث الموقع نفسه من دون إثارة حركة جديدة. تهبط حالات التسليم التي تستنفد جدول الإعادات في طابور الرسائل الميتة تحت Developer → Webhooks → Dead-letter queue، ويمكن إعادة تشغيلها لمدة 7 أيام. وعندما يكون لديك تراكم تريد إعادة إطلاقه لا صفًا واحدًا، استخدم تدفق إعادة الإرسال الجماعي في تلك الشاشة. يغطي المساران معًا في Inspecting deliveries.

Step 6 — Move to an event sink when you outgrow HTTP receivers

نقطة مسجلة لكل مستقبِل هي الشكل الصحيح إلى أن تعود كذلك — وإشارات الانتقال ملموسة:
  • جهة المصب لديك Kafka. وجّه sink من نوع kafka إلى وسطائك وتوقف عن تشغيل مستقبلات HTTP لكل مجموعة أحداث.
  • تريد دفعات لا طلبات POST لكل حدث. يفرغ sink من نوع http_batch مصفوفة JSON من الأظرفة بحجم دفعة قابل للضبط.
  • تشترك بـ* لالتقاط كل شيء. sink واحد يحمل التصنيف الكامل خير من أسطول نقاط wildcard.
هيّئ الـ sink في Developer → Event Sinks في وحدة التحكم، أو عبر Event Sinks API:
بيانات الاعتماد للكتابة فقط — تعيد القراءات قيمة منطقية credentials_configured ولا تعيد السرّ أبدًا. شكل السجل مطابق بايتيًا لظرف الـ webhook، لذا يبقى المستهلك الذي تكتبه اليوم يعمل عندما يصبح تسليم الـ sink حيًا؛ وحتى ذلك الحين أبقِ الحركة الدائمة على الـ webhooks واستخدم الـ sink فقط لتجهيز الإعداد. نموذج الـ fan-out الكامل في Webhook fan-out: one event, many destinations.

See also