SMS
أرسل رسائل SMS حول العالم عبر بوابة SMPP في Orbit. يتصل Orbit بمشغّلين من المستوى الأول ومجمّعين في أكثر من 190 دولة، ويتعامل مع الربط (concatenation) والترميز وتتبع التسليم تلقائيًا. تغطي هذه الصفحة القناة من البداية إلى النهاية: أي مرسل ترفق، وأين التسجيل مطلوب قبل قبول الحركة، وكيف يحدد الترميز كلفة كل إرسال، وماذا يخبرك دور حالة التسليم، وكيف تقرأ الإخفاقات عندما تعود.أرسل SMS
to وfrom كـE.164 — الصيغة الدولية الكاملة مع بادئة الدولة، مثل +14155552671. انظر كيف يتحقق Orbit ويُنًّظم الأرقام في دورة حياة الأرقام.
استخدم مفتاح sandbox (dv_test_sk_… عبر curl، ORBIT_API_KEY في الكود) أثناء النمذجة — الإرسالات في sandbox مُحاكاة ومجانية ولا تصل إلى مشغّل أبدًا. بدّل المفتاح الحي عند الإنتاج؛ لا شيء من الكود أعلاه يتغير.
تبويب Node أعلاه يستخدم المساعد العام orbit.messages.send({ channel: 'sms', ... })؛ الطريقة المُنوَّهة بالقناة orbit.messages.sendSms({ to, body, from }) تفعل نفس POST — اختر شكلًا واحدًا واستخدمه بثبات.
الاستجابة
تستجيب النقطة النهائية بـHTTP 202 Accepted — الرسالة مُثبَّتة ومُدرجة في طابور التسليم (لم تُسلَّم للمشغّل بعد).id هو معرّف رسالة منصة على شكل msg_ متبوع بـ32 حرف hex صغيرة (لا وسيط قناة)؛ تتبّع دورته عبر webhooks التسليم.
data.id للاستعلام أو التسوية لاحقًا، وتفرّع على data.status (يبدأ في queued):
- Node.js / fetch (TypeScript) — قيمة SDK أو
res.json()تحمل الغلاف:message.data.id,message.data.status. - Python —
send_smsيعيد جسم JSON خام كقاموس:message["data"]["id"],message["data"]["status"]. - Go —
SendSMSيفك الغلاف إلى struct مُنوَّه:msg.Data.ID,msg.Data.Status. - Ruby / PHP (غطاء الهروب) —
client.requestيعيد جسم JSON خام:send.dig("data", "id")/$send['data']['id'].
segments وencoding في كل إرسال — هما ما تُحصَّل به الفواتير، وتُظهر الأقسام أدناه كيف تتوقّعهما قبل الإرسال.
أنماط شائعة
نمطان يغطيان كل تكامل SMS إنتاجي تقريبًا: إعادات محاولة آمنة عند الإرسال، وصفحات تاريخ الرسائل.إرسال idempotent بـIdempotency-Key
نقاط POST التي تنشئ موارد تقبل رأسIdempotency-Key. محاولة تُقدّم نفس المفتاح تعيد الغلاف الأصلي — لا إرسال مزدوج، لا رسوم ثانية. SDKs تصك UUID لكل استدعاء تلقائيًا؛ عبر HTTP خام تضبطه صراحة. في كلا الحالتين، مرِّر مفتاحًا ثابتًا عبر محاولات إرسال منطقي واحد بدل أن تُصك كل محاولة مفتاحها الخاص.
Node
Python
صفح GET /messages عبر استدعاءات القائمة في SDK
تاريخ الرسائل مُصفَّح بمؤشر (cursor): كل صفحة تحملmeta.pagination.cursor وmeta.pagination.has_more؛ مرِّر المؤشر حتى has_more يصبح false. Node SDK يُشحن حلقة مؤشر ويينمكر يصفّح تلقائيًا؛ SDKs الأخرى تُصفّح عبر طرق القائمة أو غطاء الهروب:
Node
Python
مثال عمل: إرسال واستعلام ومعالجة الإخفاقات
التسلسل أدناه هو نفسه من البداية إلى النهاية: POST الإرسال، استعلامGET /messages/{id} (أو خذ webhook — الاستعلام هو الاحتياطي)، وتفرّع يقينًا عندما يخفق شيء. الجسم عمداً إرسال UCS-2 لترى قرار الترميز يعود بدل افتراض تسعير GSM-7.
1. أرسل الرسالة
from أو sender_pool_id أو messaging_service_id أو from_extension — وإلا تعيد النقطة HTTP 422 مع SENDER_REQUIRED (مثلًا عندما تتسلل لصقة مثل "from": null إلى طلبك). انظر اختر نوع المرسل لما يعنيه كل محدد.
2. اقرأ استجابة الإرسال
status: queued هي الحالة البدئية — لا شيء سُلِّم بعد، ولا external_id (مرجع جهة المشغّل) أعيد. حقلا segments وencoding هما ما يضرب تسعير المقاطع ضدهما؛ اعتبرهما الفاتورة، لا تلميحًا.
3. استعلم الصف
عندما لا تستطيع (أو لا تريد) الاشتراك في webhooks، استعلمGET /messages/{id} على المعرف الذي عاده الإرسال. يتقدم الصف عبر sending → sent → delivered / إخفاق نهائي. كل استجابة تُظهر أيضًا metadata.classified_error_code للإخفاقات النهائية وmetadata.no_dlr_channel لصفوف Meta-DM، فتفرّع على حقل status قابل للآلة، لا على سلاسل التسميات.
sending (المزود التقطها) أو sent (المزود قبلها) قبل delivered. أضف ?include=webhook_deliveries عندما تريد تاريخ الفَن-أوت في نفس الجولة.
4. تفرّع على الإخفاقات
تفرّع علىstatus الاستعلام، أو data.status webhook، أو metadata.classified_error_code — جميعها تحكي القصة نفسها. عائلات الإخفاق أدناه هي التي تتعامل في الواقع:
على أي webhook
message.failed، حقلا data.status هو المتفرع — submitted_no_receipt وexpired يمتطيان نفس الحدث، وربما يأتي message.delivered لاحقًا حتى بعد أي منهما.
أساسيات توصيل SMS
توصيل SMS يدور على ثلاثة أشياء، بهذا الترتيب: ممن ترسل، أين، وبأي سرعة. انطلِق فيها صحيحًا وتصبح الترميز هو المتغير الوحيد المتبقي للكلفة.اختر نوع المرسل
يوجد المرسلون لسبب واحد لكل منهم: التوصيل. تحتاج معرّف مرسل مُعتمد لقواعد الدولة الوجهة، أو يُرشِّح المشغّل الحركة قبل أن تكلفك مقطعًا — انظر متطلبات امتثال الدولة.
التسجيل على لوحة القيادة
جوّالة لوحة القيادة تأخذ أقل من خمس دقائق وتلتقط وضعَي الإخفاق أدناه قبل كتابة سطر كود.- افتح Channels → SMS في لوحة القيادة.
- انقر Attach Sender واخِر نوع المرسل أعلاه. يُحقِّق Orbit الصيغة (رقم E.164، معرّف أبجدي رقمي 3–11، أو مرجع مجمع) ويتحقق هل الوجهة التي اخترتها افتراضية تتطلب التسجيل.
- أرسل رسالة اختبارية إلى رقم تملكه. يُظهر المحرر
segmentsوencodingسطريًا، فترى الكلفة المقطعية المُقدَّرة قبل الإرسال. - إذا رفض منعك الوجهة الربط (US بلا حملة 10DLC، دولة مقيدة بلا موافقة معرّف مرسل)، يوجّهك المُرشد إلى تدفق التسجيل — انظر القسمَين التاليَين.
GET /api/v1/messaging/senders عبر API.
تسجيل 10DLC & أنواع الحملات (الولايات المتحدة)
إذا أرسلت إلى وجهات US عبر أرقام طويلة رقمية، يتطلب المشغّلون التسجيل؛ الحركة غير المسجلة تُرشَّح أو تُتَرنَّق أو كلاهما. يُقدِّم Orbit التسجيل عبر The Campaign Registry نيابة عنك — الجوَّالة الكاملة (علامة → حملة → موافقة → طوابق إنتاجية) في دليل تسجيل 10DLC. النقطة US-خصوصية لتبقى في رأسك: الإنتاجية بعد التسجيل تُمنَح ك-sqف يومي، لكل رقم على مقاطع بناءً على درجة فحص علامتك — لا معدل في الثانية. إذا احتجت قدرة يومية أكبر، ارفع درجة الفحص (بيانات علامة كاملة، EIN، موقع ويب) أو ألحِق أرقامًا أكثر بالحملة. للوجهات غير-US التي تقيد المعرّفات الأبجدية الرقمية (معظم أوروبا، البرازيل، بنغلاديش، أجزاء APAC)، التدفق الموازي هو تسجيل معرّف المرسل، الذي يسجّل موافقتك لكل دولة ويُلحِق وثائق KYC الداعمة. منع وقت الإرسال يرفض الحركة للدول المقيدة حتى يصبح مُدخَل الدولة المطابقapproved — لا ترشيح صامت، يعود الإخفاق كـrejected مرئي.
الهند هي الاستثناء: معرّفات مرسلها (“Headers”) تُسجَّل عبر DLT/TRAI بدل التدفق العام — انظر تسجيل DLT الهند.
الترميز والربط
الترميز هو المتغير الوحيد للكلفة الذي يبقى على مرسل مسجّل صحيحًا. SMS يُفوتر بالمقاطع، وعدد المقاطع يعتمد كليًا على أي أبجدية يتسع الجسم.GSM-7 مقابل UCS-2
- GSM-7 — أبجدية GSM سبعة-بت (ASCII زيادة قليل:
@,£,€, بعض اليونانية). جسم يتسعها يحصل حتى 160 حرفًا لكل مقطع، أو 153 حرفًا على إرسال متعدد الأجزاء (7 لكل مقطع تذهب إلى رأس UDH للربط). - UCS-2 — أي حرف خارج GSM-7 (emoji، CJK، اقتباسات ذكية، معظم الكتابات اللالاتينية) يقلب الرسالة كلها إلى ترميز 16-بت. جسم يحصل حتى 70 حرفًا لكل مقطع، أو 67 على متعدد الأجزاء.
مثال عمل
شُحِنَ طلبك — ردّ YES — 30 حرفًا، كلها GSM-7 → مقطع واحد, GSM-7.
إلحاق emoji واحدة يقلب الأبجدية: 54 حرفًا في UCS-2 → يبقى مقطعًا واحدًا, لكن نشرة 160-حرف ASCII تصبح مقطعَي UCS-2 لحظة أن تتسلل emoji. على نطاق واسع، ذلك هو الرقم الذي يقود الكلفة.
المنصة تعد المقاطع قبل الترحيل؛ استجابة الإرسال تحمل القرار:
wasTruncated: true فتراه بدل أن تتعجب أين ذهب الذيل. هذا ما تسميه قائمة الميزات “رسائل مربوطة حتى 10 مقاطع”. اقرأ segments في كل إرسال وتفرّع تقديرات فوترتك عليه — هو بالضبط ما يضرب تسعير المقاطع ضده.
حدود المعدل، الإنتاجية، ومجمعات المرسلين
ححدان مستقلان يقعان على إنتاجية SMS، وعليك مسح كلاً:- حد الطلب جهة API. 100 طلب/دقيقة لكل مستأجر افتراضيًا على
POST /messages/sms، مفنوح لكل منظمة. فوقه تتلقى429 RATE_LIMITED؛ انظر دليل حدود المعدل للرؤوس ومعالجة المحاولة. جدول القنوات الكامل أدنى. - إنتاجية جهة المرسل. US 10DLC: سقف يومي، لكل رقم، على المقاطع، ضبطه طابق فحصك. في الموضع الآخر: أيًّا يدعمه مسار الوجهة لكل مرسل.
sticky أو round_robin أو random أو geomatch، وتضرب إنتاجية المرسل بحجم المجمع. تتيح المجمعات أيضًا دوران المرسل المتدنِّي دون تغيير كود الإرسال — نقطة صحة المجمع تخبرك أي عضو يتدهور قبل أن يصبح مشكلة توصيل.
دورة حالة الرسائل
كل SMS صادر يحملstatus يتقدم بينما ينتقل الرسالة من استدعائك API نحو الهاتف — أو نحو إخفاق نهائي:
queued → sending → sent → delivered (أو failed / undelivered / rejected / expired)
اشترك في انتقالات الحالة عبر webhooks باستخدام أحداث message.sent وmessage.delivered وmessage.failed — webhook لكل انتقال، كل واحد يحمل id الرسالة وقيمة status الجديدة.
النتائج التي تصيد المُشغَّلِين:
submitted_no_receipt— المزود قبل الإرسال، لا DLR عاد داخل نافذة 30 دقيقة SMPP. مُعلَّم وسيط (is_terminal: false) لأنdeliveredمتأخر أو إخفاق DLR ربما يأتيان ويكتبان فوقه. تعامل معه كـخارج مجهول، لا تسليمًا ولا إخفاقًا.expired— DLR وصل بعد اغلاق نافذة الوصول المتأخر. صف مغلق، نتيجة غير قابلة للمعرفة؛ يُفن-أوت علىmessage.failed.cancelled— قابل للوصول منك فقط؛ لا webhook يشتعل له أبدًا.
is_terminal تُقَم في دورة التسليم؛ المعاني لكل حالة وجدول الانتقالات الكامل في مرجع دورة حالة الرسائل.
استكشاف الأخطاء
عندما يصلmessage.failed، تفرّع على status الرسالة، لا نوع الحدث — submitted_no_receipt وexpired يُفن-أوتان على ذلك الحدث أيضًا. اقرأ metadata.classified_error_code لمعالجة الآلة، وerror_code / error_message لصياغة المشغّل الخاصة عندما تفتح تذكرة.
حزمة التصعيد التي تجيب تذكرة دعم من أول مرة: معرّف مستأجرك، ومعرّف رسالة واحد، و**
classified_error_code** للصف — إضافة مرجع المزود من سجل التسليم لصفوف DLR-عراض. يُظهر دليل سجل التسليم كيف تُرشِّح الحالة؛ بحث الرقم هو كيف تقول رقمًا ميتًا من رقم حي قبل إعادة الإرسال.
التسعير
تسعير SMS هو للمقطع ويختلف بحسب الدولة الوجهة. تحقق صفحة التسعير أو استعلم نقطةGET /api/v1/pricing/messaging?country=<ISO> لمعدلات حقيقية الزمن (مصفوفة channels المعادة تتضمّن sms).
الرقم التخطيطي يأتي من الأقسام السابقة: اضرب معدل المقطع الذي يعيده نقطة التسعير في قيمة segments التي تحملها استجابة الإرسال. إرسالان مُطابقان يُفوتران مختلفن لحظة أن يقلب ترميز أحدهما إلى UCS-2 — انظر الترميز والربط لمتى يحدث ذلك وكيف تُعيده إلى الطبيعي.
الميزات
- رسائل A2P وP2P — دعم تطبيق-إلى-شخص وشخص-إلى-شخص
- وصول عالمي — أكثر من 190 دولة عبر شبكة مجمّعات Devotel
- تقارير تسليم — webhooks حالة لحظية لكل رسالة
- رسائل مربوطة — SMS متعدد الأجزاء مُعامَل شفافًا (حتى 10 مقاطع)
- تحقق E.164 — تحقق صيغة الرقم الهاتف التلقائي
- دعم Unicode — GSM-7 وUCS-2 كاملين مع اكتشاف تلقائي وتنظيم اقتباسات ذكية
- معرّف مرسل — معرّفات مرسل أبجدية رقمية حيث تدعم التنظيمات المحلية، مقيدة بالتسجيل حيث يلزم
حدود المعدل
إرسالات SMS تحدى إلى 100 طلب/دقيقة لكل مستأجر افتراضيًا على نقطة/messages/sms. الحد مفنوح لكل مستأجر (لكل منظمة)، لا لكل IP أو لكل خطة، فالمُتَّصِلُون المتوافقون داخل نفس المستأجر يشتركون في حوض واحد ولا يؤثر المستأجرون المنفصلون في بعضهم.
تحتاج سقفًا أعلى؟ السقف لكل المستأجر قابل للتجاوز عبر إعدادات الرسائل لمنظمتك (channel_rate_overrides.sms) — اتصل بالدعم أو اضبطه من لوحة القيادة. تجاوز الحد يعيد 429 Too Many Requests مع رمز الخطأ RATE_LIMITED؛ انظر دليل حدود المعدل للرؤوس ومعالجة المحاولة.
نفس نموذج القناة/الدقيقة/المستأجر ينطبق على قنوات الرسائل (كل واحد قابل للتجاوز مستقلًا):