دليل: استقبال الأحداث عبر الويب هوك
سجّل نقطة ويب هوك، وتحقّق من التوقيع، وتفاعل مع أحداث فيديوهاتي مثل جاهزية الفيديو.
الويب هوك رسالة يرسلها فيديوهاتي إلى خادمك عندما يقع حدث ما — عند اكتمال معالجة فيديو، أو بدء مشاهدة، أو نجاح دفعة. تعطي فيديوهاتي رابطًا، فيرسل إليه رسالة JSON صغيرة كلّما وقع حدث.
هذه هي الطريقة الموثوقة لمعرفة أن الفيديو صار ready من دون الاستعلام المتكرّر عنه.
1. سجّل نقطة وصول
أخبِر فيديوهاتي بالمكان الذي يرسل إليه الأحداث. تظهر قيمة secret في الاستجابة
مرّةً واحدة — خزّنها الآن، فأنت تحتاج إليها للتحقّق من كل تسليم لاحق.
import { Videohati } from "@videohati/node";
const client = new Videohati({ apiKey: process.env.VIDEOHATI_API_KEY });
const endpoint = await client.webhooks.register(projectId, {
url: "https://example.com/webhooks/videohati",
});
console.log(endpoint.secret); // shown once — save it as VIDEOHATI_WEBHOOK_SECRETتفضّل النقر؟ يمكنك تسجيل نقطة الوصول نفسها من لوحة التحكم ضمن إعدادات الويب هوك في مشروعك. ويظل السرّ يظهر مرّةً واحدة فقط.
2. الأحداث
يرسل فيديوهاتي أنواع الأحداث التالية. ويذكر كل تسليم نوعه في الحقل type.
| الحدث | يقع عند |
|---|---|
video.upload.completed | اكتمال رفع ملف، قبل المعالجة. |
video.encoding.ready | انتهاء معالجة الفيديو وجاهزيته للتشغيل. |
video.encoding.failed | فشل معالجة فيديو. |
video.deleted | حذف فيديو. |
playback.started | بدء مشاهد جلسة تشغيل. |
playback.completed | انتهاء جلسة تشغيل. |
payment.succeeded | نجاح دفعة. |
payment.failed | فشل دفعة. |
3. مظروف التسليم
كل تسليم جسم JSON بالبنية نفسها. ويحمل الكائن data تفاصيل نوع الحدث.
{
"id": "01JZ9WV3N8GQ5T2M7K4C6XBARE",
"type": "video.encoding.ready",
"created_at": "2026-07-05T12:00:00Z",
"project_id": "01JZ9WV3N8GQ5T2M7K4C6XBARP",
"data": {
"videoId": "01JZ9WV3N8GQ5T2M7K4C6XBARH"
}
}4. تحقّق من التوقيع
يحمل كل تسليم ترويسة Videohati-Signature. تحقّق منها بسرّ نقطة وصولك قبل أن
تثق بالجسم. يحتاج التحقّق إلى جسم الطلب الخام كما وصل تمامًا — لا إلى كائن JSON
أُعيدت صياغته.
في Node.js مع Express:
import express from "express";
import { verifyWebhookSignature, SIGNATURE_HEADER } from "@videohati/node";
const app = express();
app.post(
"/webhooks/videohati",
express.raw({ type: "application/json" }), // keep the raw body
(req, res) => {
const header = req.header(SIGNATURE_HEADER);
const result = verifyWebhookSignature({
payload: req.body, // Buffer of the raw body
header,
secret: process.env.VIDEOHATI_WEBHOOK_SECRET,
});
if (!result.valid) return res.status(400).end();
// result.event is the parsed envelope.
if (result.event?.type === "video.encoding.ready") {
// The video is ready — create a playback session, notify a user, etc.
}
res.status(200).end();
},
);التحقّق نفسه في Laravel، باستخدام SignatureVerifier:
use Illuminate\Http\Request;
use Videohati\Laravel\Webhooks\SignatureVerifier;
Route::post('/webhooks/videohati', function (Request $request) {
$event = SignatureVerifier::verifyAndParse(
$request->getContent(), // the raw body
$request->header(SignatureVerifier::HEADER),
config('services.videohati.webhook_secret'),
);
if ($event === null) {
abort(400);
}
if ($event['type'] === 'video.encoding.ready') {
// React to the ready video.
}
return response()->noContent(); // 204
});5. ردّ بسرعة
أعِد حالة 2xx خلال 10 ثوانٍ. يَعُدّ فيديوهاتي الردّ البطيء أو غير 2xx تسليمًا
فاشلًا. وإن كان لديك عمل فعلي، فأقرّ بالاستلام أولًا، ثم نفّذ العمل في الخلفية.
إعادة المحاولة وقاطع الدائرة
عندما يفشل تسليم، يعيد فيديوهاتي محاولته بمهلة متزايدة. وإن ظلّت نقطة الوصول تفشل، تُفتَح دائرتها وتتوقّف عمليات التسليم كي لا تتراكم على نقطة معطوبة. وبعد أن تُصلِح نقطة الوصول، أعِد فتحها:
await client.webhooks.reopenCircuit(projectId, endpoint.id);الاختبار والفحص
أرسِل تسليمًا اصطناعيًا من نوع video.encoding.ready للتأكّد من عمل نقطة وصولك:
await client.webhooks.sendTest(projectId, endpoint.id);راجِع ما أُرسِل وكيف جرت كل محاولة عبر سجلّ التسليم:
const deliveries = await client.webhooks.listDeliveries(projectId, endpoint.id, {
limit: 20,
});