انتقل إلى المحتوى
Wbiztool

أدلة المنتج

Webhooks الرسائل الواردة (المستمعون)

يربط المستمع أحد أرقام WhatsApp الخاصة بك بـ Unibox ويمكنه إرسال webhook للرسائل الواردة إلى خادمك. في لوحة التحكم، تُدار المستمعات في صفحة Incoming Triggers (المشغّلات الواردة). بمجرد أن يصبح الرقم مستمعًا، تُزامَن دردشاته مع صندوق الوارد Unibox، وإذا أضفت رابط webhook، ترسل Wbiztool كل رسالة جديدة إلى خادمك. استخدم webhooks لتسجيل المحادثات في نظام CRM، أو لتنبيه فريقك، أو لبناء رد تلقائي.

قبل أن تبدأ#

  • إضافة Unibox. تكلفتها 20 دولارًا شهريًا أو 200 دولار سنويًا لكل رقم WhatsApp، وعدد المستمعين الذين يمكنك إضافتهم يساوي كمية الإضافة. اشترِها تحت Available Add-ons (الإضافات المتاحة) في Billing & Plans (الفوترة والباقات) داخل لوحة التحكم. بدونها، تُفتح صفحة Incoming Triggers مع ذلك، لكن النقر على Add New Listener (إضافة مستمع جديد) يعرض Unibox Add-on Required (إضافة Unibox مطلوبة) مع زر Subscribe to Unibox Add-on (الاشتراك في إضافة Unibox).
  • رقم WhatsApp متصل في WhatsApp settings (إعدادات WhatsApp). لا يمكن إضافة إلا الأرقام المتصلة التي ليست مستمعين بعد.
  • يجب أن تكون مالكًا أو محررًا في مساحة العمل.
  • لاستخدام webhooks: رابط عام (استخدم https) لا يتجاوز 100 حرف ويقبل طلبات POST بجسم JSON.

أضف مستمعًا#

  1. افتح المشغّلات الواردة

    في الشريط الجانبي، افتح Unibox وانقر على Incoming Triggers، أو انتقل إلى Incoming Triggers.

  2. ابدأ مستمعًا جديدًا

    انقر على بطاقة Add New Listener.

  3. اختر الرقم

    اختره في Select WhatsApp Number (اختيار رقم WhatsApp). إذا قالت القائمة No available WhatsApp numbers (لا توجد أرقام WhatsApp متاحة)، فكل رقم متصل هو مستمع بالفعل، أو لا يوجد رقم متصل.

  4. أضف webhook (اختياري)

    أدخل Webhook URL (Optional) (رابط webhook، اختياري). بمجرد كتابة رابط، يظهر Webhook Events (أحداث webhook): أبقِ Incoming Messages (الرسائل الواردة) أو Outgoing Messages (الرسائل الصادرة) أو كليهما محددًا. يمكنك إضافة الرابط أو تغييره لاحقًا.

  5. احفظ

    انقر على Add Listener (إضافة مستمع). يظهر المستمع كبطاقة بالحالة Active (نشط). إذا أدخلت رابطًا، يُنشأ له سر webhook.

أدِر المستمعين#

تعرض كل بطاقة الرقم، وحالته، وWebhook URL: (رابط webhook، أو Not configured أي غير مُعدّ)، وLast Activity: (آخر نشاط: آخر مرة فُحص فيها الرقم بحثًا عن رسائل، أو Never أي أبدًا) وWebhook Secret: (سر webhook)، المخفي إلى أن تنقر على زر العين.

افتح القائمة ⋮ في بطاقة من أجل:

الإجراءما يحدث
Edit (تعديل)تغيير رابط webhook أو أحداث webhook أو السر. لا يمكن تغيير الرقم.
Disable / Enable (تعطيل / تفعيل)يضبط التعطيل المستمع على Inactive (غير نشط): يتوقف الرقم عن المزامنة مع صندوق الوارد ولا تُرسل أي webhooks. ويعيده التفعيل إلى Active.
Delete (حذف)يزيل المستمع بعد التأكيد. تبقى المحادثات الموجودة بالفعل في صندوق الوارد. إعادة إضافة الرقم نفسه لاحقًا تستعيد المستمع. إذا أدخلت رابط webhook عند إعادة إضافته، يحتفظ المستمع بسر webhook السابق، إن كان له سر، بدلًا من الحصول على سر جديد.

حالات المستمع#

الحالةالمعنى
Active (نشط)تُزامَن الرسائل وتُرسل webhooks ما دام الرقم متصلًا.
Pending (قيد الانتظار)لم يكن الرقم متصلًا عند إنشاء المستمع، مثلًا بواسطة Zapier. انقر على Enable بمجرد اتصال الرقم.
Inactive (غير نشط)معطّل. لا يُزامَن شيء ولا تُرسل أي webhooks.

الإحصاءات#

البطاقةما تعرضه
Active Listeners (المستمعون النشطون)كل المستمعين في الصفحة، بما في ذلك المعطّلون.
Available Numbers (الأرقام المتاحة)الأرقام المتصلة التي ليست مستمعين بعد. الأرقام التي حذفت مستمعها لا تزال تُحتسب هنا كمستخدمة، لذا قد يظهر عدد أقل مما يمكنك إضافته فعلًا.
Total Limit (الحد الإجمالي)عدد المستمعين الذي تسمح به إضافة Unibox الخاصة بك.
Messages Today (رسائل اليوم)غير متتبَّع بعد؛ يعرض دائمًا 0.

غيّر رابط webhook أو الأحداث#

  1. افتح المستمع

    انقر على ⋮ في البطاقة، ثم على Edit.

  2. حدّث الإعدادات

    غيّر Webhook URL (Optional) وWebhook Events. امسح الرابط لإيقاف webhooks لهذا الرقم: يُزال سره أيضًا، ويُنشأ سر جديد إذا أضفت رابطًا مرة أخرى.

  3. احفظ

    انقر على Update Listener (تحديث المستمع).

أعد إنشاء السر#

في Edit Listener (تعديل المستمع)، انقر على زر التحديث بجانب Webhook Secret وأكّد. يُحفظ السر الجديد فورًا، حتى لو أغلقت مربع الحوار بعد ذلك دون النقر على Update Listener، وتُوقَّع الطلبات به من ذلك الحين. حدّث خادمك بالسر الجديد فورًا.

كيف تُسلَّم webhooks#

ترسل Wbiztool طلب POST واحدًا إلى رابطك لكل رسالة جديدة يُعثر عليها عند مزامنة الرقم، وهو ما يحدث كل بضع دقائق ما دام الرقم متصلًا وغير مشغول بإرسال الرسائل.

  • الأحداث: message_received للرسائل التي يرسلها الآخرون إلى رقمك، وmessage_sent للرسائل المرسلة منه (من الهاتف أو الحملات أو API). لا تُرسل إلا الأحداث المحددة في Webhook Events.
  • الردود من صندوق الوارد Unibox لا تُطلق عادة message_sent، لأن صندوق الوارد يحتويها بالفعل عند تشغيل المزامنة.
  • الاستجابة: ردّ بأي حالة HTTP من النوع 2xx خلال 8 ثوانٍ.
  • إعادة المحاولة: تُعاد المحاولة عند انتهاء المهلة أو خطأ الاتصال أو الاستجابة 429 أو 5xx حتى 3 مرات، بعد 30 ثانية ثم دقيقة ثم دقيقتين. أما الاستجابات الأخرى، مثل 400 أو 404، فلا تُعاد محاولتها.
  • 410 Gone: تزيل Wbiztool رابط webhook من المستمع وتتوقف عن الإرسال إليه. تظل الرسائل تُستورد إلى Unibox.
  • الترتيب: تُرسل الطلبات بشكل مستقل وقد تصل بغير ترتيب. رتّب حسب message.timestamp إذا كان الترتيب مهمًا.

الترويسات#

الترويسةالقيمة
Content-Typeapplication/json
X-Wbiztool-Eventmessage_received أو message_sent
X-Wbiztool-Timestampوقت إرسال webhook، بصيغة ISO 8601 بتوقيت UTC. مطابق لـ timestamp في الجسم.
X-Wbiztool-Webhook-Idمعرّف المستمع. مطابق لـ webhook_id في الجسم.
X-Wbiztool-Signaturesha256= متبوعًا بالتوقيع. يُرسل كلما كان للمستمع سر، وهذا هو الحال دائمًا عند ضبط رابط.

الحمولة#

أمثلة على أجسام webhook
{
  "event": "message_received",
  "timestamp": "2026-09-16T10:31:12.482913+00:00",
  "webhook_id": 42,
  "whatsapp_client_id": "678",
  "whatsapp_phone": "919812345678",
  "message": {
    "id": "[email protected]_3EB0C1A2B3D4E5F60718",
    "type": "chat",
    "content": "Hi, is my order #4821 out for delivery?",
    "from": "919876543210",
    "from_name": "Aman",
    "to": "919812345678",
    "timestamp": "2026-09-16T10:29:58+00:00",
    "whatsapp_timestamp": 1789554598,
    "direction": "incoming",
    "status": "pending",
    "is_forwarded": false,
    "forwarding_score": 0
  },
  "contact": {
    "whatsapp_id": "[email protected]",
    "phone": "919876543210",
    "lid": null,
    "phone_hidden": false,
    "name": "Aman",
    "is_group": false,
    "is_business": false
  },
  "organisation": {
    "id": "10314",
    "name": "Acme Stores"
  }
}

الأرقام والمعرّفات والأسماء أعلاه أمثلة.

الحقول على المستوى الأعلى#

الحقلالنوعالوصف
eventstringmessage_received أو message_sent.
timestampstringوقت إرسال webhook (ISO 8601، بتوقيت UTC).
webhook_idintegerمعرّف المستمع.
whatsapp_client_idstringمعرّف رقم WhatsApp الخاص بك، كما يظهر في WhatsApp settings.
whatsapp_phonestringرقم WhatsApp الخاص بك.
messageobjectالرسالة. راجع أدناه.
contactobjectالشخص أو المجموعة التي تدور المحادثة معها. راجع أدناه.
organisationobjectid (نص) وname لمساحة عملك.
groupobjectلدردشات المجموعات فقط: name، اسم المجموعة.

حقول message#

الحقلالنوعالوصف
idstringمعرّف WhatsApp للرسالة. استخدمه لتجاهل التكرارات.
typestringchat للنص. وإلا فنوع WhatsApp، مثل image أو video أو audio أو ptt (ملاحظة صوتية) أو document أو sticker أو location.
contentstringالنص لرسائل chat. للوسائط، تسمية بدلًا منه: 📸 Image أو 🎥 Video أو 🎵 Audio أو 🎤 Voice Message أو 😊 Sticker، أو Document: متبوعًا بنص المستند (Document عندما لا يوجد نص)، أو اسم النوع بأحرف أولى كبيرة لأي شيء آخر، مثل Location. لا تُضمَّن التعليقات المرفقة بالوسائط.
fromstringدائمًا رقم جهة الاتصال (أو معرّف المجموعة)، في الاتجاهين.
from_namestringاسم جهة الاتصال أو المجموعة. قد يكون فارغًا.
tostringدائمًا رقم WhatsApp الخاص بك، في الاتجاهين.
timestampstringوقت إرسال الرسالة على WhatsApp (ISO 8601، بتوقيت UTC).
whatsapp_timestampintegerالوقت نفسه كطابع زمني Unix بالثواني.
directionstringincoming أو outgoing. استخدم هذا الحقل، لا from وto، لمعرفة الاتجاه.
statusstringدائمًا pending حاليًا. لا تعتمد عليه لمعرفة حالة التسليم أو القراءة.
is_forwardedbooleanما إذا كانت الرسالة معاد توجيهها.
forwarding_scoreintegerعدد مرات إعادة توجيهها.
mediaobjectلرسائل الوسائط عندما تتوفر التفاصيل: filename وmimetype وsize بالبايت. لا يُضمَّن الملف نفسه.
quoted_message_idstringفقط عندما تكون الرسالة ردًا على رسالة أخرى.

حقول contact#

الحقلالنوعالوصف
whatsapp_idstringمعرّف WhatsApp، مثل [email protected] لشخص أو …@g.us لمجموعة.
phonestringالرقم دون +، أو معرّف المجموعة للمجموعات. يكون فارغًا عندما يخفي WhatsApp رقم جهة الاتصال.
lidstring أو nullمعرّف الخصوصية الذي يستخدمه WhatsApp لجهة الاتصال، مثل 62337239240946@lid، عندما يستخدم WhatsApp معرّفًا كهذا. وإلا null.
phone_hiddenbooleantrue عندما لا يشارك WhatsApp رقم جهة الاتصال. تملأ Wbiztool الرقم كلما أتاحه WhatsApp.
namestringالاسم المسجّل لجهة الاتصال لدى Wbiztool، أو اسم المجموعة. قد يكون فارغًا.
is_groupbooleantrue لدردشات المجموعات.
is_businessbooleantrue لحسابات WhatsApp Business، عندما يكون ذلك معروفًا.

تحقّق من التوقيع#

يُوقَّع كل طلب بسر المستمع باستخدام HMAC-SHA256. يُحسب التوقيع على جسم الطلب الخام تمامًا كما استُلم، ويُرسل في X-Wbiztool-Signature بالشكل sha256= متبوعًا بالملخص الست عشري بأحرف صغيرة.

احسب التوقيع دائمًا من البايتات الخام قبل تحليل JSON. تحليل الجسم وإعادة ترميزه يغيّره (مثلًا، تصل الأحرف غير الإنجليزية والرموز التعبيرية مُهرَّبة بالشكل \uXXXX)، فلا يتطابق التوقيع.

// Express: keep the raw body for this route
import crypto from "node:crypto";
import express from "express";

const app = express();
const SECRET = process.env.WBIZTOOL_WEBHOOK_SECRET;

app.post("/wbiztool/webhook", express.raw({ type: "application/json" }), (req, res) => {
  const expected = "sha256=" + crypto.createHmac("sha256", SECRET).update(req.body).digest("hex");
  const received = req.get("X-Wbiztool-Signature") || "";

  const valid =
    received.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(received), Buffer.from(expected));
  if (!valid) return res.status(401).send("Invalid signature");

  const data = JSON.parse(req.body.toString("utf8"));
  if (data.event === "message_received") {
    console.log(`New message from ${data.contact.phone}: ${data.message.content}`);
  }
  res.sendStatus(200); // reply quickly; do slow work in the background
});

app.listen(3000);

لا يشمل التوقيع ترويسة الطابع الزمني، لذا لا يحمي من إعادة إرسال طلب (replay). إذا كان ذلك مهمًا، فخزّن كل message.id عالجته وتجاهل التكرارات.

استكشاف الأخطاء وإصلاحها#

الرسالة أو المشكلةما يجب فعله
Unibox Add-on Required عند النقر على Add New Listenerليس لدى مساحة عملك إضافة Unibox. اشترِها تحت Available Add-ons في Billing & Plans داخل لوحة التحكم.
You have reached your unibox numbers limitاحذف مستمعًا لم تعد تحتاج إليه، أو زد كمية الإضافة.
No available WhatsApp numbersاربط رقمًا آخر، أو أن الرقم مستمع بالفعل.
This WhatsApp number is already a listenerعدّل البطاقة الموجودة بدلًا من ذلك.
Invalid WhatsApp clientانقطع اتصال الرقم. أعد ربطه في WhatsApp settings وأعد تحميل الصفحة.
خطأ يذكر value too long عند الحفظرابط webhook أطول من 100 حرف. استخدم رابطًا أقصر.
لا تصل أي webhooksتحقق من أن المستمع Active، وأن الرقم متصل، وأن نوع الحدث محدد، وأن رابطك عام بـ https مع شهادة صالحة. لا تُرسل الرسائل إلا بعد المزامنة التالية، بعد بضع دقائق.
بعض webhooks مفقودةأعاد خادمك حالة 4xx، أو استمر في الفشل خلال المحاولات الثلاث كلها. تحقق من سجلات خادمك في وقت الرسالة المفقودة.
اختفى رابط webhook من المستمعأجاب خادمك بـ 410 Gone، فتوقفت Wbiztool عن الإرسال إليه. أضف الرابط مرة أخرى في Edit Listener.
التوقيع لا يتطابقاستخدم الجسم الخام، لا JSON معاد ترميزه، والسر الحالي. إعادة إنشاء السر تستبدله. ما دام Zap في Zapier يستخدم الرقم، تذهب الطلبات إلى Zapier مع سر Zapier.
يعرض Last Activity: القيمة Neverلم يُفحص الرقم بعد. يجب أن يكون متصلًا وغير مشغول بإرسال الرسائل.

صفحات ذات صلة#