Платежный контур ломается не на happy path, а на сбоях.
Схема, которая выдерживает реальность, обычно выглядит так:
1. Создаём оплату с `capture=False`.
2. Входящий webhook не считаем истиной сразу — сначала `IP-check`.
3. Событие пишем в `event log`, и только потом запускаем обработчик.
4. `capture` подтверждаем стабильным `idempotency key`, а не случайным запросом.
5. Финальный успех валидируем не только по статусу, но и по `amount`, `currency`, `metadata`.
Что это даёт на практике?
- повторный webhook не дублирует оплату;
- поздний webhook не перетирает уже актуальный локальный статус;
- ошибочный запрос с чужого IP не проходит дальше;
- расхождение между ЮKassa и базой можно догнать через ручной `confirm`.
Главный вывод: webhook — это сигнал, а не истина. Истина появляется только после проверки, журнала и идемпотентного действия. Иначе платёжная система начинает «врать» при первом же сбое.
Ozon Lab
@OzonLabPro
Платежный контур ломается не на happy path, а на сбоях.
Этот пост опубликован в Telegram-канале Ozon Lab. Подписаться можно по ссылке: @OzonLabPro.