Заголовки
| Поле | Тип | Описание |
|---|---|---|
X-Api-Keyобяз. | string | Публичный ключ мерчанта (pk_…) — тот же, что вы используете для запросов к API. |
X-Secretобяз. | string | Секрет мерчанта (sk_…). |
Как проверять
Сравните оба заголовка с вашими сохранёнными значениями в постоянном времени(constant-time). Если хотя бы один не совпал — верните 401 и не обрабатывайте событие.
import crypto from "node:crypto";function safeEqual(a, b) {const ba = Buffer.from(String(a));const bb = Buffer.from(String(b));return ba.length === bb.length && crypto.timingSafeEqual(ba, bb);}export function verifyCasheraWebhook(req) {const okKey = safeEqual(req.headers["x-api-key"], process.env.CASHERA_API_KEY);const okSecret = safeEqual(req.headers["x-secret"], process.env.CASHERA_API_SECRET);return okKey && okSecret;}
Секрет даёт доступ к приёму платежей и подписи выплат. Не пишите X-Secret в логи доступа, APM или трекеры ошибок. Храните ключ и секрет только в переменных окружения.
Верните 401 и не обрабатывайте платёж/выплату. Несовпадение означает либо устаревший секрет (проверьте актуальные значения в кабинете), либо подделку запроса.
После проверки
Подтвердив подлинность, обработайте событие идемпотентно по ключу uuid + status и верните 2xx. Подробнее о формате событий и повторах — на странице вебхуков.
HMAC-подпись (X-Timestamp / X-Signature) используется в обратную сторону — когда вы отправляете запросы к API выплат. См. подписанные запросы.