API, webhooks и backend Опубликовано 29 июня 2026 г. 9 мин чтения

API-интеграция онлайн-платежей для кастомного сайта: payment sessions и webhooks

Кастомный сайт дает полный контроль над checkout, но требует строгого backend-контракта, статусов и повторяемой обработки событий.

API-интеграция онлайн-платежей для кастомного сайта: payment sessions и webhooks

Ключевые темы

API-интеграция онлайн-платежей для кастомного сайта: payment sessions и webhooksAPI, webhooks и backendpayment webhooksidempotency key платежиserver-side verificationстатусы онлайн-платежейpayment backend

Связанные публичные страницы

Если нужен не только разбор, а страница продукта, API или операционного сценария, начните с этих разделов VPOS.am.

Payment session должна создаваться на backend

Frontend может запускать checkout, но сумму, валюту и финальный статус должен контролировать server-side слой.

Backend creates payment session
Website sends order intent; backend validates amount and creates hosted checkout session.

Для кастомного сайта, Laravel/Yii2 backend, React storefront или мобильного приложения безопасный flow начинается на server-side. Клиентский интерфейс может собрать корзину и отправить намерение оплаты, но backend должен рассчитать сумму, валюту, order id и создать payment session.

Если frontend сам решает сумму или считает платеж успешным после redirect, возникают риски подмены параметров, дублей заказов и потерянных successful оплат. Payment session должна хранить внутренний id, merchant order id, amount, currency, status и срок жизни.

  • создавать payment session только после backend validation;
  • фиксировать amount и currency до checkout;
  • использовать hosted checkout или controlled redirect;
  • не считать redirect финальным статусом оплаты.

Idempotency защищает от дублей заказов и платежей

Повторный запрос создания платежа должен возвращать тот же результат или контролируемую новую попытку.

Idempotency key -> stable payment
Repeated create request, double click or network retry does not create duplicate business objects.

В реальном checkout пользователь нажимает кнопку дважды, мобильная сеть повторяет запрос, браузер перезагружает страницу, а webhook может прийти несколько раз. Без idempotency каждая такая ситуация может создать дубль payment attempt или заказа.

Idempotency key лучше связывать с операцией: create payment session, process webhook, create fiscal receipt, update CRM. Тогда retry возвращает предсказуемый результат, а audit trail показывает, что произошло.

  • уникальный ключ для create payment session;
  • повтор webhook не меняет финальный статус назад;
  • CRM/ERP update должен быть повторяемым;
  • ручные исправления должны попадать в audit log.

Webhooks, status checks и синхронизация с бизнес-системами

Платежный backend должен принять финальное событие, проверить его и затем доставить нормализованный статус во внутренние системы.

Webhook -> status check -> CRM/ERP
Verified event updates payment state, order, CRM, ERP, fiscal workflow and reconciliation queue.

Webhook нельзя обрабатывать как обычную форму. Нужно проверить подпись или выполнить status check у провайдера, сопоставить provider reference, amount, currency и order id, а затем провести разрешенный переход статуса.

После этого нормализованное событие можно доставлять в CRM, ERP, фискализацию, уведомления и сверку. Если одна из downstream-систем временно недоступна, платежный статус должен сохраниться, а интеграция должна повторить доставку.

  • проверять provider reference, amount и currency;
  • использовать state machine для переходов статусов;
  • доставлять события в очереди с retry;
  • отделять payment status от fiscal и delivery status.

FAQ

Можно ли создать payment session с frontend?

Frontend может инициировать запрос, но session должен создавать backend после проверки заказа, суммы, валюты и прав доступа. Иначе параметры оплаты легко подменить.

Нужен ли webhook, если есть success page?

Да. Success page показывает результат клиенту, но финальный бизнес-статус лучше ставить после webhook или server-side status check.

Что делать, если CRM недоступна после успешной оплаты?

Сохранить paid-статус во внутренней payment session, поставить CRM update в retry и показать исключение оператору только если повторные попытки не прошли.