Зависшая страница, повторный клик покупателя, сбой на стороне провайдера — и деньги уходят дважды. Разбираем механику дублей платежей, их скрытые последствия и конкретные способы защиты для мерчантов.
Зависшая страница, нетерпеливый покупатель, который нажал «Оплатить» дважды, или кратковременный обрыв связи — и транзакция проходит дважды. Для мерчанта это не просто неприятность: за каждым таким инцидентом тянется цепочка потерь — от ручной сверки до чарджбэка и ухода клиента. Особенно болезненно это ощущают те, кто принимает платежи через СБП или работает в высокочастотном режиме: обменники, P2P-сервисы, онлайн-магазины с большим потоком транзакций.
Двойное списание почти никогда не связано с чьим-то злым умыслом. Это технологическая ошибка, которая возникает на стыке нескольких систем одновременно.
Если в момент оплаты пропадает интернет, ответ от банка-эквайера может не дойти до устройства покупателя. Транзакция уже прошла, но пользователь видит зависший экран и не понимает, списались ли деньги. Логичная реакция — попробовать ещё раз.
Не дождавшись реакции интерфейса, покупатель обновляет страницу или повторно нажимает кнопку оплаты. Если сервер не блокирует дублирующие запросы, каждый из них обрабатывается как отдельный платёж.
Мобильные браузеры и приложения при кратковременной потере связи могут самостоятельно повторить запрос. Магазин или сервис получает вторую идентичную операцию и проводит её, потому что не отличает автоматический дубль от осознанного действия пользователя.
Иногда причина — на стороне самого платёжного провайдера или банка-эквайера. Такие инциденты редки, но полностью исключить их нельзя. Особенно уязвимы мерчанты, работающие через единственного провайдера: если тот «падает» или даёт сбой, страдает и приём платежей, и логика обработки транзакций.
Помимо очевидных причин, есть менее заметные сценарии, которые регулярно встречаются в практике.
Если ссылка на оплату конкретного заказа сформирована статически — без привязки к уникальному токену сессии — покупатель может перейти по ней несколько раз с разных устройств или браузеров. Для каждого перехода генерируется новый запрос, и если шлюз не проверяет статус заказа до старта оплаты, деньги спишутся несколько раз.
Решение: инициировать платёж в шлюзе только после проверки, что по данному order_id ещё нет успешной транзакции.
Пользователь накопил несколько неоплаченных счетов и нажал «Оплатить» по всем сразу. Платёжная система видит уникальные ID и пропускает каждый. На бэкенд одновременно поступает десяток запросов на зачисление. Если система не успевает обновить статус между запросами, возникает гонка данных — деньги могут зачислиться несколько раз или, наоборот, списаться, но не зачислиться.
Решение: транзакции и блокировки на уровне базы данных. Счёт должен «захватываться» в момент начала обработки и освобождаться только после финального обновления баланса.
Дубль платежа запускает цепочку потерь, которые не всегда очевидны в моменте.
Для высокочастотных мерчантов — обменников, P2P-площадок, сервисов с большим потоком СБП-транзакций — каждый такой инцидент умножается на объём. Один технический сбой у единственного провайдера может за несколько минут сгенерировать десятки дублей и обрушить конверсию.
Большинство дублей можно устранить на уровне архитектуры приёма платежей.
order_id). Если запрос с таким ключом уже обрабатывался, сервер возвращает результат первой операции, а не создаёт новую.order_id — это позволяет поймать проблему до того, как её заметит покупатель.Действовать нужно быстро. Чем дольше мерчант тянет с возвратом, тем выше риск чарджбэка и репутационных потерь.
order_id, убедитесь, что речь именно о двойном списании, а не о двух разных заказах.Если дубли носят системный характер и связаны с нестабильностью конкретного провайдера, стоит задуматься об архитектуре приёма платежей в целом. Платформы с каскадной маршрутизацией — когда при сбое одного провайдера платёж автоматически уходит к следующему — снижают не только отказы, но и вероятность технических аномалий, связанных с нестабильным соединением между шлюзами. Именно так устроен MultiFlow: платёж проходит через пул провайдеров, и если один даёт сбой, система переключается автоматически — без потери транзакции и без дублей из-за таймаутов.
Дубли платежей — это не редкость и не форс-мажор. Это предсказуемая техническая проблема, которую можно и нужно закрывать на уровне архитектуры. Идемпотентные ключи, блокировки интерфейса, проверка статуса заказа и мониторинг транзакций — базовый набор, который защищает и мерчанта, и покупателя. А стабильность самого канала приёма платежей напрямую влияет на то, как часто вы вообще будете сталкиваться с подобными ситуациями.
Принимаете платежи через СБП и сталкиваетесь с отказами или нестабильностью? MultiFlow маршрутизирует каждый платёж через каскад провайдеров с автоматическим фолбэком — это снижает отказы, исключает потерю транзакций при сбоях и даёт стабильную конверсию. Вывод доступен в том числе в USDT. Узнайте подробнее на multiflow.world.
Материал подготовлен с помощью ИИ на основе публикации robokassa.com.
Без российского счёта, без серых схем — только официальная инфраструктура.
Написать в Telegram →