Перейти к содержанию
Paycryp.
Оплата на сайте

Вебхук оплаты: как сайт узнаёт, что заказ оплачен

Вебхук — уведомление от платёжного сервиса вашему серверу. Он помогает обновить заказ без участия покупателя, но перед выдачей нужно проверить подлинность события, сумму и связь с покупкой.

Редакция PaycrypОпубликовано 3 мин чтения

Почему страницы успеха недостаточно

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

Вебхук позволяет серверу получить событие самостоятельно. В Paycryp для подтверждения используется payment.confirmed; есть также события отмены, истечения срока, отклонения и возврата.

Проверьте подпись

Заголовок X-Paycrypt-Signature содержит данные подписи. Важно сохранить именно такое написание: внешние технические имена не меняются вместе с названием бренда в интерфейсе.

Подпись проверяется по исходному телу запроса и секрету терминала. Если сначала разобрать JSON, а затем собрать его заново, пробелы и порядок могут отличаться. Поэтому raw body сохраняют до преобразования.

Секрет не размещают в браузере и не пишут в публичные логи. Полный пример проверки находится в документации API.

Найдите свой заказ

После проверки найдите заказ по orderId. Сверьте валюту и исходную цену baseAmount. Не выдавайте произвольный товар только потому, что событие содержит знакомый e-mail или похожую сумму.

В полезном журнале обработки остаются идентификатор платежа, номер заказа, событие и результат действия. Контакты покупателя и секреты туда без необходимости не добавляют.

Будьте готовы к повторам

Вебхуки могут доставляться повторно. Значение X-Paycrypt-Delivery обозначает доставку и остаётся тем же при её повторах. Обработка должна понимать, что событие уже выполнено.

Защитите также саму выдачу по идентификатору платежа. Это помогает при сбое между изменением заказа и ответом сервера: повтор не создаст второй доступ или второй цифровой ключ.

Учитывайте порядок событий

Paycryp передаёт version — время изменения платежа. Применяйте только более новое состояние. Старое подтверждение не должно возвращать уже возвращённый платёж в статус оплаченного.

При сомнении запросите актуальный платёж через GET. Это также полезно после восстановления вашего сервера, если часть уведомлений была пропущена.

Что проверить на тестах

  • Корректное подтверждение открывает нужный заказ.
  • Неверная подпись не меняет данные.
  • Повтор не выдаёт товар второй раз.
  • Старое событие не отменяет новое состояние.
  • Временный сбой выдачи можно обработать отдельно.
  • Проверка через GET восстанавливает актуальный статус.

После сохранения результата сервер отвечает успешным HTTP-кодом. Долгую выдачу лучше отделить от приёма события так, чтобы уже принятое уведомление не терялось при перезапуске.

Материалы по теме