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

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

Коротко: основа решения - идемпотентность и единая логика статусов платежа.

Почему возникает такая проблема

Дубли появляются, когда webhook платежной системы приходит повторно, cron запускается несколько раз, у клиента две активные подписки, retry создает новый платеж вместо проверки старого или код не фиксирует уникальный идентификатор операции.

Что проверить в первую очередь

  • есть ли у клиента несколько активных подписок
  • сколько раз приходил webhook
  • как работает cron списаний
  • используется ли idempotency key
  • какие статусы платежей записаны в базе

Как я подхожу к задаче

Я анализирую историю конкретного клиента и затем проверяю общий механизм, чтобы проблема не повторялась.

  • нахожу оба списания и их source id
  • сверяю webhook и логи cron
  • проверяю таблицы подписок и платежей
  • добавляю защиту от повторной обработки
  • тестирую сценарии успешного и повторного webhook

Что подготовить для быстрой диагностики

  • пример клиента с двойным списанием
  • название платежной системы
  • доступ к логам или админке
  • схему подписок при наличии
  • время и суммы платежей

Сроки и аккуратность

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

Чего лучше не делать

Не отключайте webhook полностью. Без него система может перестать видеть реальные оплаты и отмены.

FAQ

Можно ли вернуть деньги автоматически?

Можно, если платежный API поддерживает refund и есть понятное правило, какой платеж считать дублем.

Webhook может прийти дважды?

Да, это нормально для многих платежных систем, поэтому обработчик должен быть идемпотентным.

Нужно ли хранить id платежа?

Да, внешний идентификатор операции нужен для защиты от дублей.

Почему дубль возникает только иногда?

Часто это гонка задач или повтор при временной ошибке API.

Нужна похожая задача?

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

Итог

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