Статус «карта привязана» подтверждает сохранение платёжного метода, но не гарантирует запуск следующего списания. Автоплатёж зависит от активной подписки, расписания, серверного задания и корректного статуса предыдущей операции.

Проверьте цепочку по идентификатору клиента: token платёжного метода, состояние подписки, дату next_charge_at, запуск worker и ответ платёжного провайдера.

Что сделать в первую очередь

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

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

Чаще всего списание не создаётся из-за рассинхронизации статусов или неверного условия выборки подписок.

  • Токен карты сохранён, но не назначен подписке по умолчанию.
  • next_charge_at записан в другом часовом поясе.
  • Cron или очередь остановлены после обновления сервера.
  • Webhook первого платежа не активировал подписку.
  • Банк требует повторного подтверждения или отклоняет операцию.

Пошаговая диагностика

  • Проследите одну подписку от базы до журнала worker.
  • Проверьте SQL-условия выбора due-подписок.
  • Сравните локальный статус с кабинетом платёжного провайдера.
  • Проверьте обработку повторных webhook и идемпотентного ключа.
  • Убедитесь, что ошибка отказа сохраняется и показывается клиенту.

Как исправить

Исправление должно исключать как пропущенные, так и двойные списания.

  • Свяжите подписку с конкретным payment_method_id и проверяйте его активность.
  • Храните время в UTC, а отображайте в часовом поясе клиента.
  • Запускайте списание через очередь с блокировкой одной подписки.
  • Используйте уникальный идемпотентный ключ на расчётный период.
  • Добавьте контролируемые повторные попытки только для допустимых типов отказа.

Как проверить результат

  • Тестовая подписка создаёт одно списание в назначенное время.
  • Повтор worker не создаёт дубль платежа.
  • Отказ переводит подписку в понятный статус и запускает уведомление.
  • Успешный webhook назначает следующую дату ровно один раз.

Как не допустить повторения

  • Мониторьте очередь и количество просроченных списаний.
  • Сверяйте платежи с провайдером по ежедневному отчёту.
  • Покройте тестами повторы webhook и worker.
  • Не записывайте реквизиты карты в собственную базу и логи.

Чего не стоит делать

  • Не запускайте ручной массовый повтор без идемпотентности.
  • Не меняйте статус на «оплачено» до подтверждения провайдера.
  • Не скрывайте причину отказа от службы поддержки.

Что подготовить для диагностики

  • ID подписки и операции без платёжных реквизитов.
  • Время ожидаемого списания и часовой пояс.
  • Журнал worker и webhook за этот период.
  • Описание текущей модели статусов.

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

Можно ли повторять любой отказ автоматически?

Нет. Для части кодов нужен новый способ оплаты или действие клиента; правила повторов должны учитывать классификацию провайдера.

Почему списание прошло дважды?

Обычно один период обработали два worker или повторный webhook повторно запустил бизнес-операцию без идемпотентного ключа.

Когда стоит обратиться за помощью

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

Итог

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