Идемпотентная обработка
Поскольку доставка at‑least‑once, обработчик обязан быть идемпотентным: одно и то же событие не должно приводить к повторной выдаче.
Рекомендуемый порядок
- Захватите сырые байты тела.
- Проверьте подпись (инструкция).
- Проверьте временную метку (окно ±5 минут).
- Дедуплицируйте по
X-ElevenPay-Event-Id: если уже обработано — верните2xx. - Разберите JSON (только после проверки).
- Проверьте
schema_version,typeи чтоidиз тела совпадает с заголовком. - Найдите свой заказ по
merchant_order_id. - Проверьте
status == "succeeded", сумму и валюту относительно ваших ожиданий. - Выполните выдачу в транзакции и зафиксируйте
idсобытия как обработанный. - Верните
2xx.
Транзакционность
Выполняйте в одной транзакции: проверку «событие не обработано» → проверку заказа → выдачу → отметку события обработанным. Затем фиксируйте транзакцию и только потом возвращайте 2xx. Это исключает двойную выдачу при повторной доставке.
Неизвестный заказ
Если событие ссылается на неизвестный вам merchant_order_id — не создавайте заказ из вебхука и не выполняйте выдачу вслепую. Используйте GET‑сверку и вашу политику поддержки.
Проверка суммы и валюты
Перед выдачей сравните amount и currency из события со своими ожиданиями по заказу. Не выдавайте при несовпадении. Не изобретайте поля, которых нет в событии — используйте только фактические поля data.payment (см. События).
Полный пример обработчика — Обработчик вебхуков.