أنواع الأحداث
يرسل 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.
احصل على جسم الطلب الخام كنص
احسب HMAC-SHA256 باستخدام مفتاح webhook السري
قارن الملخص المحسوب مع رأس X-ZaLink-Signature
استخدم مقارنة الوقت الثابت لمنع هجمات التوقيت
سياسة إعادة المحاولة
إذا أرجع نقطة النهاية رمز حالة غير 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 صالحة