دليل تكامل واجهة API للمراسلة: REST وSMPP وWebhooks
دليل تكامل واجهة API للمراسلة للمطورين: المقارنة بين REST وSMPP وwebhooks، والمصادقة، وعدم تكرار التنفيذ، وتقارير التسليم، وإعادة المحاولة، وحدود المعدل، والاختبار.
بقلم OmniChannels.ai Editorial Team · مراجعة BroadNet Messaging Solutions Team
التكامل
الإجابة المختصرة
استخدم واجهة REST API لإرسال الرسائل من التطبيقات، واستخدم SMPP فقط لرسائل SMS بأحجام كبيرة حيث تدير بنية اتصالات بمستوى شركات الاتصالات، واستخدم webhooks لاستقبال تقارير التسليم والرسائل الواردة. صادِق على كل استدعاء، وأرسل مفتاح idempotency مع كل عملية إرسال حتى لا تُكرَّر الرسائل عند إعادة المحاولة، وتعامل مع حالة التسليم على أنها غير متزامنة، وتراجع تدريجيًا عند أخطاء HTTP 429 و5xx، واختبر مسارات الفشل في بيئة sandbox قبل الإنتاج.
في هذه الصفحة
أهم النقاط
- تناسب REST معظم تكاملات التطبيقات؛ أما SMPP فبروتوكول ثنائي دائم الاتصال صُمم لإنتاجية SMS بين أنظمة المراسلة.
- طلب الإرسال المقبول يعني أن الرسالة وُضعت في الطابور لا أنها سُلّمت؛ وتصل الحالة النهائية لاحقًا عبر webhooks أو إيصالات تسليم SMPP.
- رمز HTTP 429 Too Many Requests معرَّف في RFC 6585؛ وعلى العملاء إبطاء الطلبات والالتزام بأي ترويسة Retry-After.
- تتيح مفاتيح idempotency إعادة محاولة إرسال انتهت مهلته بأمان دون إرسال الرسالة نفسها إلى العميل مرتين.
- توقّع Meta على webhooks الخاصة بـ WhatsApp Cloud API ليتحقق المستقبِل من أن الأحداث صادرة فعلًا من Meta.
هذا الدليل موجّه لمطوري الواجهات الخلفية ومعماريي الحلول ومديري التقنية الذين يربطون تطبيقًا بمزود مراسلة لـ WhatsApp أو SMS أو البريد الإلكتروني. ويشرح أي واجهة تستخدم، وكيف تتعامل مع المصادقة وعدم تكرار التنفيذ وتقارير التسليم وإعادة المحاولة وحدود المعدل والاختبار، مع أشكال توضيحية للطلبات والاستجابات. ولمزامنة المحادثات مع نظام CRM، راجع الدليل المرافق حول ربط CRM عبر webhooks.
أي واجهة تستخدم: REST أم SMPP أم webhooks؟
استخدم REST للإرسال، وwebhooks للاستقبال، وSMPP فقط لرسائل SMS بأحجام كبيرة حيث تشغّل SMPP بالفعل. وهي متكاملة لا متنافسة: تجمع معظم التكاملات بين استدعاءات REST الصادرة وwebhooks الراجعة.
| الجانب | REST API | SMPP | Webhooks |
|---|---|---|---|
| الاتجاه | تطبيقك ← المزود | ثنائي الاتجاه عبر جلسة واحدة | المزود ← تطبيقك |
| وسيلة النقل | طلب/استجابة HTTPS | جلسة TCP دائمة، وحدات PDU ثنائية | HTTPS POST إلى نقطة النهاية لديك |
| القنوات | WhatsApp وSMS والبريد الإلكتروني وغيرها | SMS فقط | أحداث جميع القنوات |
| الاستخدام المعتاد | إرسال الرسائل وإدارة القوالب والاستعلام عن الحالة | SMS بالجملة بين أنظمة المراسلة | حالة التسليم والرسائل الواردة |
| نقاط القوة | بسيط، ملائم لجدران الحماية، حمولات غنية | الإنتاجية، نافذة الإرسال، معيار الاتصالات | فوري، دون استعلام دوري |
| ما يجب الانتباه له | حدود المعدل، المهلات | إدارة الجلسات، الربط (bind)، رسائل keep-alive | إعادة المحاولات، التكرار، الأمان |
تبدأ جلسات SMPP (Short Message Peer-to-Peer) بعملية ربط (bind) بصفة مرسل أو مستقبل أو مرسل ومستقبل معًا، وترسل الرسائل بـ submit_sm، وتستقبل تقارير التسليم ورسائل SMS الواردة عبر deliver_sm، وتبقى حية بـ enquire_link. وهو فعّال لكنه أثقل تشغيليًا من HTTPS.
كيف تتم المصادقة؟
استخدم أقوى طريقة يوفرها المزود، وأبقِ الأسرار خارج الشيفرة، وصادِق في الاتجاهين.
- الاستدعاءات الصادرة: مفاتيح API أو رموز OAuth 2.0 من نوع bearer تُرسل في ترويسة
Authorizationعبر TLS. خزّنها في مدير أسرار، وبدّلها وفق جدول وبعد أي تغيير في الموظفين. - SMPP: معرّف النظام وكلمة المرور عند الربط، وعادةً مع تقييد بعناوين IP مسموح بها، وعبر TLS حيثما أمكن.
- webhooks الواردة: تحقق من التوقيع في كل حدث. توقّع Meta حمولات webhooks الخاصة بـ WhatsApp Cloud API بتوقيع HMAC-SHA256 في ترويسة
X-Hub-Signature-256، يُحسب بسرّ تطبيقك؛ ويقدم المزودون عادةً مخططًا مماثلًا. احسب التوقيع على الجسم الخام قبل تحليله.
استخدم بيانات اعتماد منفصلة لكل بيئة حتى لا يستطيع مفتاح اختبار مسرَّب إرسال حركة إنتاج.
كيف ترسل رسالة بأمان؟
أرسل عبر طابور، وضمّن مفتاح idempotency، وتعامل مع الاستجابة على أنها "مقبولة" لا "مسلَّمة".
طلب إرسال توضيحي
الشكل أدناه JSON توضيحي (pseudo-JSON) وليس واجهة مزود بعينه.
POST /v1/messages
Authorization: Bearer <token>
Idempotency-Key: 7f3c9a2e-order-55821-shipped
{
"channel": "whatsapp",
"to": "+9715XXXXXXXX",
"template": {
"name": "order_shipped",
"language": "ar",
"variables": ["Layla", "55821", "15 March"]
},
"client_reference": "order-55821",
"callback_url": "https://api.example.com/webhooks/messaging"
}
استجابة توضيحية
202 Accepted
{
"message_id": "msg_01HZX...",
"status": "accepted",
"client_reference": "order-55821",
"created_at": "2026-10-09T12:00:00Z"
}
خزّن message_id فورًا مقابل مرجعك الخاص. فكل ما يحدث بعد ذلك يصل بصورة غير متزامنة.
لماذا يهم عدم تكرار التنفيذ (idempotency)؟
لأن الشبكات تنتهي مهلتها بعد أن يكون الخادم قد نفذ الطلب بالفعل. فإذا انتهت مهلة طلب الإرسال وأعدت المحاولة دون تحقق، فقد يتلقى العميل رمزَي OTP أو إشعارَي شحن. ويتيح مفتاح idempotency للخادم التعرف على إعادة المحاولة وإرجاع النتيجة الأصلية.
قواعد مجرَّبة:
- اشتق المفتاح من الحدث التجاري (مثل معرّف الطلب مع نوع الحدث)، لا من قيمة عشوائية لكل محاولة.
- أعد استخدام المفتاح نفسه في كل إعادة محاولة لعملية الإرسال ذاتها.
- اجعل المفاتيح طويلة بما يكفي لتغطية نافذة إعادة المحاولة لديك.
- إن لم يدعم المزود المفاتيح، فأزل التكرار من جانبك قبل الإرسال.
وتوحّد مسودة ترويسة Idempotency-Key لدى IETF هذا النمط لواجهات HTTP؛ وتختلف تنفيذات المزودين، فاقرأ توثيقهم.
كيف تعمل تقارير التسليم؟
تصل حالة التسليم لاحقًا على شكل أحداث: من webhooks في WhatsApp ومعظم واجهات REST، ومن إيصالات deliver_sm في SMPP. وتختلف معاني الحالات بحسب القناة؛ ويشرح دليلنا حول حالات تسليم الرسائل كل واحدة منها.
webhook حالة توضيحي
POST /webhooks/messaging
X-Signature: sha256=<hmac>
{
"event_id": "evt_9c1...",
"type": "message.status",
"message_id": "msg_01HZX...",
"client_reference": "order-55821",
"status": "delivered",
"timestamp": "2026-10-09T12:00:04Z",
"error": null
}
تعامل مع أحداث الحالة بأسلوب دفاعي:
- أزل التكرار بحسب
event_id، أو بحسب معرّف الرسالة مع الحالة. - لا تُرجع رسالة من حالة "مقروءة" إلى "مسلَّمة" عندما تصل الأحداث بغير ترتيبها.
- ردّ بـ 2xx بسرعة، ثم عالج من طابور.
- سجّل رموز الأخطاء للرسائل الفاشلة، وحدد أيها قابل لإعادة المحاولة.
- توقّع الفجوات: بعض مسارات SMS تعيد إيصالات محدودة، وتعتمد حالة القراءة على القناة وإعدادات المستخدم.
كيف تتعامل مع إعادة المحاولة وحدود المعدل؟
أعد محاولة ما يمكن أن ينجح فقط، وتراجع أسيًا مع جيتر، والتزم بإشارات الخادم.
| الاستجابة | المعنى | الإجراء |
|---|---|---|
| 2xx | مقبول | خزّن المعرّف وانتظر الحالة |
| 400 / 422 | طلب غير صالح (الرقم أو القالب أو المتغيرات) | لا تعد المحاولة؛ أصلح البيانات |
| 401 / 403 | مشكلة في المصادقة أو الصلاحيات | لا تعد المحاولة؛ أطلق تنبيهًا |
| 409 | تعارض، غالبًا مفتاح idempotency مكرر | اجلب النتيجة الأصلية |
| 429 | طلبات كثيرة جدًا (RFC 6585) | انتظر Retry-After أو تراجع تدريجيًا |
| 5xx / مهلة | خطأ في الخادم أو الشبكة | أعد المحاولة بمفتاح idempotency نفسه مع تراجع |
يعرّف RFC 9110 ترويسة Retry-After، التي قد تحمل ثواني أو تاريخًا. وضع محدِّد معدل من جانب العميل أمام عمليات الإرسال لتبقى دون الحدود الموثقة لدى المزود بدل اكتشافها عبر الأخطاء. ولدى WhatsApp أيضًا حدود من جانب Meta على عدد العملاء الفريدين الذين يمكنك مراسلتهم، موضحة في حدود المراسلة وتقييم الجودة.
كيف تختبر قبل الإطلاق؟
اختبر مسارات الفشل لا المسار السليم فقط.
قائمة تدقيق ما قبل الإنتاج
- أرسل كل قالب بقيم بأطوال حقيقية، بما فيها نص عربي.
- أجبر مهلة منتهية وتأكد من أن إعادة المحاولة لا تكرر الرسالة.
- أرسل إلى رقم غير صالح وتأكد من معالجة الخطأ دون إعادة محاولة.
- أعد تشغيل webhook مرتين وبغير ترتيبه؛ وتأكد من حالة نهائية واحدة.
- أرسل webhook بتوقيع خاطئ وتأكد من رفضه.
- أثِر استجابات 429 باختبار حمل على بيئة sandbox إن كان ذلك مسموحًا.
- بدّل مفتاح API وتأكد من عدم حدوث انقطاع.
- تحقق من أن السجلات تتضمن معرّفات الرسائل لا نصوصها الكاملة أو رموز OTP.
- شغّل تجربة إنتاج صغيرة بأرقام داخلية على كل قناة.
نادرًا ما تحاكي بيئات sandbox سلوك شركات الاتصالات وMeta بدقة، فواصل المراقبة في الأسابيع الأولى من الإنتاج.
مثال تطبيقي: خدمة OTP وإشعارات الطلبات
ترسل "قافلة للخدمات اللوجستية" (اسم افتراضي)، وهي شركة طرود في السعودية، تحديثات الطلبات عبر WhatsApp مع SMS احتياطيًا، ورموز OTP للمصادقة.
- البنية: تذهب أحداث الطلبات إلى طابور؛ وينفذ عامل الإرسال استدعاء REST API بمفتاح idempotency هو
shipment-id:event. - الاحتياطي: إذا أعاد WhatsApp حالة فشل لمستخدم لا يملك WhatsApp، يرسل العامل SMS بمفتاح جديد هو
shipment-id:event:sms. - OTP: تنتهي صلاحية الرموز سريعًا، فلا تُعاد محاولة إرسال OTP بعد نافذة الانتهاء؛ ويطلب المستخدم رمزًا جديدًا. راجع دليل رسائل مصادقة OTP.
- الإيصالات: يتحقق مستقبِل webhook من التواقيع، ويزيل التكرار، ويحدّث جدول حالات لا يرجع إلى الوراء.
- الحدود: يضع محدِّد token-bucket سقفًا لمعدل الإرسال لكل قناة دون الحدود الموثقة.
ما أخطاء التكامل الشائعة؟
- معاملة "مقبول" على أنه "مسلَّم".
- إعادة المحاولة بمفتاح idempotency جديد في كل مرة.
- إجراء معالجة ثقيلة داخل طلب webhook.
- تخطي التحقق من توقيع webhooks.
- إعادة محاولة أخطاء التحقق 4xx في حلقة.
- تسجيل رموز OTP ومحتوى الرسائل الكامل.
- استخدام بيانات اعتماد الإنتاج في بيئات الاختبار.
كيف تساعدك OmniChannels.ai
توفر OmniChannels.ai، المدعومة من BroadNet Technologies، واجهة REST/JSON API موثّقة للعموم بمواصفات OpenAPI 3.1 وحزمة SDK بلغة TypeScript، تغطي SMS وWhatsApp وRCS وMessenger وInstagram وTelegram والبريد الإلكتروني والإشعارات الفورية، بما في ذلك قوالب مصادقة WhatsApp مع OTP بالنقرة الواحدة (one-tap) وبلا نقر (zero-tap) ونسخ الرمز (copy-code). وتُبلغ webhooks عن حالات التسليم بصيغة موحّدة واحدة، ويخدم SMPP 3.4 عبر TLS رسائل SMS بالأحجام الكبيرة، ويربط خادم MCP وكلاء الذكاء الاصطناعي. وتساعدك تقارير التسليم، مع عوامل التصفية وتصدير CSV، على مطابقة ما أرسله تكاملك. ابدأ من وثائق المطورين ودليل البدء السريع.
الأسئلة الشائعة
هل أتكامل مع مزود المراسلة عبر REST أم SMPP؟
اختر REST لمعظم حالات استخدام التطبيقات تقريبًا: فهو يعمل عبر HTTPS، ويسهل تأمينه، ويدعم قنوات غنية مثل WhatsApp. واختر SMPP حين ترسل أحجامًا كبيرة من SMS وتشغّل عملاء SMPP بالفعل وتحتاج إلى اتصال دائم مع نافذة إرسال (windowing). يقتصر SMPP على SMS؛ أما WhatsApp والبريد الإلكتروني والقنوات الاجتماعية فتستخدم واجهات HTTP.
ما مفتاح idempotency في واجهة المراسلة؟
مفتاح idempotency قيمة فريدة يرسلها نظامك مع الطلب ليتعرف الخادم على التكرار. فإذا انتهت مهلة استدعاء الإرسال وأعدت المحاولة بالمفتاح نفسه، يعيد المزود النتيجة الأصلية بدل إرسال رسالة ثانية. وتوجد مسودة معيار لدى IETF لترويسة HTTP باسم Idempotency-Key، لكن المزودين ينفذون المفاتيح بطرق مختلفة، فراجع التوثيق.
لماذا تصل تقارير التسليم أحيانًا بترتيب مختلف؟
تولّد أحداث الحالة أنظمة مختلفة، مثل شركات الاتصالات وMeta والمزود، وتُنقل عبر شبكات مع إعادة محاولات. فقد يصل حدث القراءة قبل حدث التسليم، والتكرار أمر طبيعي. خزّن كل حالة مع طابعها الزمني، ولا تُرجع رسالة من حالة لاحقة إلى سابقة أبدًا، وأزل التكرار بمعرّف الرسالة والحالة.
كيف يتعامل تطبيقي مع حدود المعدل؟
اقرأ الحدود الموثقة لدى المزود، وضع الإرسال الصادر في طابور بدل إطلاقه مباشرة من طلبات المستخدمين، واستخدم محدِّدًا من نوع token-bucket أو ما يشبهه لديك. وعند تلقي HTTP 429، توقف وأعد المحاولة بعد المدة المذكورة في ترويسة Retry-After أو باستخدام تراجع أسي مع جيتر. ولا تعد محاولة أخطاء التحقق من نوع 4xx.
ماذا أختبر في بيئة sandbox للمراسلة؟
اختبر إخفاقات المصادقة، وأرقام الهواتف غير الصالحة، وأخطاء متغيرات القوالب، والمهلات مع إعادة محاولة idempotent، وwebhooks المكررة وغير المرتبة، واستجابات حدود المعدل، والرسائل الطويلة والعربية، والتحقق من توقيع webhook. ثم شغّل تجربة إنتاج صغيرة بأرقام حقيقية، لأن بيئات sandbox نادرًا ما تحاكي سلوك شركات الاتصالات وMeta بدقة.
المصادر
تابع القراءة
مزيد من الأدلةالتكامل
كيف تربط نظام CRM بصندوق وارد متعدد القنوات باستخدام webhooks؟
اربط نظام CRM بصندوق وارد متعدد القنوات عبر webhooks: الأحداث التي تُزامَن، وعدم التكرار (idempotency)، وإعادة المحاولة، ومطابقة جهات الاتصال، وخصوصية البيانات.
8 دقائق للقراءة
التكامل
كيف تختار واجهة مراسلة برمجية: قائمة تحقق للمديرين التقنيين
كيف تختار واجهة مراسلة برمجية: قائمة تحقق للمدير التقني تشمل القنوات وجودة المسارات والـ webhooks والأمان وحدود المعدل وإعادة المحاولة وSMPP وMCP والامتثال والأسعار.
13 دقيقة للقراءة
واتساب
رموز أخطاء WhatsApp Cloud API: معانيها وطرق إصلاحها
أكثر رموز أخطاء WhatsApp Cloud API شيوعًا، من 131047 و131026 إلى 132001 و130429: معنى كل رمز، وطريقة إصلاحه، ومتى لا يجوز إعادة المحاولة.
8 دقائق للقراءة
