Webhooks
Отримуйте та перевіряйте події термінального статусу замовлень
Коли замовлення, розміщене через API, досягає термінального статусу, Voodoo
Center надсилає POST із підписаною JSON-подією на налаштовану вами webhook-URL.
Це рекомендований спосіб дізнатися результат замовлення — він базується на push,
тож вам не потрібно виконувати опитування.
Коли спрацьовують webhook
Webhook надсилається, коли виконуються всі такі умови:
- Замовлення досягає термінального статусу:
completed,failedабоpartial. - Замовлення було розміщене через API (
source: "api"). Замовлення, створені в дашборді, не запускають webhook. - Для вашого акаунта налаштовано webhook-URL.
Тіло запиту
Тіло запиту — це компактний JSON із відсортованими ключами з такими полями:
Перевірка підпису
Кожен webhook несе заголовок:
де <hex> — це HMAC-SHA256(webhook_secret, raw_request_body_bytes).
Перевіряйте щодо сирих отриманих байтів, точно так, як їх доставлено — ніколи щодо словника, який ви пересеріалізували. Підписане тіло — це компактний JSON із відсортованими ключами, тож будь-яке перекодування (інший порядок ключів, пробіли чи форматування чисел) дасть інший підпис і не пройде перевірку.
Обчисліть той самий HMAC зі своїм секретом для підпису та порівняйте його із заголовком, використовуючи порівняння сталого часу (constant-time).
Приймач і верифікатор на FastAPI
Цей приймач перевіряє сирі байти перед парсингом, використовує порівняння
сталого часу та швидко повертає 200:
Підтвердження, повторні спроби та таймаути
- Підтверджуйте HTTP
200, щойно ви зберегли подію. Будь-яка відповідь, що не є200(або таймаут), вважається невдалою доставкою. - Невдалі доставки повторюються до 3 спроб із інтервалом 60 секунд.
- Кожна спроба має таймаут 30 секунд.
- Переспрямування не виконуються, а ваша URL має бути публічно маршрутизованою — захист від підробки запитів на боці сервера (SSRF) блокує внутрішні/приватні адреси.
Оскільки одну подію може бути доставлено більше одного разу (наприклад, повторна
спроба після того, як ваш 200 надійшов із затримкою), зробіть свій обробник
ідемпотентним: дедуплікуйте за order_id і сприймайте повторну доставку вже
обробленої події як no-op.
Виконуйте важку роботу (виконання власного подальшого замовлення, надсилання
листа тощо) у фоні та швидко повертайте 200 — повільний обробник ризикує
таймаутом у 30 секунд і зайвою повторною спробою.
Налаштування URL і ротація секрету
Обидва налаштування webhook розміщені на сторінці API в дашборді (вони доступні лише в дашборді, а не як ендпоінти API):
- Webhook URL — куди надсилаються (
POST) події. Має бути публічно доступною через HTTPS. - Секрет для підпису — використовується для обчислення
X-Webhook-Signature. Його формат —whsec_..., і він показується один раз, під час створення/ротації. Виконайте ротацію, якщо він міг витекти, і оновітьWEBHOOK_SECRETу своєму приймачі, щоб він відповідав.