العودة إلى التوثيق

توثيق Webhooks

استلم إشعارات فورية عند حدوث أحداث في المتاجر المتصلة

أنواع الأحداث

يرسل ZaLinkAI webhooks للأحداث التالية. كل حدث يتضمن حمولة JSON تحتوي على نوع الحدث والطابع الزمني ومعرف المتجر وبيانات خاصة بالحدث.

order.created

تم تقديم طلب جديد

order.updated

تغيرت حالة الطلب أو تفاصيله

order.completed

تم تنفيذ الطلب وإكماله

order.cancelled

تم إلغاء الطلب من قبل التاجر أو العميل

product.created

تمت إضافة منتج جديد إلى الكتالوج

product.updated

تغيرت تفاصيل المنتج أو السعر أو المخزون

product.deleted

تم حذف منتج من الكتالوج

customer.created

تم إنشاء حساب عميل جديد

customer.updated

تغيرت معلومات ملف العميل

app.uninstalled

قام التاجر بفصل ZaLinkAI

أمثلة الحمولة

اختر حدثاً لعرض مخطط الحمولة الخاص به.

{
  "event": "order.created",
  "timestamp": "2026-01-27T12:00:00Z",
  "storeId": "store_abc123",
  "data": {
    "orderId": "ord_789",
    "status": "pending",
    "total": 249.99,
    "currency": "SAR",
    "items": [
      { "productId": "prod_1", "name": "Wireless Headphones", "qty": 1, "price": 249.99 }
    ],
    "customer": { "id": "cust_456", "email": "customer@example.com" }
  }
}

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

يتضمن كل طلب webhook رأس X-ZaLink-Signature يحتوي على ملخص HMAC-SHA256 بصيغة hex. تحقق من هذا التوقيع للتأكد من أن الطلب صادر من ZaLinkAI.

1

احصل على جسم الطلب الخام كنص

2

احسب HMAC-SHA256 باستخدام مفتاح webhook السري

3

قارن الملخص المحسوب مع رأس X-ZaLink-Signature

4

استخدم مقارنة الوقت الثابت لمنع هجمات التوقيت

سياسة إعادة المحاولة

إذا أرجع نقطة النهاية رمز حالة غير 2xx أو انتهت المهلة (30 ثانية)، يعيد ZaLinkAI المحاولة بتراجع أسي:

المحاولةالتأخير
المحاولة الأولىدقيقة واحدة
المحاولة الثانية5 دقائق
المحاولة الثالثة30 دقيقة
المحاولة الرابعةساعتان
المحاولة الخامسة6 ساعات

بعد 5 محاولات فاشلة، يتم تمييز webhook على أنه فاشل ويتم إخطار التاجر عبر البريد الإلكتروني.

أمثلة معالج Webhook

تنفيذات كاملة لمعالج webhook مع التحقق من التوقيع.

const crypto = require('crypto');

function verifyWebhook(payload, signature, secret) {
  const computed = crypto
    .createHmac('sha256', secret)
    .update(payload)
    .digest('hex');
  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(computed)
  );
}

// Express handler
app.post('/webhooks/zalink', (req, res) => {
  const signature = req.headers['x-zalink-signature'];
  const isValid = verifyWebhook(
    JSON.stringify(req.body),
    signature,
    process.env.WEBHOOK_SECRET
  );
  if (!isValid) return res.status(401).send('Invalid signature');

  const { event, data } = req.body;
  switch (event) {
    case 'order.created':
      handleNewOrder(data);
      break;
    case 'product.updated':
      syncProduct(data);
      break;
  }
  res.json({ received: true });
});

أفضل الممارسات

أرجع استجابة 200 فوراً، ثم عالج الحدث بشكل غير متزامن

نفّذ التكرارية باستخدام معرف الحدث لتجنب المعالجة المكررة

خزّن الحمولة الخام لأغراض التصحيح والتدقيق

أعد المراقبة والتنبيهات لحالات فشل webhook

استخدم نقاط نهاية HTTPS مع شهادات TLS صالحة