تخطّي إلى المحتوى
English كل صفحات التوثيق تسجيل الدخول

ربط نظامك بالويب هوك

إن كانت الحجوزات موجودة أصلاً في نظام تتحكم به — نظام إدارة وحدات، أو مدير قنوات، أو خلفية داخلية — فهذا أسرع المسارات، والوحيد اللحظي في الاتجاهين. أنت ترسل حدثاً موقّعاً؛ فيحتسبه سويتي على باقة المضيف أو محفظته، وينشئ التنظيف، ويرسل منظّفاً.

ما تحتاجه

الخطوة ١ — أنشئ نقطة الربط

التكاملات ← نقاط الربط ← إنشاء. تُعرض عليك قيمتان، مرة واحدة:

نقاط الربط، ورابط الاستقبال والمفتاح

الخطوة ٢ — اربط وحداتك

سجّل سطراً لكل مضيف تحت العملاء ← عملاء الشريك، بمعرّفك أنت له، واربط معرّفات وحداتك بوحدات سويتي. يجب أن يؤدي unit_id الوارد إلى مضيف ووحدة، وإلا قُبل الحدث ثم فشل بذلك السبب على سطره.

الخطوة ٣ — وقّع الطلب

كل طلب يحمل HMAC-SHA256 على الجسم الخام، بمفتاح التوقيع:

X-Suitiee-Signature: sha256=<hex hmac_sha256(rawBody, secret)>
$body = json_encode($payload, JSON_UNESCAPED_UNICODE);
$signature = 'sha256=' . hash_hmac('sha256', $body, $webhookSecret);
const body = JSON.stringify(payload);
const signature = 'sha256=' + crypto.createHmac('sha256', secret).update(body).digest('hex');

وقّع البايتات نفسها التي ترسلها. إعادة التسلسل بعد التوقيع — ترتيب مفاتيح مختلف، أو مسافات مختلفة، أو ترميز يونيكود مختلف — تنتج توقيعاً لن يطابق.

يجب أن يحمل الجسم أيضاً timestamp بصيغة ISO 8601 في المستوى الأعلى، وأن يكون ضمن خمس دقائق من ساعتنا في أي من الاتجاهين. هذا ما يمنع إعادة تشغيل طلب مُلتقَط.

إن كنت ترسل من عناوين ثابتة، أضفها إلى قائمة السماح على نقطة الربط؛ ويُرفض عندها ما عداها.

الخطوة ٤ — أرسل الحدث

POST https://suitiee.com/webhooks/receive/{partnerSlug}/{webhookId}

{
  "event_id": "res_9f8c12",
  "event_type": "checkout",
  "timestamp": "2026-09-04T14:00:00Z",
  "unit_id": "APT-204",
  "checkout_datetime": "2026-09-04T11:00:00Z",
  "next_checkin_datetime": "2026-09-04T16:00:00Z",
  "guest_name": "سارة علي",
  "notes": "مغادرة متأخرة معتمدة؛ مناشف إضافية."
}
الحقل مطلوب ماذا يفعل
event_type نعم اسم حدثك. يُربط بإجراء تنظيف عبر ربط الأحداث على نقطة الربط، أو إجرائها الافتراضي
unit_id نعم معرّفك للوحدة. يجب أن يؤدي إلى مضيف ووحدة
checkout_datetime نعم متى غادر الضيف. يثبّت نافذة التنظيف
timestamp نعم متى أرسلت. داخل نافذة إعادة التشغيل
event_id يُنصح به بشدة مفتاح منع التكرار — انظر أدناه
next_checkin_datetime لا الوصول التالي إن عُرف. يُجدول التنظيف لينتهي قبله. وبدونه تكون النافذة خمس ساعات
cleaning_window_minutes لا طول نافذة صريح
guest_name وguest_email وguest_phone وguest_language لا تُسجَّل على الحجز. انظر الملاحظة أدناه
notes لا نص حر يصل إلى المنظّف

أرسل دائماً event_id ثابتاً. تُطوى التكرارات عليه، فإعادة الإرسال بعد انقطاع تنشئ تنظيفاً واحداً لا اثنين. وبدونه يُشتقّ معرّف من نوع الحدث ورقم الحجز، وإلا فمن بصمة الجسم.

الخطوة ٥ — اقرأ الجواب

200 {"status":"received"} تعني أن الحدث خُزّن ووُضع في الطابور. لا تعني أن التنظيف أُنشئ بعد — فذلك يحدث لاحقاً، وتظهر النتيجة على سطر الحدث تحت التكاملات ← أحداث الربط، وعبر GET /partner/webhooks/events.

أحداث الربط مع أثر معالجتها

الحالة ما تعنيه
200 received قُبل ووُضع في الطابور
200 duplicate رأينا event_id هذا؛ ولم تُعد المعالجة
401 التوقيع ناقص أو خاطئ، أو الطابع الزمني ناقص أو قديم
403 نقطة الربط موقوفة، أو العنوان غير مسموح به
404 المعرّف أو رقم نقطة الربط خاطئ، أو الحساب غير نشط
429 تجاوزت ١٠٠ طلب في الدقيقة. تراجع وأعد المحاولة

كل ما يُكتشف بعد القبول لا يُفشل نداء HTTP. المحفظة الفارغة أو الوحدة غير المرتبطة نتائج تشغيلية لا أخطاء نقل. يُجاب النداء بـ received، ويقول سطر الحدث failed مع السبب. ولا يعود 4xx إلا لمشكلات التوقيع والطابع الزمني ونقطة الربط.

بيانات الضيف اختيارية وتبقى اختيارية

أرسلها على حدث الحجز، أو على حدث المغادرة، أو لا ترسلها أبداً. الحدث الذي يحذفها يترك ما لدينا كما هو بدل أن يمسحه؛ والحدث الذي يتضمّنها يحدّثه، وهكذا يصلنا بريد مصحّح.

بريد الضيف وجواله بيانات شخصية بموجب نظام حماية البيانات الشخصية. تُخزَّن على الحجز، وتُعرض للمشغّل والمضيف اللذين يملكانه، وتُبعَد عن كل عمود قائمة، ولا تُكتب في أي سطر سجل. أرسلها فقط إن كان أساسك النظامي لمشاركتها يسمح — وكل شيء آخر يعمل تماماً بدونها.

نداءات الرجوع إليك

اضبط رابط الرجوع ومفتاح الرجوع تحت الإعدادات، فيرسل سويتي إليك تحديثاً موقّعاً حين يُنشأ تنظيف أو تتغير حالته أو يكتمل، وكذلك لزيارات الصيانة.

X-Suitiee-Callback-Signature: sha256=<hmac_sha256(body, callbackSecret)>

أجب بـ 2xx. وما ليس 2xx أو ما ينقطع يُعاد ثلاث مرات — بعد ٣٠ ثانية ودقيقتين وعشر دقائق — ثم يُسجَّل فشلاً نهائياً.

حين يحدث خطأ

ما تراه ما يعنيه ما تفعله
401 Invalid webhook signature البايتات الموقّعة ليست المرسلة وقّع الجسم المتسلسل حرفياً وأرسل النص نفسه
401 …outside acceptable window انحرفت ساعتك، أو أُرسل الحدث متأخراً بعد الطابور أرسل الطابع لحظة الإطلاق بتوقيت UTC؛ وراجع مزامنة الساعة
200 duplicate لحدث ثانٍ حقيقي حدثان يتشاركان event_id، أو لم ترسل واحداً فتصادمت البصمة أرسل event_id مميزاً وثابتاً لكل حدث
سطر الحدث يقول فشل — الوحدة غير مرتبطة unit_id لم يطابق أي وحدة اربطه تحت عملاء الشريك وأعد معالجة السطر
سطر الحدث يقول فشل — الرصيد غير كافٍ لم تغطِ محفظة المضيف وباقاته التنظيف اشحن، ثم أعد معالجة السطر
قُبل ولا يصل نداء رجوع لا رابط رجوع مضبوط، أو أجاب رابطك بغير 2xx ثلاث مرات راجع الإعدادات؛ الإعادات ٣٠ ثانية / دقيقتان / ١٠ دقائق
لا يُحتسب شيء ولا يظهر منظّف الحساب ما زال في الوضع التجريبي انظر الوضع التجريبي

آخر تحديث 2026-09-04

هل أفادتك هذه الصفحة؟