Skip to content

Идемпотентная обработка ​

Поскольку доставка at‑least‑once, обработчик обязан быть идемпотентным: одно и то же событие не должно приводить к повторной выдаче.

Рекомендуемый порядок ​

  1. Захватите сырые байты тела.
  2. Проверьте подпись (инструкция).
  3. Проверьте временную метку (окно ±5 минут).
  4. Дедуплицируйте по X-ElevenPay-Event-Id: если уже обработано — верните 2xx.
  5. Разберите JSON (только после проверки).
  6. Проверьте schema_version, type и что id из тела совпадает с заголовком.
  7. Найдите свой заказ по merchant_order_id.
  8. Проверьте status == "succeeded", сумму и валюту относительно ваших ожиданий.
  9. Выполните выдачу в транзакции и зафиксируйте id события как обработанный.
  10. Верните 2xx.

Транзакционность ​

Выполняйте в одной транзакции: проверку «событие не обработано» → проверку заказа → выдачу → отметку события обработанным. Затем фиксируйте транзакцию и только потом возвращайте 2xx. Это исключает двойную выдачу при повторной доставке.

Неизвестный заказ ​

Если событие ссылается на неизвестный вам merchant_order_id — не создавайте заказ из вебхука и не выполняйте выдачу вслепую. Используйте GET‑сверку и вашу политику поддержки.

Проверка суммы и валюты ​

Перед выдачей сравните amount и currency из события со своими ожиданиями по заказу. Не выдавайте при несовпадении. Не изобретайте поля, которых нет в событии — используйте только фактические поля data.payment (см. События).

Полный пример обработчика — Обработчик вебхуков.