> ## Documentation Index
> Fetch the complete documentation index at: https://docs.rntor.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# التحقق من طلبات Webhooks

> تعرّف على كيفية التحقق من طلبات Webhook الصادرة من RNTOR

يتضمن كل طلب Webhook من RNTOR ترويسات يمكنك استخدامها للتحقق من الطلب.

* `svix-id`: المعرّف الفريد لرسالة Webhook. يكون فريدًا بين الرسائل، لكنه يظل نفسه عند إعادة إرسال الرسالة ذاتها، مثل إعادة الإرسال بعد فشل سابق.
* `svix-timestamp`: الطابع الزمني بالثواني منذ Epoch.
* `svix-signature`: قائمة توقيعات مشفّرة بصيغة Base64 ومفصولة بمسافات.

تُستخدم أسرار توقيع Webhook للتحقق من صحة البيانات التي يرسلها RNTOR إلى تطبيقك. يمكنك العثور على سر التوقيع في صفحة إدارة Webhooks.

هناك طريقتان للتحقق من طلبات Webhook:

## 1. استخدام مكتبة Svix

ثبّت أولًا مكتبة Svix للغة التي تستخدمها، ثم استخدم الكود التالي للتحقق من الطلب، والمثال هنا بلغة JavaScript:

```javascript theme={null}
import { Webhook } from "svix";

const secret = "whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw";

const headers = {
  "svix-id": "msg_p5jXN8AQM9LWM0D4loKWxJek",
  "svix-timestamp": "1614265330",
  "svix-signature": "v1,g0hM9SsE+OTPJTGt/tmIKtSyZlE3uFJELVlNIOLJ1OE=",
};
const payload = '{"test": 2432232314}';

const wh = new Webhook(secret);
const verifiedPayload = wh.verify(payload, headers);
```

يجب أن تكون `payload` هي نص جسم الطلب الخام، وأن تكون الترويسات هي نفسها المرسلة مع الطلب.

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

### إنشاء المحتوى الموقّع

أنشئ المحتوى الموقّع بضم المعرّف والطابع الزمني والحمولة، مع الفصل بينها بنقطة (`.`):

```javascript theme={null}
const signedContent = `${svix_id}.${svix_timestamp}.${body}`;
```

### تحديد التوقيع المتوقع

يستخدم RNTOR خوارزمية HMAC مع SHA-256 لتوقيع Webhooks. احسب التوقيع المتوقع باستخدام `signedContent` والجزء المشفّر بصيغة Base64 من سر التوقيع، أي الجزء الذي يلي `whsec_`.

على سبيل المثال، عند استخدام السر `whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw`، استخدم `MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw` كمفتاح.

```javascript theme={null}
const crypto = require("crypto");

const signedContent = `${svix_id}.${svix_timestamp}.${body}`;
const secret = "whsec_5WbX5kEWLlfzsGNjH64I8lOOqUB6e8FH";

const secretBytes = Buffer.from(secret.split("_")[1], "base64");
const signature = crypto
  .createHmac("sha256", secretBytes)
  .update(signedContent)
  .digest("base64");

console.log(signature);
```

يجب أن يطابق التوقيع الناتج أحد التوقيعات المرسلة في ترويسة `svix-signature`. تحتوي الترويسة على قائمة توقيعات مفصولة بمسافات مع معرّفات إصداراتها. غالبًا تحتوي القائمة على توقيع واحد، لكنها قد تحتوي على أي عدد من التوقيعات.
