Обзор
Система “сквозной корзины” решает проблему: пользователь хочет купить подписку, но баланса не хватает. Вместо того чтобы заставлять пользователя начинать покупку заново после пополнения, бот сохраняет параметры покупки и может автоматически оформить подписку после зачисления средств.Как работает
Сохранение корзины
При недостатке средств бот сообщает:- Сколько не хватает для покупки
- Что корзина сохранена
- Предлагает кнопку Пополнить баланс
Что сохраняется
Корзина хранится в Redis с ключомuser_cart:{user_id} и содержит все параметры покупки:
TTL корзины
По умолчанию корзина живет 1 час (3600 секунд). Настраивается черезCART_TTL_SECONDS.
После истечения TTL корзина автоматически удаляется из Redis.
Автоматическая покупка
ПриAUTO_PURCHASE_AFTER_TOPUP_ENABLED=true покупка происходит полностью автоматически — без подтверждения от пользователя.
Когда срабатывает
После каждого успешного платежа через любую платежную систему:- YooKassa, CryptoBot, Telegram Stars, CloudPayments
- Freekassa, Platega, PayPalych, Heleket
- MulenPay, Tribute, WATA, Kassa AI
Логика после пополнения
- Проверяется
AUTO_PURCHASE_AFTER_TOPUP_ENABLED - Загружается корзина из Redis
- Проверяется защита от дублирования (не было ли покупки за последние 60 секунд)
- Проверяется достаточность баланса
- Выполняется покупка, баланс списывается
- Подписка создается/продлевается, синхронизируется с RemnaWave
- Корзина удаляется
- Пользователю отправляется уведомление об автопокупке
Если баланса все еще не хватает
- Автопокупка не выполняется
- Корзина не удаляется (остается до истечения TTL)
- Пользователю отправляется сообщение с кнопкой Вернуться к корзине
Пересчет цены
Для тарифных корзин цена пересчитывается из БД в момент покупки, а не берется из сохраненных данных. Это защищает от ситуации, когда тариф подорожал между сохранением корзины и покупкой.Уведомления пользователю
При сохранении корзины
При автоматической покупке
В зависимости от типа:- Продление: “Подписка автоматически продлена на 30 дней”
- Новый тариф: “Подписка на 90 дней автоматически оформлена после пополнения баланса”
- Суточный: “Суточный тариф ‘Базовый’ активирован!”
- Устройства: “Устройства добавлены автоматически! +2 устройства”
- Трафик: “Трафик добавлен автоматически! +10 ГБ”
При недостатке средств (корзина осталась)
Ручное управление корзиной
Пользователь может:- Вернуться к корзине — кнопка в сообщении после пополнения (если автопокупка не сработала)
- Очистить корзину — кнопка
clear_saved_cartудаляет корзину из Redis
Источники корзины
Корзина сохраняется из трех интерфейсов:Настройка
Настройку
AUTO_PURCHASE_AFTER_TOPUP_ENABLED можно менять без перезапуска бота через админ-панель (категория настроек: Payment).
Для работы корзины необходим Redis. Без Redis параметры покупки не сохраняются.
Защита от дублирования
- Перед автопокупкой проверяется, не было ли транзакции типа
SUBSCRIPTION_PAYMENTза последние 60 секунд - Если была — корзина очищается без покупки (предотвращает двойное списание при быстрых платежах)
