EL OUATINETECHNICIEN OUATINE
خدمة جديدة

الـ Webhooks كخدمة

اربط متجرك أو موقعك بمنصة EL OUATINE: كل طلب جديد، كل نموذج مُرسَل، وكل حجز يصل إلى رابطك فوراً كإشعار JSON موقّع — آمن، موثوق، مع إعادة محاولة تلقائية.

افتح لوحة التحكمالوثائق

مجاني للبدء

3 روابط · 10,000 إشعار شهرياً · بدون بطاقة بنكية.

🔏 توقيع HMAC-SHA256

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

🔁 إعادة محاولة ذكية

عند تعذّر الوصول لرابطك نعيد المحاولة تلقائياً: بعد دقيقة، 5 دقائق، 30 دقيقة، ساعتين، ثم 12 ساعة — ولن يضيع أي حدث.

🛡️ حماية من SSRF

نرفض عناوين localhost والشبكات الخاصة والبروتوكولات غير HTTP/HTTPS قبل الحفظ — رابطك الخارجي فقط هو المسموح.

📋 سجل تسليم كامل

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

الأحداث المتاحة

اشترك فقط في أحداثك الخاصة — طلبات متجرك، نماذجك، حجوزاتك.

Eventالوصفdata.*
order.createdطلب جديد مدفوع في متجركorder_id, service_name, price, currency, status, imei
order.statusتغيّرت حالة أحد طلباتكorder_id, service_name, price, currency, status, imei
form.submittedأُرسل نموذج جديدform_id, form_title, submission_id, fields{}
booking.createdحجز جديد في إحدى خدماتكappointment_id, service_name, slot, customer_name, customer_phone
booking.statusتغيّرت حالة أحد حجوزاتكappointment_id, service_name, status

التركيب في 3 خطوات

1. أنشئ رابطاً

من حسابك: الـ Webhooks ← رابط جديد. الصق عنوان URL المستقبِل واختر الأحداث — ستحصل على سرّ التوقيع (يُعرض مرة واحدة).

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

في الخادم المستقبِل: أعد حساب HMAC-SHA256 للطابع الزمني + نقطة + الجسم الخام، وقارن — وارفض أي فارق زمني فوق 5 دقائق.

3. جرّب ثم اعتمد

اضغط «أرسل تجريبي» من اللوحة — يصلك حدث webhook.test موقّع فوراً. بعدها كل حدث حقيقي يصلك تلقائياً.

مثال: التحقق من التوقيع (Node.js)

const crypto = require('crypto');
const express = require('express');
const app = express();

const SECRET = process.env.WH_SECRET; // shown once when you created the endpoint

app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
  const ts  = req.headers['x-elouatine-timestamp'];
  const sig = req.headers['x-elouatine-signature'];
  const evt = req.headers['x-elouatine-event'];
  const raw = req.body.toString('utf8'); // RAW body — do not JSON.parse first

  // 1) Reject skew > 5 minutes (replay protection)
  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300)
    return res.status(401).send('stale timestamp');

  // 2) Recompute: HMAC-SHA256(secret, timestamp + '.' + rawBody)
  const expected = 'sha256=' + crypto.createHmac('sha256', SECRET)
    .update(ts + '.' + raw, 'utf8').digest('hex');

  // 3) Timing-safe compare
  const a = Buffer.from(sig || ''), b = Buffer.from(expected);
  if (a.length !== b.length || !crypto.timingSafeEqual(a, b))
    return res.status(401).send('bad signature');

  const payload = JSON.parse(raw); // { event, delivery_id, sent_at, data }
  console.log('event:', evt, 'delivery:', payload.delivery_id);
  // ... handle payload.data ...
  res.status(200).send('ok'); // 2xx = delivered
});

بنية الإشعار

{
  "event": "order.created",
  "delivery_id": 12345,
  "sent_at": "2026-10-11T07:58:51.000Z",
  "data": {
    "order_id": 987,
    "service_name": "iCloud FMI OFF",
    "price": 12.5,
    "currency": "USD",
    "status": "paid",
    "imei": "3548..."
  }
}

⚖️ سياسة الاستخدام العادل

الإساءة (معدل غير طبيعي، روابط ميتة متكررة) تؤدي لتعطيل الرابط تلقائياً بعد 50 فشلاً متتالياً — أعد تفعيله من الدعم بعد إصلاح رابطك.