Skip to main content

إرسال الرسائل واستلامها

تنقلك هذه الجولة من مفتاح API إلى تدفق رسائل ثنائي الاتجاه يعمل: تُرسل رسالة صادرة، تتتبع تسليمها، وتستقبل الرد على خادمك. نستخدم SMS كمثال جارٍ؛ وينطبق نمط الخطوات الثلاث نفسه (إرسال → تتبع → استلام) على WhatsApp وRCS وViber والبريد الإلكتروني، كلٌ على نقطة نهاية خاصة به. ما ستفعله:
  1. إرسال رسالة
  2. تتبع التسليم
  3. استلام الرسائل الواردة
  4. الرد على رسالة واردة

المتطلبات المسبقة

  • مفتاح API من الإعدادات → مفاتيح API. استخدم مفتاح sandbox (dv_test_sk_…) أثناء البناء — إرسالات sandbox مجانية ومُحاكاة، وتُرجع إيصالات تسليم محددة مسبقاً بحيث تختبر مسارَي النجاح والفشل معاً. استبدل مفتاحًا حياً (dv_live_sk_…) عند الإنتاج.
  • رقم مُرسل قادر على الإرسال عبر القناة التي تستخدمها. بالنسبة إلى SMS هذا رقم مملوك لك يدعم SMS (ابحث عنه واشترِه عبر Numbers API، أو من Dashboard → Numbers). إذا حذفت from يختار Orbit مُرسِلًا مناسباً للوجهة.
  • عنوان HTTPS عام لخطوة الاستلام. أي أداة تمديد أنفاق (tunneling) تعمل أثناء التطوير.
تذهب كل الطلبات إلى عنوان أساسي واحد — يستخدم sandbox المضيف نفسه، ويُختار بمفتاحك وليس باسم مجال مختلف:
يحمل كل طلب مفتاحك في رأس X-API-Key.

1. إرسال رسالة

أرسل SMS باستخدام POST /messages/sms. الحقول to وbody فقط مطلوبة؛ وfrom اختياري.
الاستجابة هي 202 Accepted — تُحفظ الرسالة نهائياً وتُضاف إلى الطابور للتسليم، ولم تُسلَّم بعد إلى مشغل الشبكة. تعيش الحقول تحت data؛ ويحمل meta الـrequest_id الذي يجب عليك تسجيله لدعم العمليات.
الـid (msg_ متبوعاً بـ32 محرفاً سداسياً عشرياً) هو المقبض الذي تعتمد عليه كل المكالمات التابعة” — استعلامات الوضع، وويب هوكات التسليم، وأثر الرسالة كلها تعمل به. تضيف استجابات sandbox "test_mode": true إلى meta.
أرسل دائماً Idempotency-Key عند الإرسال. إعادة تشغيل المفتاح نفسه والنص نفسهما خلال 24 ساعة تعيد الاستجابة الأصلية بدلاً من إرسال نسخة مكررة؛ وإعادة تشغيله بنص مختلف تعيد 409 IDEMPOTENCY_KEY_REUSED.

القنوات الأخرى

كل قناة لها نقطة نهاية خاصة بها تحت بادئة /messages، وهيئة نص مُفَصَّلَة لتلك القناة. لا يوجد مسار واحد متعدد الأشكال بحسب القناة (polymorphic) — اختر نقطة النهاية المطابقة لقناتك:

2. تتبع التسليم

تتقدم الرسالة المعلَّقة في الطابور عبر دورة حياة من الحالات قبل الوصول إلى المستلم:
لديك طريقتان للمتابعة: استطلاع (Poll) الرسالة بواسطة المعرف:
الاشتراك في webhooks (موصى به — بلا استطلاع). ينطلق حدث واحد لكل انتقال في الحالة، ويحمل كل منها معرّف الرسالة id والحالة status الجديدة:
  • message.sent — قبِلها مشغل الشبكة
  • message.delivered — تأكَّد تسليمها إلى الجهاز
  • message.failed — فشل نهائي (يُميِّز الـstatus في الحمولة بين failed وundelivered وexpired وsubmitted_no_receipt؛ ويحمل error_code / error_message سبب المزود عند وجوده)
سجِّل نقطة webhook مرة واحدة، ثم دع الأحداث تتدفق:
يبدو حدث التسليم كالتالي:
تحقّق من رأس X-Orbit-Signature قبل الوثوق في أي حمولة، وأزل التكرارات باستخدام معرّف الحدث id — التسليم يُنفَّذ مرة واحدة على الأقل (at-least-once). راجع أمان webhooks لأجل مقتطف التحقق.

3. استلام الرسائل الواردة

عندما يردُّ شخص على رقمك (أو يراسله أولاً)، يسجِّل Orbit رسالة واردة و — إن كنت مشتركاً في message.received في الخطوة السابقة — يُرسل POST إلى عنوان webhook لديك:
الرسالة الواردة أيضاً قابلة للاستعلام — اسرد كل ما استلمته بفلتر direction=inbound:
التوجيه الوارد تلقائي للأرقام المملوكة لك في Orbit — يُلتَقط أي رد على أرقامك المرسلة وباشتراك message.received تُسلَّم إلى webhook الخاص بك. لا حاجة لربط عنوان وارد خاص لكل رقم.

4. الرد على رسالة واردة

الرد هو مجرد إرسال آخر، موجَّه إلى from الوارد. بدِّل to وfrom وأعِد استدعاء POST /messages/sms مجدداً:
تتشارك كلتا الرسالتين محادثة واحدة؛ وما أن يتكوّن الخيط يمكنك سحب الدردشة الكاملة عبر فلتر conversation_id في GET /messages.

الأخطاء الشائعة

كل خطأ يستخدم الهيئة نفسها — طابِق على error.code (ثابت بأحرف كبيرة)، وسجّل meta.request_id: القائمة الكاملة: رموز الأخطاء.

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