فشل التحقق من توقيع الويب هوك على خادمك
أسباب عدم تطابق X-DS-Signature على خادمك: تغيّر جسم الطلب الخام، أو مفتاح خاطئ، أو خطأ في الطابع الزمني أو الترميز، وكيف تختبر ذلك بزر «إرسال تجربة» (ping) وسجل الرسائل.
آخر تحديث 22 أكتوبر 2026 · آخر تحقق 22 أكتوبر 2026
ماذا يعني ذلك#
كل رسالة ويب هوك نرسلها موقّعة. يعيد خادمك حساب التوقيع ويقارنه بالترويسة X-DS-Signature؛ فإذا اختلفا يرفض كودك الرسالة، مثلاً بالرد 401. ولا تستطيع المنصة رؤية المقارنة، فهي ترى ردّ HTTP الذي ترسله فقط، لذلك يظهر عدم التطابق كإرسال فاشل: يعرض عمود «الرد» في سجل الرسائل الرمز (مثل 401)، وتعرض نافذة التفاصيل وسطر «آخر إرسال» للرابط نص الخطأ «رد نظامك 401» (بالإنجليزية: Your system response 401). ويُحفظ هذا النص وقت الإرسال بلغة الجلسة آنذاك، فقد تظهر الرسائل الأقدم أو التي أُرسلت في الخلفية بلغة أخرى؛ والرمز الرقمي هو المؤشر الموثوق.
من المتأثر#
التجار (تجار المنصة الذين تتضمن باقتهم ميزة الويب هوك) ومديرو الشركات، فهم يتلقون الرسائل الموقّعة نفسها على روابطهم. ولكل رابط مفتاح توقيع خاص به.
الأسباب المحتملة#
التوقيع هو sha256= متبوعاً بالتمثيل السداسي العشري (hex) بأحرف صغيرة لناتج HMAC-SHA256، والرسالة المُوقَّعة هي قيمة X-DS-Timestamp ثم نقطة ثم جسم الطلب الخام (raw body) كما وصل تماماً، والمفتاح هو مفتاح التوقيع كاملاً بما فيه whsec_.
| السبب | ما الذي يحدث | الحل |
|---|---|---|
| تغيّر جسم الطلب | تُحلِّل الـ JSON ثم تحسب التوقيع على نسخة أعدتَ ترميزها. جسم الطلب المرسل يُبقي الأحرف غير ASCII (مثل العربية) كما هي ولا يضيف شرطة عكسية قبل الشرطات المائلة (أي لا \/؛ ولا تُسبق بشرطة عكسية إلا بعض محارف التحكم)، وبيانات الطرد كثيراً ما تحتوي على نصوص عربية وعلى tracking_url مليء بالشرطات المائلة، فتنتج أغلب مكتبات الترميز بايتات مختلفة. وكذلك تفعل البرمجيات الوسيطة (middleware) التي تُحلِّل جسم الطلب، وخوادم الوكيل (proxy) وجدران الحماية التي تُصغّر جسم الطلب (minify) أو تعيد تنسيقه. |
وقّع البايتات الخام، واقرأها قبل أي تحليل |
| مفتاح خاطئ | مفتاح رابط آخر، أو مفتاح API (sk_ أو ck_)، أو المفتاح بدون whsec_، أو مفتاح قديم بعد «تجديد»، أو نسخة مقنَّعة فيها نقاط، أو مسافة أو سطر جديد في آخر المتغير |
انسخ مفتاح هذا الرابط من اللوحة |
| طابع زمني خاطئ | تحسب التوقيع بساعتك أو بالحقل created_at بدل الترويسة X-DS-Timestamp، أو تعامل القيمة كأنها بالميلي ثانية |
استخدم قيمة الترويسة نصاً كما هي |
| رسالة قديمة | يفشل فحص الحداثة لديك لأن ساعة الخادم غير مضبوطة، أو لأنك تفحص بعد وضع الرسالة في الطابور. وهامش السماح في أمثلة اللوحة 300 ثانية | افحص العمر عند الاستلام وصحّح وقت الخادم |
| صيغة المقارنة | تقارن بدون البادئة sha256=، أو بصيغة base64 (شوبيفاي مع ووكومرس تستخدمان base64 ونحن نستخدم hex)، أو بحالة أحرف مختلفة |
قارن قيمة الترويسة كاملة بدالة مقارنة ثابتة الزمن |
| إعادة استخدام توقيع | لكل محاولة طابع زمني جديد، فيفشل توقيع محفوظ | أعد الحساب في كل مرة |
كيف تشخّص المشكلة#
-
أرسل تجربة. في لوحة التاجر افتح «الويب هوك والـ API» ثم «إدارة الويب هوك». وفي لوحة الشركة افتح «الربط والـ API» ثم «إدارة الروابط والسجل». اضغط «إرسال تجربة» على الرابط (يظهر للروابط المفعّلة فقط). تُرسل رسالة
pingبالتوقيع نفسه، وحقلdataفيها يحمل بيانات آخر طرد في حسابك، أوmessageبنص تجربة قصير إن لم يوجد طرد. والنتيجة: «وصلت رسالة التجربة لنظامك (الرد 200).» أو «ما وصلت: …». وعبر الـ API يفعلPOST /api/v1/webhooks/{id}/testالشيء نفسه، لكن الحقلdataفيه يحمل دائماًmessageبنص تجربة قصير وليس بيانات طرد. -
افتح سجل الرسائل. يعرض كل صف رمز الرد. ويُظهر زر العين ما أرسلناه وردّ نظامك (أول 2000 حرف)، وكثيراً ما يحتوي على نص «توقيع غير صالح» الذي كتبته أنت. والبيانات هناك معروضة بعد إعادة تنسيقها، ولا يُحفظ التوقيع ولا الطابع الزمني، لذلك لا يمكن إعادة حساب التوقيع منها.
-
سجّل من جهتك الجسم الخام و
X-DS-TimestampوX-DS-Signature، ثم أعد الحساب يدوياً:( printf '%s.' "$TIMESTAMP"; cat body.raw ) | openssl dgst -sha256 -hmac "$WEBHOOK_SECRET"يجب أن تساوي النتيجة بالنظام السداسي العشري قيمة الترويسة بعد
sha256=. فإن تطابقت فالخلل في كود التحقق لديك، وإلا فالمفتاح أو جسم الطلب. -
قارن نتيجة كودك بمثال الاختبار المرجعي (test vector) في دليل التحقق من التوقيع.
خطوات الحل#
تحقق من جسم الطلب الخام
اقرأ البايتات قبل أي تحليل لـ JSON، وأوقف التحليل التلقائي للجسم في هذا المسار.
استخدم المفتاح الصحيح
افتح «مفتاح التوقيع» للرابط (زر العين يعرضه وزر النسخ ينسخه). واحفظ السلسلة كاملة، بما فيها البادئة
whsec_، دون مسافات. وبعد «تجديد» يتوقف المفتاح القديم فوراً، فحدّث خادمك أولاً.أصلح فحص الوقت
خذ الطابع الزمني من الترويسة واستخدمه بالثواني، وأبقِ ساعة الخادم متزامنة.
جرّب من جديد ثم أعد الإرسال
اضغط «إرسال تجربة». وتُعاد الرسائل الفاشلة تلقائياً بعد دقيقة و5 و30 دقيقة، ثم ساعتين و6 و12 و24 ساعة، أي 8 محاولات بالمجموع. ولتتجنب الانتظار اضغط «إعادة إرسال» على الصف.
ماذا يحدث أثناء الفشل#
بعد 40 إرسالاً فاشلاً متتالياً، بما فيها التجارب وإعادة المحاولات، يُوقَف الرابط ويظهر سبب إيقافه. أصلح خادمك، ثم اضغط «تعديل» وحدّد خانة «مفعّل» واحفظ؛ فيبدأ العدّاد من جديد. ويحتفظ السجل بآخر 30 يوماً.
متى تتواصل مع الدعم#
- إذا طابق توقيعك المعاد حسابه الترويسة ومع ذلك يرفض خادمك الرسالة.
- إذا أبلغ «إرسال تجربة» بعبارة «ما وصلت» مع خطأ يخص العنوان، رغم أن رابطك HTTPS عام.
- اذكر دائماً المعرّف
evt_ووقت الرسالة؛ فكلاهما في السجل.
API
POST /api/v1/webhooks/{id}/test