BIGBLUEBUTTON IRAN · WEBHOOKS

راهنمای وب‌هوک
رویدادهای کلاس، در برنامه شما

از ثبت گیرنده تا اعتبارسنجی پیام؛ راهنمای اتصال رویدادهای بیگ بلو باتن با نمونه PHP، صف پردازش و عیب‌یابی.

● ● ●BIGBLUEBUTTON → YOUR APP
// Receive. Verify. Queue.
meeting-ended
  → POST /hooks/bbb

verify(signature)
  → 200 Accepted
HTTPS · Events · Verified delivery
راهنمای مرحله‌به‌مرحلهثبت، فهرست و حذف hookنمونه PHPاعتبارسنجی و صف دریافتکنترل تحویلتکرار پیام و خطای شبکه
01

وب‌هوک چیست و کجا کاربرد دارد؟

API زمانی پاسخ می‌دهد که برنامه شما درخواست بفرستد. وب‌هوک مسیر برعکس است: پس از رخ دادن یک رویداد، سرویس کلاس آنلاین پیامی به نشانی مشخص در برنامه شما می‌فرستد. این روش برای به‌روز کردن وضعیت کلاس، ثبت ورود و خروج و شروع کارهای پس از جلسه کاربرد دارد.

رویداد در کلاس←ارسال POST←اعتبارسنجی و صف←پردازش در برنامه شما

مثلا بعد از پایان کلاس، وضعیت آن را در LMS تغییر دهید یا پس از آماده شدن ضبط، کار بررسی و اطلاع‌رسانی را در صف قرار دهید. برای ارسال پیامک یا اجرای عملیات طولانی، داخل خود درخواست وب‌هوک منتظر نمانید.

وضعیت دسترسی سرویس

داشتن URL و Secret استاندارد به تنهایی به معنی فعال بودن وب‌هوک نیست. نصب و دسترسی افزونه bbb-webhooks، مسیر hooks و محدوده رویدادهای حساب باید روی سرویس شما تایید شود. این صفحه راهنمای اتصال است و وب‌هوک را روی حساب یا سرور فعال نمی‌کند.

02

پیش‌نیازها و مسیر راه‌اندازی

  1. اطلاعات اتصال را برداریددر سامانه بیگ بلو باتن ایران وارد «مدیریت جلسات ← تنظیمات» شوید و URL و Secret حساب را دریافت کنید.
  2. دسترسی وب‌هوک را بررسی کنیداز پشتیبانی، فعال بودن hooks، محدوده رویدادهای حساب، روش امضای callback و Secret مورد استفاده برای اعتبارسنجی آن را بپرسید. در سرویس‌های واسط، این اطلاعات را از روی آدرس سرور حدس نزنید.
  3. یک گیرنده HTTPS در برنامه خود بسازیدگیرنده باید از سرور ارسال‌کننده قابل دسترس باشد، گواهی معتبر داشته باشد و به صفحه ورود، کپچا یا تغییر مسیر هدایت نشود.
  4. یک جلسه آزمایشی را متصل کنیدhook محدود به meetingID همان جلسه ثبت کنید. پس از آزمون امضا، تکرار پیام و خطا، اتصال اصلی را فعال کنید.
برای مدیر سرور اختصاصی

افزونه bbb-webhooks روی سرور BigBlueButton اجرا می‌شود، نه روی هاست DirectAdmin سایت معرفی خدمات. نصب بسته و تنظیم شبکه باید با نسخه سرور هماهنگ شود. کاربران سرویس اشتراکی نیاز به نصب Redis یا Node.js روی هاست سایت خود ندارند؛ کافی است گیرنده سازگار داشته باشند.

03

ثبت، مشاهده و حذف وب‌هوک

در صورت فعال بودن افزونه، سه مسیر زیر زیرمجموعه API هستند. درخواست‌ها را از سرور برنامه و با checksum امضاشده ارسال کنید. پایه URL همان نشانی API تاییدشده سرویس است.

مسیرپارامترهانتیجه
hooks/createcallbackURL الزامی؛ meetingID، eventID و getRaw اختیاریثبت گیرنده و دریافت hookID
hooks/listmeetingID اختیاری؛ checksum همیشه لازم استنمایش hookهای قابل دسترس
hooks/destroyhookID الزامیحذف hook مشخص‌شده
  • callbackURL آدرس برنامه خود شماست، نه صفحه راهنمای /webhooks/ در این سایت.
  • meetingID دامنه دریافت را به جلسه مشخص محدود می‌کند. حذف آن در افزونه استاندارد می‌تواند hook سراسری بسازد؛ این حالت را بدون مجوز سرویس اشتراکی استفاده نکنید.
  • eventID برای محدود کردن نوع رویداد است؛ چند نام با ویرگول جدا می‌شوند و پشتیبانی آن وابسته به نسخه است.
  • getRaw=false ساختار تبدیل‌شده را می‌فرستد. حالت true پیام داخلی را می‌دهد و برای نمونه این راهنما مناسب نیست.
  • یک callbackURL تکراری ممکن است همان hook موجود را برگرداند. تغییر فیلتر را صرفا با تکرار create قطعی ندانید؛ نتیجه list و تنظیمات واقعی را بررسی کنید.
  • list بدون فیلتر ممکن است hookهای بیشتری از hookهای عمومی برگرداند. در حالت meetingID، hookهای سراسری مرتبط هم می‌توانند در نتیجه باشند.
checksum = HASH("hooks/create" + exactQueryString + apiSecret)

بخش hooks/ در نام متد امضا می‌شود. رمز را در URL قرار ندهید و query string را پس از امضا تغییر ندهید.

04

نمونه PHP برای ثبت گیرنده

این نمونه به PHP با cURL و SimpleXML نیاز دارد. نشانی callback و meetingID نمونه را با مقادیر برنامه خود عوض کنید. الگوریتم API باید در سرویس پشتیبانی شود؛ الگوریتم امضای callback تنظیم جداگانه‌ای است.

<?php
// Run on your own application server after webhook access is enabled.
$base = rtrim((string) getenv('BBB_API_URL'), '/') . '/';
$secret = (string) getenv('BBB_SHARED_SECRET');
$algorithm = (string) (getenv('BBB_API_HASH') ?: 'sha1');
if (!str_starts_with($base, 'https://') || $secret === ''
    || !in_array($algorithm, ['sha1','sha256','sha384','sha512'], true)) {
    throw new RuntimeException('Configure API URL, secret and hash');
}
$method = 'hooks/create'; // Include "hooks/" in the checksum input.
$params = [
    'callbackURL' => 'https://your-app.example.com/hooks/bbb',
    'meetingID' => 'course-42-session-1',
    'eventID' => 'meeting-created,meeting-ended,user-joined,user-left',
    'getRaw' => 'false',
];
$query = http_build_query($params, '', '&', PHP_QUERY_RFC3986);
$url = $base . $method . '?' . $query . '&checksum='
    . hash($algorithm, $method . $query . $secret);
$curl = curl_init($url);
curl_setopt_array($curl, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 5,
    CURLOPT_TIMEOUT => 20,
    CURLOPT_FOLLOWLOCATION => false,
    CURLOPT_SSL_VERIFYPEER => true,
    CURLOPT_SSL_VERIFYHOST => 2,
]);
$response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($response === false || $status !== 200) throw new RuntimeException('Transport error');
libxml_use_internal_errors(true);
$xml = simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NONET);
if ($xml === false || (string) $xml->returncode !== 'SUCCESS') {
    throw new RuntimeException('Hook registration failed');
}
$hookID = (string) $xml->hookID;
// Save hookID in your application database; do not log the signed URL.

برای مشاهده یا حذف، مقدار method و params را عوض کنید؛ سپس امضا را از ابتدا بسازید:

// List hooks for a meeting:
$method = 'hooks/list';
$params = ['meetingID' => 'course-42-session-1'];

// Remove one registered hook (only after explicit app authorization):
$method = 'hooks/destroy';
$params = ['hookID' => $storedHookID];

برای حذف، ابتدا مالکیت hook در برنامه خود را بررسی کنید. شناسه hook را از کاربر ناشناس نپذیرید.

05

رویدادهای پرکاربرد و معنای آن‌ها

نام‌ها و فیلدهای رویداد به نسخه افزونه، حالت getRaw و فیلتر سرویس بستگی دارند. فهرست زیر رویدادهای پرکاربرد ساختار تبدیل‌شده است؛ وجود همه آن‌ها در هر حساب تضمین نمی‌شود.

event IDمعناکاربرد
meeting-createdایجاد جلسهساخت رکورد وضعیت جلسه در برنامه
meeting-endedپایان جلسهبستن وضعیت جلسه و آغاز کارهای پس از کلاس
user-joined / user-leftورود و خروج کاربرثبت بازه‌های حضور با توجه به ورود دوباره
meeting-recording-started / meeting-recording-stoppedتغییر وضعیت ضبطنمایش وضعیت؛ به معنی آماده بودن فایل نیست
meeting-presentation-changedتغییر ارائههمگام‌سازی اطلاعات ارائه در برنامه
meeting-screenshare-started / meeting-screenshare-stoppedاشتراک‌گذاری صفحهنمایش وضعیت در ابزار نظارت مجاز
rap-publish-endedپایان مرحله انتشار ضبط در نسخه‌های مربوطبررسی نتیجه getRecordings پیش از اطلاع‌رسانی
حضور و غیاب دقیق‌تر از یک پیام ورود است

ورود دوباره، قطع اینترنت، چند دستگاه و تاخیر دریافت را در نظر بگیرید. رویداد گمشده یا دیررس را با گزارش معتبر سرویس تطبیق دهید؛ صرف یک user-joined برای محاسبه کل مدت حضور کافی نیست.

رویدادهای پیشرفته مانند تغییر نقش، دست بلند کردن، نظرسنجی، زیرنویس و مراحل پردازش ضبط هم وابسته به نسخه‌اند. برای اضافه کردن هر نوع، ابتدا payload واقعی همان نسخه و مجوز حساب را بررسی کنید.

06

قالب درخواست و داده‌های رویداد

در حالت رایج، callback یک درخواست POST با application/x-www-form-urlencoded است. فیلد event خودش یک رشته JSON است؛ بنابراین بدنه کامل درخواست را مستقیم JSON فرض نکنید.

فیلدتوضیح
eventJSON یک رویداد یا آرایه‌ای از رویدادها، بسته به نسخه و batching.
timestampزمان ارسال callback بر حسب میلی‌ثانیه؛ زمان واقعی رویداد می‌تواند متفاوت باشد.
domainدر برخی نسخه‌ها، نام سرور در فرم وجود دارد؛ به تنهایی مدرک اعتبار فرستنده نیست.
checksumدر حالت امضای checksum، در query string آدرس callback قرار می‌گیرد.

نمونه نمایشی محتوای decodeشده فیلد event:

{
  "data": {
    "type": "event",
    "id": "meeting-ended",
    "attributes": {
      "meeting": {
        "external-meeting-id": "course-42-session-1",
        "internal-meeting-id": "example-internal-id"
      }
    },
    "event": { "ts": 1793700000000 }
  }
}

اگر event یک آرایه بود، هر عضو را جدا بررسی کنید. شناسه داخلی جلسه با meetingID برنامه شما یکی نیست. شناسه‌های جلسه، ضبط و کاربر را بدون نگاشت حساب و مجوز به رکوردهای برنامه وصل نکنید.

07

اعتبارسنجی امضا و تفاوت نسخه‌ها

callbackChecksum = HASH(exactRegisteredCallbackURL + exactRawRequestBody + webhookSecret)
  • از URL ثابت و دقیقی که ثبت کرده‌اید استفاده کنید، بدون checksum اضافه‌شده. آن را از Host یا هدرهای ارسالی کاربر نسازید.
  • بدنه را از php://input بردارید. قبل از اعتبارسنجی، decode، مرتب‌سازی یا دوباره encode نکنید.
  • امضا را با hash_equals مقایسه کنید. الگوریتم را از تنظیمات تاییدشده بگیرید، نه از ورودی درخواست.
  • Secret اعتبارسنجی callback باید با فرستنده هماهنگ باشد. در استقرار استاندارد از Secret سرور استفاده می‌شود؛ در پنل واسط، Secret حساب را بدون تایید معادل آن ندانید.
  • در برخی نسخه‌ها حالت auth2_0 از Authorization Bearer استفاده می‌کند. این حالت OAuth ورود کاربران نیست و نمونه زیر برای آن نوشته نشده است؛ روش مورد توافق را ثابت انتخاب کنید و با نبود checksum خودکار به حالت بدون احراز هویت نروید.
بازپخش و درخواست تکراری

امضای صحیح به تنهایی جلوی تکرار پیام قدیمی را نمی‌گیرد. بازه زمانی قابل قبول و شناسه یکتای دریافت را در برنامه کنترل کنید. بازه زمانی باید با مدت retry سرویس هماهنگ باشد تا پیام معتبر دیررس حذف نشود.

08

نمونه گیرنده PHP با صف و کنترل تکرار

این نمونه برای getRaw=false، احراز هویت checksum و رویدادهای جلسه دارای external-meeting-id است. ابتدا جدول inbox را در یک فایل SQLite خصوصی بسازید. PHP به افزونه PDO SQLite نیاز دارد. پوشه و فایل دیتابیس باید خارج از public_html، با مجوز مناسب کاربر برنامه باشند؛ برای نمونه پوشه ۷۰۰ و فایل ۶۰۰.

تنظیم سمت سرورمقدار مورد نیاز
BBB_WEBHOOK_CALLBACK_URLURL دقیق ثبت‌شده؛ در این نمونه بدون query string و fragment.
BBB_WEBHOOK_SECRETSecret تاییدشده برای callback؛ در متغیر محیطی امن.
BBB_WEBHOOK_HASHهمان الگوریتم فرستنده، مانند sha1 یا sha256. پیش‌فرض کد sha256 است و باید با سرویس تطبیق داده شود.
BBB_WEBHOOK_PRIVATE_DIRپوشه خصوصی موجود، شامل inbox.sqlite.
BBB_ALLOWED_MEETING_IDSشناسه جلسه‌های مجاز با ویرگول؛ در محصول واقعی از دیتابیس حساب و دوره استفاده کنید.
CREATE TABLE webhook_inbox (
  delivery_key TEXT PRIMARY KEY,
  payload TEXT NOT NULL,
  received_at TEXT NOT NULL,
  status TEXT NOT NULL DEFAULT 'pending'
);
CREATE INDEX webhook_inbox_status ON webhook_inbox(status, received_at);
<?php
// Educational receiver for getRaw=false + checksum authentication.
// Install in YOUR application, not in the documentation website.
// Requires PHP 8.1+ and PDO SQLite. Initialize inbox using inbox.sql first.
declare(strict_types=1);
header('Cache-Control: no-store');
header('Content-Type: text/plain; charset=utf-8');
function reply(int $status, string $message): never {
    http_response_code($status);
    echo $message;
    exit;
}
if (($_SERVER['REQUEST_METHOD'] ?? '') !== 'POST') {
    header('Allow: POST');
    reply(405, 'POST required');
}
$type = strtolower(trim(explode(';', $_SERVER['CONTENT_TYPE'] ?? '')[0]));
if ($type !== 'application/x-www-form-urlencoded') reply(415, 'Unsupported media type');

$secret = (string) getenv('BBB_WEBHOOK_SECRET');
$callback = (string) getenv('BBB_WEBHOOK_CALLBACK_URL');
$algorithm = (string) (getenv('BBB_WEBHOOK_HASH') ?: 'sha256');
$private = realpath((string) getenv('BBB_WEBHOOK_PRIVATE_DIR'));
$public = realpath($_SERVER['DOCUMENT_ROOT'] ?? '');
// This example requires a callback URL without a query string or fragment.
if ($secret === '' || !filter_var($callback, FILTER_VALIDATE_URL)
    || parse_url($callback, PHP_URL_SCHEME) !== 'https'
    || parse_url($callback, PHP_URL_QUERY) !== null
    || parse_url($callback, PHP_URL_FRAGMENT) !== null
    || !in_array($algorithm, ['sha1', 'sha256', 'sha384', 'sha512'], true)
    || !$private || !$public || !is_writable($private)
    || $private === $public || str_starts_with($private, $public . DIRECTORY_SEPARATOR)) {
    reply(503, 'Receiver configuration incomplete');
}
// Match the sender's configured algorithm; do not guess it from user input.
$maxBytes = 1048576;
$body = file_get_contents('php://input', false, null, 0, $maxBytes + 1);
if ($body === false || strlen($body) > $maxBytes) reply(413, 'Payload too large');
$provided = $_GET['checksum'] ?? null;
$expected = hash($algorithm, $callback . $body . $secret);
if (!is_string($provided) || !hash_equals($expected, $provided)) {
    reply(403, 'Invalid signature');
}
// Verify the original bytes BEFORE decoding or re-encoding anything.
parse_str($body, $form);
if (!is_string($form['event'] ?? null) || !is_string($form['timestamp'] ?? null)
    || !preg_match('/^[0-9]{13}$/D', $form['timestamp'])) {
    reply(400, 'Invalid envelope');
}
// Example policy: allow retries for 24 hours and 5 minutes of clock skew.
// Adjust to the agreed retry policy; this is not a BBB protocol constant.
$ageMs = (int) floor(microtime(true) * 1000) - (int) $form['timestamp'];
if ($ageMs > 86400000 || $ageMs < -300000) reply(403, 'Timestamp outside accepted window');
try {
    $decoded = json_decode($form['event'], true, 64, JSON_THROW_ON_ERROR);
} catch (JsonException) {
    reply(400, 'Invalid event JSON');
}
if (!is_array($decoded) || $decoded === []) reply(400, 'Empty event');
$events = array_is_list($decoded) ? $decoded : [$decoded];
if (count($events) > 100) reply(413, 'Too many events');
// Server-side allowlist: use your account/course database in production.
$meetings = array_filter(explode(',', (string) getenv('BBB_ALLOWED_MEETING_IDS')));
if (!$meetings) reply(503, 'Configure authorized meetings');
foreach ($events as $event) {
    $data = is_array($event) ? ($event['data'] ?? null) : null;
    $meeting = is_array($data) ? ($data['attributes']['meeting']['external-meeting-id'] ?? null) : null;
    if (!is_array($data) || !is_string($data['id'] ?? null)) reply(400, 'Unsupported event shape');
    if (!is_string($meeting) || !in_array($meeting, $meetings, true)) {
        reply(403, 'Meeting outside receiver scope');
    }
}
// Only accept mapped meeting events in this sample. Recording events may need
// a separate mapping from internal meeting/recording ID to the authorized account.
$dbPath = $private . '/inbox.sqlite';
if (!is_file($dbPath) || is_link($dbPath)) reply(503, 'Initialize inbox first');
try {
    $db = new PDO('sqlite:' . $dbPath, null, null, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
    $db->exec('PRAGMA busy_timeout=1500');
    $key = hash('sha256', $callback . "\n" . $body);
    $db->beginTransaction();
    $stmt = $db->prepare('INSERT INTO webhook_inbox(delivery_key,payload,received_at,status)
        VALUES(?,?,?,?) ON CONFLICT(delivery_key) DO NOTHING');
    $stmt->execute([$key, json_encode($events, JSON_THROW_ON_ERROR), gmdate('c'), 'pending']);
    $db->commit();
} catch (Throwable) {
    if (isset($db) && $db->inTransaction()) $db->rollBack();
    reply(503, 'Inbox temporarily unavailable');
}
// A worker processes pending rows later. Do not send SMS or run slow tasks here.
reply(200, 'Accepted');
دامنه این نمونه

این کد دریافت، اعتبارسنجی و ثبت پایدار در صف را نشان می‌دهد؛ worker ارسال پیامک، گزارش‌گیری یا تغییر وضعیت دوره باید در برنامه شما پیاده شود. رویدادهای ضبطی که شناسه خارجی جلسه ندارند نیاز به نگاشت جدا دارند و این نمونه آن‌ها را قبول نمی‌کند. فایل گیرنده با این بسته روی سایت معرفی خدمات نصب نمی‌شود.

09

ارسال مجدد، صف و ترتیب پردازش

  1. پس از ثبت پایدار، پاسخ ۲۰۰ بدهید. اگر دیتابیس در دسترس نیست، پاسخ موفق ندهید؛ پاسخ ۵۰۳ به فرستنده امکان تشخیص شکست می‌دهد.
  2. برای پیام تکراری هم پاسخ موفق بدهید. نمونه با کلید یکتای بدنه و URL، همان تحویل تکرارشده را دوباره در inbox ثبت نمی‌کند.
  3. پردازش کسب‌وکار را هم idempotent طراحی کنید. دو تحویل متفاوت ممکن است یک رویداد منطقی را گزارش کنند؛ کلید نمونه جای کنترل تکرار در سطح جلسه، کاربر و عملیات را نمی‌گیرد.
  4. صف را مانیتور کنید. worker باید رکورد pending را با قفل مناسب بردارد، وضعیت پردازش را ثبت کند و پس از شکست قابل تلاش مجدد باشد. ارسال پیامک را با کلید یکتا انجام دهید تا crash باعث ارسال دوباره نشود.
  5. به ترتیب رسیدن تکیه نکنید. زمان رویداد و وضعیت فعلی رکورد را بررسی کنید؛ پیام دیررس نباید وضعیت پایان‌یافته را به فعال برگرداند.
  6. ثبت hook را دوره‌ای بررسی کنید. در برخی پیکربندی‌ها شکست‌های متوالی به غیرفعال شدن یا حذف hook می‌انجامد. با list و گزارش سرویس وضعیت را بررسی کنید.

تعداد retry، فاصله تلاش‌ها، timeout و رفتار redirect میان نسخه‌ها یکسان نیست. گیرنده را مستقیم و بدون redirect در دسترس قرار دهید. برای خطای احراز هویت روی retry حساب نکنید؛ برخی نسخه‌ها پاسخ ۴۰۱ را پایان تحویل در نظر می‌گیرند.

10

وب‌هوک ضبط با callback آماده شدن ضبط فرق دارد

شروع یا توقف ضبط داخل کلاس، پایان پردازش فایل و آماده شدن لینک پخش سه اتفاق متفاوت‌اند. قبل از نمایش «فایل آماده است»، نتیجه getRecordings و وجود لینک قابل استفاده را بررسی کنید.

در API استاندارد، تنظیمی مانند meta_bbb-recording-ready-url هم برای callback آماده شدن ضبط وجود دارد. این مسیر با hooks/create یکی نیست؛ قالب پیام و شیوه اعتبارسنجی آن می‌تواند JWT باشد. گیرنده checksum این صفحه را بدون تطبیق برای آن استفاده نکنید.

برای ضبط‌های پنل، دسترسی به گزارش‌ها و شیوه اعلام آماده شدن فایل را با سرویس فعال خود هماهنگ کنید. رویداد ضبط به معنی مجوز عمومی دانلود آن نیست.

11

آزمون اتصال قبل از استفاده واقعی

  1. گیرنده HTTPS را با تنظیمات آزمایشی و یک جلسه مشخص آماده کنید.
  2. یک درخواست بدون امضا بفرستید؛ باید رد شود.
  3. hooks/create را اجرا و hookID را ذخیره کنید؛ سپس list را بررسی کنید.
  4. جلسه آزمایشی بسازید، یک کاربر وارد و خارج شود و جلسه را پایان دهید.
  5. تعداد پیام‌ها، امضا، meetingID و ثبت inbox را بررسی کنید.
  6. همان پیام امضاشده را دوباره تحویل دهید؛ تعداد رکورد همان تحویل نباید بیشتر شود.
  7. بدنه پیام را بدون محاسبه دوباره امضا تغییر دهید؛ باید رد شود.
  8. در محیط آزمایشی، خرابی موقت صف را شبیه‌سازی کنید و رفتار retry را ببینید.
  9. پس از پایان تست، hook آزمایشی را با destroy حذف کنید.
لاگ امن برای پشتیبانی

نام متد، زمان، کد HTTP، messageKey و یک شناسه پیگیری داخلی کافی است. Secret، Authorization، URL کامل امضاشده یا payload شامل اطلاعات شخصی را در تیکت عمومی نفرستید.

12

عیب‌یابی و پاسخ‌های متداول

نشانهچه چیزی را بررسی کنم؟
۴۰۴ برای hooks/createفعال بودن افزونه، مسیر پایه API و مجوز مسیر hooks در سرویس واسط.
checksumError در ثبتنام کامل hooks/create، رشته query، encoding، Secret API و الگوریتم پشتیبانی‌شده.
duplicateWarningcallbackURL از قبل ثبت شده؛ hookID و فیلترهای موجود را بررسی کنید.
امضای callback نامعتبرURL ثابت، اسلش انتهایی، بدنه خام، الگوریتم callback، Secret فرستنده و تغییرات پراکسی.
hook ثبت شده ولی پیامی نمی‌رسدفیلتر جلسه و رویداد، فعال بودن سرویس از زمان ایجاد جلسه، دسترسی شبکه و لاگ گیرنده.
رویداد تکراریپاسخ دیرهنگام، timeout، retry یا تکرار منطقی رویداد؛ صف و کلید یکتا را بررسی کنید.
فایل ضبط هنوز آماده نیستمرحله ضبط را با مرحله پردازش و انتشار اشتباه نگیرید؛ getRecordings و وضعیت سرویس را بررسی کنید.
رویداد حساب دیگریhook سراسری، نگاشت شناسه و محدودیت tenant را بررسی کنید؛ قبل از پردازش، مالکیت جلسه باید تایید شود.

فهرست کدهای خطا با نسخه تغییر می‌کند. همراه با HTTP، returncode و messageKey پاسخ ثبت یا حذف را هم بخوانید.

13

پرسش‌های متداول

آیا با نصب این صفحه، وب‌هوک حساب من فعال می‌شود؟

خیر. این بسته صفحه راهنما و لینک داخلی می‌سازد. فعال‌سازی و مجوز دریافت رویداد روی سرویس کلاس باید جدا بررسی شود.

آدرس callback را چه بگذارم؟

آدرس گیرنده‌ای در برنامه خودتان که POST را دریافت و اعتبارسنجی می‌کند؛ نه آدرس /webhooks/ این سایت که یک صفحه مطالعه است.

آیا وب‌هوک به اطلاعات همه جلسه‌های پنل دسترسی می‌دهد؟

خیر. دامنه دسترسی به تنظیمات سرویس و حساب بستگی دارد؛ وب‌هوک راهی برای دور زدن محدودیت API یا دریافت اطلاعات دیگر مشتریان نیست.

برای سایت وردپرس یا مودل چه کاری لازم است؟

افزونه یا کد اتصال شما باید endpoint گیرنده، اعتبارسنجی و پردازش رویداد را پیاده کند. صرف نصب افزونه ورود به کلاس به معنی پشتیبانی وب‌هوک نیست. راهنمای افزونه‌ها و اتصال را ببینید.

آیا به کپچا یا فرم ورود روی گیرنده نیاز داریم؟

گیرنده سرویس به سرویس از checksum یا روش تاییدشده فرستنده استفاده می‌کند. صفحه ورود و کپچا تحویل را مختل می‌کنند. این استثنا فقط برای مسیر مشخص callback است؛ محافظت فرم‌های سایت را غیرفعال نکنید.

14

راهنماهای مرتبط

این راهنما بر پایه مستندات و پیاده‌سازی استاندارد bbb-webhooks تهیه شده است. جزئیات وابسته به نسخه با پیکربندی واقعی سرویس تطبیق داده شود. لینک‌های راهنمای داخل سایت شما را به صفحات همین مجموعه می‌برند.

بیگ بلو باتن ایران در بله

آموزش‌ها و خبرهای تازه را در کانال بیگ بلو باتن ایران دنبال کنید.

مشاهده کانال بله