Кожному платіжному вебхуку потрібні три гарантії: автентичність (запит справді надійшов від нас), доставка щонайменше один раз (жодних подій, тихо втрачених) та ідемпотентність (повторні доставки не списують двічі у вашій БД).
Автентичність: кожен вебхук Baynoy постачає заголовок X-Baynoy-Signature — sha256(timestamp + '.' + body) із секретом вашого ендпоінту. Відхиляйте, якщо мітка часу старіша за 5 хвилин (захист від повторного відтворення) або підпис не збігається при порівнянні за сталий час. Ми дотримуємося стандартного формату підпису HMAC-SHA256, тож middleware перевірки підпису, яке ви вже використовуєте, підключається без змін.
Щонайменше один раз: ми повторюємо спроби з експоненційною витримкою через 1хв, 5хв, 30хв, 2год, 12год, 24год — максимум шість спроб. Кожна спроба записує рядок у baynoy_webhook_deliveries зі статусом відповіді. Ваша кнопка повторної доставки з UI в панелі керування використовує той самий конвеєр доставки; жодного окремого шляху.
Ідемпотентність: кожна подія несе event.id (UUIDv7 — сортований, монотонно зростаючий). Збережіть його при першому отриманні й відхиляйте дублікати на рівні БД за допомогою унікального обмеження. Ми повторимо доставку. Це обмеження — ваша страхувальна сітка.
Три рядки middleware — і ви маєте обробник вебхуків, що переживе 6-годинний збій, не втративши жодного сповіщення про платіж.