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в своём приёмнике, чтобы он соответствовал.