Статус «карта привязана» подтверждает сохранение платёжного метода, но не гарантирует запуск следующего списания. Автоплатёж зависит от активной подписки, расписания, серверного задания и корректного статуса предыдущей операции.
Проверьте цепочку по идентификатору клиента: 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 и безопасно восстановить списания.