Повторный запрос оплаты: как не создать два платежа за один заказ
Повтор запроса не должен превращаться в новую покупку. Для одного неизменённого заказа сохраняйте один orderId, а после сетевой ошибки сначала проверяйте уже созданный платёж.
Сбой связи не равен неудачной покупке
Сайт отправил запрос, но ответ не успел вернуться. Платёжный сервис мог уже создать счёт. Если сразу отправить новый запрос с другим номером заказа, у человека появятся две ссылки на одну покупку.
Это обычная ситуация для мобильной сети. Её лучше обработать заранее, чем объяснять потом, почему в истории несколько одинаковых сумм.
Используйте постоянный orderId
В Paycryp orderId уникален в рамках терминала. Повтор с тем же номером и той же исходной ценой позволяет работать с существующим платежом. Если сумма изменилась, такой повтор конфликтует с прежними условиями.
Поэтому номер создаётся для заказа, а не для каждого нажатия кнопки. Не генерируйте новый случайный идентификатор при любой перезагрузке страницы.
Разделите повтор и новую покупку
Повтор — это попытка завершить тот же заказ. Новая покупка — другой товар, тариф, период или намерение клиента. Их важно различать.
Например, человек ещё раз нажал «Оплатить» после зависания: проверьте текущий заказ. Но если он решил купить второй отдельный пакет, создаётся новый заказ. Такой выбор должен быть понятен и интерфейсу, и серверу.
После ошибки сначала сверяйтесь
Найдите платёж по сохранённому идентификатору или orderId через API. Если он существует, используйте его состояние и платёжную ссылку. Если уже подтверждён — переходите к выдаче, а не к новой оплате.
Кнопка на странице может быть временно отключена, пока идёт запрос. Это улучшает интерфейс, но не заменяет серверную защиту: запрос может повторить сеть, другая вкладка или сам обработчик.
Защитите выдачу отдельно
Даже один платёж может вызвать несколько попыток обработки уведомления. Сохраните факт выдачи по идентификатору покупки. Для VPN это предотвращает двойное продление, для магазина ключей — расход двух экземпляров.
Если выдача завершилась, а ответ обработчика потерялся, повтор должен увидеть уже готовый результат.
Небольшой набор проверок
- Два быстрых нажатия дают один заказ.
- Повтор после сетевой ошибки не создаёт новую оплату.
- Тот же orderId с другой ценой не подменяет покупку.
- Подтверждённый заказ не предлагает оплатить себя снова.
- Повторное событие не выполняет выдачу второй раз.
Эти проверки делают оплату спокойнее для покупателя. Он может вернуться к странице после сбоя и продолжить с того места, где остановился.