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

    عربي أو إنجليزي · ↑↓ للتنقل · Enter للفتح · Esc للقفل

    English
    في الصفحة دي

    ابدأ بسرعة: أول رسالة في 3 خطوات

    اعمل مفتاح API، وابعت رسالة واتساب من رقمك، واستقبل أول ويب هوك موقّع — في حوالي عشر دقايق.

    قبل ما تبدأ

    محتاج حساب مرسلات باقته فيها API، ورقم مربوط في الأرقام (اعمل scan للـ QR من واتساب ← الأجهزة المرتبطة). كل الطلبات اللي تحت حقيقية: بتستخدم رقمك وباقتك.

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

    1. افتح الإعدادات ← مفاتيح API في لوحة التحكم واضغط مفتاح جديد (لصاحب الحساب بس).
    2. سمّيه باسم النظام اللي هيستخدمه (مثلًا «سيرفر المتجر») واختار قالب إرسال الرسايل — بيدّي messages:send و messages:read بس.
    3. اختار الأرقام اللي يقدر يستخدمها (كلها أو بعضها)، ولو حابب عناوين IP السيرفرات المسموح لها.
    4. انسخ المفتاح (wsl_live_…). بيظهر مرة واحدة؛ مرسلات بتحتفظ بـ hash بس ومش هتقدر تعرضه تاني أبدًا.

    خلّي المفتاح في متغير بيئة على السيرفر بتاعك، عمره ما يكون في متصفح أو تطبيق موبايل. اتأكد إنه شغال — GET /v2/me مش محتاج صلاحية وبيقولك المفتاح يقدر يعمل إيه:

    curl -X GET "https://mursilat.com/api/v2/me" \
      -H "Authorization: Bearer $WASLA_API_KEY"

    2. ابعت أول رسالة

    هات الـ id بتاع رقمك (المفتاح المقصور على أرقام معينة بيعرضها هي بس)، وبعدين ابعت. Idempotency-Key إجباري في الإرسال: لو الطلب عمل timeout، ابعته تاني بنفس المفتاح ومش هيتبعت مرتين أبدًا.

    curl -X GET "https://mursilat.com/api/v2/numbers" \
      -H "Authorization: Bearer $WASLA_API_KEY"
    curl -X POST "https://mursilat.com/api/v2/messages" \
      -H "Authorization: Bearer $WASLA_API_KEY" \
      -H "Idempotency-Key: order-1042-confirm" \
      -H "Content-Type: application/json" \
      -d '{
      "numberId": "cm1abcd2345efgh6789ijkl",
      "to": "201001234567",
      "type": "text",
      "text": "طلبك اتشحن 🚚 *شكرًا*",
      "reference": "order-1042"
    }'

    ده بيبعت رسالة واتساب حقيقية

    ابعت لموبايلك أنت الأول. كل رسالة بتعدّي على حماية الرقم: وقت الضغط بيرجعلك status: "queued" ومعاه estimatedDelayMs، والرسايل للأرقام الجديدة بتتبعت بفواصل.

    3. استقبل ويب هوك

    إيصالات التسليم وردود العملاء وإجابات الأزرار بتوصل لعنوان HTTPS بتاعك، موقّعة. سجّل رابط واحد لكل أرقامك (محتاج مفتاح فيه webhooks:write — اعمل مفتاح تاني ليه، أو ضيف الصلاحية):

    curl -X PUT "https://mursilat.com/api/v2/webhook" \
      -H "Authorization: Bearer $WASLA_API_KEY" \
      -H "Idempotency-Key: order-1042-confirm" \
      -H "Content-Type: application/json" \
      -d '{
      "url": "https://example.com/mursilat",
      "events": null
    }'

    الرد فيه secret التوقيع مرة واحدة. اتحقق بيه من كل طلب — احسب الـ HMAC على الـ body الخام، وقارن بوقت ثابت، وارفض الطوابع الزمنية القديمة:

    // Node.js + Express. Use the RAW body: JSON.parse → JSON.stringify changes bytes and breaks the signature.
    import crypto from 'node:crypto';
    import express from 'express';
    
    const app = express();
    const SECRET = process.env.WASLA_WEBHOOK_SECRET;
    const seen = new Set(); // use Redis/DB in production
    
    function verifyWaslaSignature(rawBody, header, secret, toleranceSec = 300) {
      if (!header || !secret) return false;
      const parts = {};
      for (const pair of header.split(',')) {
        const i = pair.indexOf('=');
        if (i > 0) parts[pair.slice(0, i).trim()] = pair.slice(i + 1).trim();
      }
      const t = parts.t;
      const v1 = parts.v1;
      if (!/^\d+$/.test(t || '') || !/^[0-9a-f]{64}$/i.test(v1 || '')) return false;
      // Reject old (replayed) or far-future timestamps.
      if (Math.abs(Math.floor(Date.now() / 1000) - Number(t)) > toleranceSec) return false;
      const expected = crypto
        .createHmac('sha256', secret)
        .update(t + '.')
        .update(rawBody) // the RAW bytes exactly as received, not re-serialized JSON
        .digest();
      const received = Buffer.from(v1, 'hex');
      return received.length === expected.length && crypto.timingSafeEqual(received, expected);
    }
    
    app.post('/webhooks/mursilat', express.raw({ type: 'application/json' }), (req, res) => {
      if (!verifyWaslaSignature(req.body, req.get('X-Wasla-Signature'), SECRET)) {
        return res.status(401).send('invalid signature');
      }
      const event = JSON.parse(req.body.toString('utf8'));
      res.sendStatus(200); // answer fast (within 10s); do the work after
    
      if (seen.has(event.id)) return; // retries reuse the same event id
      seen.add(event.id);
      if (event.type === 'interactive.reply') {
        console.log(event.data.reference, '→', event.data.reply.id);
      }
    });
    
    app.listen(3000);

    بعدها ابعت حدث تجريبي وشوفه وهو بيوصل (وفي سجل التوصيل):

    curl -X POST "https://mursilat.com/api/v2/webhook/test" \
      -H "Authorization: Bearer $WASLA_API_KEY" \
      -H "Idempotency-Key: order-1042-confirm" \
      -H "Content-Type: application/json" \
      -d '{
      "numberId": "cm1abcd2345efgh6789ijkl"
    }'

    تقدر تلصق اللي وصل لسيرفرك في فاحص الويب هوك وتتأكد من التوقيع جوه المتصفح.

    الخطوة الجاية