API и надёжная интеграция

Что делать, если платёж не прошёл: статусы и повтор

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

«Платёж не прошёл» — это три разные поломки, и лечатся они по-разному. Либо оплата вообще не открылась и покупатель не увидел форму, либо он дошёл до неё и получил отказ банка, либо ссылка на оплату истекла и он вернулся к ней через час.

Определить, какой случай ваш, можно за пять минут — по состоянию платежа в личном кабинете. А дальше всё решает текст на экране: покупатель не читает коды ошибок, он читает «попробуйте ещё раз» или уходит.

Три разных «не прошёл»

Что случилосьКак узнатьКто решает
Оплата не открыласьПлатежа нет в кабинете, покупатель не видел формыВы или ваш разработчик: ошибка на сайте
Отказ при оплатеПлатёж есть, состояние «отменён»Покупатель и его банк, часто помогает другой способ
Ссылка истеклаПлатёж есть, состояние «истёк»Вы: выдать новую ссылку на тот же заказ

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

Диагностика за пять минут

  1. Найдите платёж в кабинете по номеру заказа, сумме и времени. Если платежа нет вовсе — покупатель до формы не дошёл, и разбираться нужно на стороне сайта.
  2. Посмотрите состояние. «Отменён» — банк или покупатель прервали оплату. «Истёк» — человек вернулся к ссылке слишком поздно. «Оплачен» — деньги у вас, а проблема в выдаче товара, а не в платеже.
  3. Сравните время. Ссылка на оплату живёт ограниченный срок, обычно около получаса. Открытая позже, она не работает — и это не отказ банка.
  4. Проверьте, дошло ли подтверждение до сайта. Если платёж оплачен, а заказ у вас числится неоплаченным, поломка не в деньгах, а в обработке уведомления — тогда доступ выдайте вручную, а причину ищите потом.

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

Что показать покупателю в каждом случае

Покупателю не нужен код ошибки. Ему нужно понять две вещи: списались ли деньги и что делать дальше. Три ситуации — три текста.

  • Оплата не открылась. «Не удалось открыть оплату. Деньги не списаны. Нажмите «Оплатить» ещё раз — если не получится, напишите нам, заказ №1042 сохранён.» Заказ действительно сохраните, иначе покупатель начнёт оформлять всё заново.
  • Отказ при оплате. «Банк не подтвердил оплату. Деньги не списаны. Попробуйте другой банк в приложении СБП или оплатите картой.» Не пишите «недостаточно средств» — вы этого не знаете, а покупатель обидится.
  • Ссылка истекла. «Ссылка на оплату действовала 30 минут и уже неактивна. Вот новая — она работает до 14:35.» Кнопка «получить новую ссылку» должна быть прямо на этом экране.

Школа английского на 200 учеников теряла примерно каждую десятую оплату из-за того, что после отказа покупатель попадал на страницу с надписью «Ошибка 500». Заменили экран на «деньги не списаны, попробуйте ещё раз» с кнопкой повтора — вернули больше половины таких заходов, не тронув ни строчки в самой оплате.

Повтор без второго списания

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

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

Что до двойного списания — оно случается, когда покупатель жмёт кнопку несколько раз подряд, не получив реакции. Лечится это не запретами, а честным состоянием на экране: «платёж отправлен, ждём подтверждения банка» и неактивная кнопка до ответа.

Что написать в поддержку

Обращение без данных превращается в три круга уточнений. Соберите сразу:

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

Формулируйте вопрос конкретно: «платёж номер такой-то числится отменённым, покупатель говорит, что деньги списались — проверьте, пожалуйста, было ли зачисление». Ключи доступа и секреты в переписку не вкладывайте никогда: для разбора они не нужны, а их утечка обойдётся дороже спорного платежа.

Как уменьшить долю неудачных оплат

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

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

Что передать разработчику

Если сайт делает подрядчик, ему хватит трёх пунктов. Первое: состояние заказа определяется серверным уведомлением от платёжного сервиса, а не возвратом покупателя на страницу «спасибо» — этот адрес можно открыть из истории браузера. Второе: повторное уведомление о том же платеже не должно выдавать товар второй раз. Третье: у каждого заказа свой постоянный номер, и по нему всегда можно запросить актуальное состояние платежа.

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

Частые вопросы

Почему я не получаю событие payment.failed?

Такого события нет. Платёж, по которому не пришли деньги, заканчивается статусом canceled или expired, и на каждый из них приходит свой колбэк. Если ваш код ждёт failed, заказ так и останется в ожидании оплаты.

Как понять, списались ли у покупателя деньги?

Запросите GET /api/v1/payments/{paymentID} и посмотрите статус. При canceled и expired зачисления не было. Если покупатель уверяет в обратном, приложите payment_id, order_id, время и сумму и попросите поддержку проверить зачисление.

Как дать покупателю повторить оплату и не создать дубль заказа?

Заказ остаётся один, платежей к нему может быть несколько. Если по заказу есть живой платёж в статусе created или processing, верните его pay_url. Если все прошлые платежи закрыты, создайте новый платёж с новым order_id вида 1042-r2.

Что означает ошибка nonce already used?

Вы повторно отправили тот же заголовок X-Nonce. Каждое значение живёт 10 минут и принимается один раз, поэтому генерируйте новый UUID на каждый запрос. Чаще всего это следствие ретрая, который переиспользует тот же заголовок.

Что писать на экране после неудачной оплаты?

Сначала главное: деньги не списаны и заказ сохранён. Потом одно действие — кнопка повтора или получения новой ссылки. Код ошибки покупателю не показывайте, а формулировки вроде «недостаточно средств» не используйте, если не знаете причину отказа.

Источники и документация