Безопасность
Надёжность вебхуков зависит как от поведения вашего эндпоинта, так и от гарантий доставки со стороны Unico. На этой странице описаны три инварианта, которым должен соответствовать ваш эндпоинт: идемпотентность, ограничение параллелизма и частота ошибок.
Идемпотентность
Реализация вебхуков Unico гарантирует доставку хотя бы один раз — один и тот же статус может быть отправлен более одного раза для одного и того же processId. Ваш энд поинт должен быть идемпотентным.
Рекомендуемый паттерн:
- При каждом вызове вебхука сначала проверьте, был ли
processIdуже обработан. - Если да — немедленно верните
2xx(работа уже выполнена). - Если нет — примените бизнес-логику и сохраните информацию о том, что этот
processIdбыл обработан.
// pseudo-code
async function handleWebhook(req, res) {
const { processId } = req.body;
if (await alreadyProcessed(processId)) {
return res.status(200).end();
}
await applyBusinessLogic(req.body);
await markAsProcessed(processId);
return res.status(200).end();
}
Почему это важно
Неидемпотентный эндпоинт, выполняющий бизнес-логику при каждой доставке (например, списывающий деньги с карты или отправляющий email), будет срабатывать повторно при каждой повторной попытке — а повторные попытки являются нормой, а не исключением при доставке вебхуков.