Чтобы подключить оплату на сайте, сначала определите продавца, предмет расчёта, провайдера и связь платежа с заказом. Затем проверьте весь путь: создание платежа, подтверждение пользователем, получение достоверного статуса и допустимое изменение заказа. Возвращение человека на сайт ещё не означает успешную оплату.

Технический пример ниже опирается на redirect-сценарий ЮKassa. Учебные проверки не выполнялись, деньги и реальные реквизиты не использовались. Правовые условия, договор и применимость кассовой схемы определяют для конкретного бизнеса; универсального обещания соответствия здесь нет.

Начать разбор

Согласуйте состав расчёта до выбора кнопки

Платёжная кнопка — последняя видимая часть подготовки. До разработки выясните, кто принимает деньги, за что платит покупатель, как определяется сумма и когда возникает право исполнить заказ. Зафиксируйте валюту, скидки, условия доставки, отмены и возвраты, если они относятся к процессу.

Назначьте владельцев решений. Бизнес подтверждает предмет и правила заказа. Провайдер — доступные методы и условия своего сервиса. Технический исполнитель — обмен данными и обработку состояний. Профильный специалист проверяет применимые правовые и учётные требования по фактической схеме.

Паспорт будущей интеграции
ВопросЧто должно быть определено
Продавец и договорКонкретная сторона и принятые условия провайдера
Предмет оплатыТовар или услуга, состав заказа и расчёт суммы
ПроцессКогда подтверждают оплату и начинают исполнение
ИсключенияОтказ, отмена, повтор, возврат и неизвестный результат
ПриёмкаТестовый контур, сценарии и ответственные

Не выбирайте схему только по удобному примеру API. Реальный магазин может иметь ограничения по способам оплаты и настройкам. До подключения нужно выяснить условия именно своего аккаунта и процесса.

Свяжите заказ с отдельным объектом платежа

Заказ описывает обязательство перед покупателем, платёжный объект — операцию у провайдера. Их нужно связать идентификаторами, а не только похожим текстом назначения. Сохраните, какой платёж относится к какому заказу и какой результат уже обработан.

Сумму и валюту определяет принятая логика на сервере. Передача числа из браузера не заменяет сверку заказа: пользователь может изменить запрос. Также проверьте, кто вправе начать оплату этого заказа и какие действия разрешены после смены его состояния.

В quickstart ЮKassa пример создания использует заголовок Idempotence-Key. Для реальной реализации уточняют полный договор повторных запросов у выбранного провайдера: какие операции поддерживаются и какие ограничения действуют. Само наличие заголовка не обещает универсальное «строго один раз» для всей системы.

План повторов нужен особенно при неизвестном исходе. Если соединение прервалось, это не доказывает, что платёж не создан. Не следует без проверки создавать новую независимую операцию только потому, что пользователь ещё раз нажал кнопку.

Секретные ключи не помещают в публичный код или журналы для посетителя. Их использование и права относятся к серверному контуру. OWASP рекомендует проверять разрешения каждого запроса; для заказа это означает проверку конкретного объекта и допустимого действия.

Не считайте return_url доказательством оплаты

В redirect-примере ЮKassa создаётся платёж со статусом pending, а пользователь переходит по confirmation_url на страницу подтверждения. После этого он может вернуться на return_url и при успехе, и если что-то пошло не так.

Поэтому страница возврата должна узнать достоверный результат, а не рисовать «оплачено» по факту открытия. В описанном сценарии успех определяется статусом succeeded, отказ — canceled. Статус получают через уведомление или запрос информации о платеже.

Что показывать при разных известных состояниях
НаблюдениеЧто допустимо сказатьДействие системы
Пользователь вернулся, статус неизвестенРезультат проверяетсяПолучить актуальную информацию
Подтверждён succeededОплата подтверждена для связанного заказаВыполнить согласованную обработку
Подтверждён canceledПлатёж не завершился успешноОбъяснить допустимый следующий шаг
Получен pending для связанного платежаОплата ещё не подтверждена; товар или услугу пока не выдаватьПродолжить получение статуса того же платёжного объекта по согласованному процессу

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

Проверьте уведомление до изменения заказа

Уведомление связывает платёжную систему с сервером сайта. У ЮKassa получение подтверждается ответом HTTP 200; другие коды приводят к повторной доставке по правилам сервиса. Документация отдельно требует проверять подлинность и актуальность сведений.

В проекте нужно определить, как проверяют отправителя или текущий объект, как находят связанный заказ и что делают при расхождении. Не копируйте раз и навсегда список IP из статьи: при таком способе проверки сверяются с актуальным списком провайдера.

Отдельно решите порядок сохранения результата и ответа. Подтверждение получения и бизнес-обработка — разные действия. Если сообщение принято, но изменение заказа не удалось, нужен предусмотренный путь восстановления; зелёный ответ транспорта не должен скрывать потерянную работу.

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

Статус платежа нельзя считать подтверждением действий сотрудника. Система могла получить succeeded, а заказ ещё не передан в исполнение. Назовите эти состояния отдельно и фиксируйте, где заканчивается платёжная интеграция.

Отделите тестовый контур от реального магазина

В тестовом режиме ЮKassa деньги не переводятся. Используются ключи и данные тестового магазина, а объект помечен test=true. Это позволяет проверять предусмотренные сценарии, не имитируя настоящую продажу.

Тестовый магазин поддерживает определённый набор способов и возможностей. Его результат нельзя считать проверкой всех методов, которые будут доступны в реальном магазине. Соответствие выбранного способа и сценария уточняют перед приёмкой.

Для тестовых уведомлений нужен отделённый маршрут обработки. Тестовая операция не должна изменить реальный заказ на оплаченный или запустить выдачу товара. Если в проекте есть аналитика заявок и продаж, тестовые события также не следует смешивать с бизнес-результатом.

Список ожидаемых исходов составьте до прогона. Проверяйте успех, отказ, возврат без известного статуса, повторное сообщение, несоответствие заказу и отказ внешнего сервиса. Если какой-то сценарий нельзя выполнить в доступном контуре, запишите ограничение вместо отметки «всё проверено».

В этой статье приведена только структура учебной проверки. Аккаунты, ключи и операции не создавались; для будущего тестирования нужны отдельные разрешённые окружение, данные и ответственное лицо.

Учебная матрица: demo-order-A

Условный заказ demo-order-A связан с тестовым платёжным объектом. Состояния ЮKassa используются как пример, а ожидаемая работа заказа — как проектный контракт. Таблица не содержит результаты проведённых тестов.

Сценарии приёмки и ожидаемые доказательства
СценарийОжидаемое поведениеДоказательство
Возврат браузера без статусаНет ложного успеха; результат проверяетсяЭкран и запрос актуального объекта
Подтверждён succeeded для нужного заказаОдна согласованная бизнес-обработкаСвязь ID, суммы, валюты и нового состояния
Подтверждён canceledНет оплаченного заказаСтатус и допустимый путь повтора
Уведомление доставлено повторноНет повторного исполненияЖурнал события и отсутствие дубля
Подлинность или связь не подтвержденыЗаказ не объявляют оплаченнымБезопасная обработка и диагностическая запись
Объект имеет test=trueТолько тестовый процессНет реальной выдачи и бизнес-события продажи
Для связанного платежа получен pendingНет выдачи товара или услуги и новой независимой операции из-за ожиданияСтатус того же платёжного объекта и сохранённая связь с заказом

В журнале связывают заказ, платёж, событие и обработку. Не записывайте туда секретный ключ или полный набор чувствительных данных. Для диагностики нужны достаточные идентификаторы и статус, а состав журнала согласуется отдельно.

Добавьте случаи вашего бизнеса: изменение заказа перед оплатой, повтор открытия ссылки, недоступный внешний сервис. Для каждого обозначьте источник достоверного состояния и того, кто решает исключение. Не придумывайте скрытую «успешность», когда ответ не получен.

Назначьте владельца чеков, возвратов и правовых условий

Техническая передача платежа не определяет правовой статус продавца. Применимость требований зависит от фактической стороны, предмета и схемы расчёта. Нельзя по одному примеру API утверждать, что любой бизнес обязан выбрать одну кассу или автоматически освобождён от неё.

ЮKassa описывает отдельные настройки работы с чеками для соответствующих магазинов. Это инструкция к определённому процессу, а не заключение о применимости 54-ФЗ для всех читателей. До реального включения ответственные проверяют договор, учётную схему, чеки, возвраты и передачу данных.

Возврат также требует своего сценария: кто вправе его начать, какие данные и действия подтверждаются, как меняется заказ и что сообщают покупателю. Успешная оплата не делает этот процесс готовым автоматически. Точную реализацию смотрят в актуальной документации выбранного провайдера.

Для административных операций определите роли и подтверждение пользователя. OWASP рассматривает повторную аутентификацию после рискованных событий и для чувствительных действий. Конкретное применение и параметры относятся к вашему проекту; сам этот пункт не является полной проверкой безопасности.

Условия реального магазина и разрешение на финансовые действия принимают отдельно от учебного тестового отчёта. Это сохраняет ясную границу между проверкой интерфейса, интеграцией и решениями бизнеса.

Примите весь путь и передайте его ответственному

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

Результат каждого сценария записывайте отдельно: прошёл, обнаружена ошибка, не проверен или заблокирован отсутствующим условием. Если недоступен нужный способ оплаты, это ограничение именно этого способа, а не повод зачесть его по соседнему тесту. Сохраните также договорённость, кто перепроверяет интеграцию после изменения цены, состава заказа или обработки событий. Иначе технически принятый сегодня путь может измениться без повторной приёмки.

Проверьте передаваемые дальше события. Если статус поступает в CRM, определите, что именно передаётся и как подтверждается сохранение. «Отправили запрос» и «сотрудник получил корректный заказ» — разные этапы. Не объявляйте доставку уведомления завершённым обслуживанием клиента.

Составьте инструкцию для исключений: неопределённый результат, повторная доставка, расхождение суммы, недоступный сервис. Укажите, какие действия сотрудник может выполнить и где проверить основание, не заставляя его угадывать по сообщениям браузера.

Общую проверку проекта можно включить в приёмку сайта у подрядчика. Для оценки объёма интеграции полезен разбор сметы, а выбор CMS рассматривайте отдельно в сравнении платформ.

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

Источники и документы

Автор статьи

Основатель Бадрик Лаб и веб-разработчик. Проектирует и запускает сайты, отвечает за техническую архитектуру, приёмку и развитие проектов студии.