🎉 Основные нововведения
⚡ Простая покупка подписки by @Gy9vin
- Быстрый путь к подписке — новый интерфейс «⚡ Простая покупка» в меню для моментальной покупки без дополнительных настроек
- Гибкая оплата — поддержка оплаты с баланса или через внешние методы (YooKassa, MulenPay, CryptoBot, Stars, Pal24, Wata)
- Новые системные настройки:
SIMPLE_SUBSCRIPTION_ENABLED— включение/отключение простой покупки (по умолчанию выключено)SIMPLE_SUBSCRIPTION_PERIOD_DAYS— период подписки в днях (по умолчанию 30)SIMPLE_SUBSCRIPTION_DEVICE_LIMIT— лимит устройств (по умолчанию 1)SIMPLE_SUBSCRIPTION_TRAFFIC_GB— лимит трафика в GB (по умолчанию 0 — безлимит)SIMPLE_SUBSCRIPTION_SQUAD_UUID— UUID сквада для подписки
- Автоматическая активация — подписка автоматически активируется при успешной оплате через платёжные системы
📋 Pending-подписки @Gy9vin
- Новый статус
PENDINGдля подписок, ожидающих активации после оплаты - CRUD-операции:
create_pending_subscription,activate_pending_subscription - Умная обработка — при успешной оплате pending-подписка автоматически активируется с корректными датами
- Поддержка во всех платёжных системах — YooKassa, MulenPay и другие
💳 Улучшения оплаты через СБП (YooKassa) by @Gy9vin
- QR-коды для оплаты — при создании платежа через СБП теперь автоматически генерируется и отправляется QR-код для быстрой оплаты
- Адаптивные инструкции — умная система отображения: если есть QR — отправляется изображение, если только ссылка — показывается кнопка перехода
- Улучшенный UX — информативные сообщения с суммой платежа, ID и пошаговыми инструкциями
- Резервные варианты — если данные для оплаты недоступны, пользователь получает понятную инструкцию по оплате через приложение банка
- Поддержка метаданных — обработка
payment_purposeдля различных типов платежей (пополнение баланса / покупка подписки)
🎨 Кастомизация MulenPay
- Настраиваемое название — новая переменная
MULENPAY_DISPLAY_NAMEдля изменения отображаемого имени платёжной системы - Единообразие — кастомное имя отображается во всех местах: UI, логах, уведомлениях и webhook-обработке
- Методы настроек:
settings.get_mulenpay_display_name()— получение простого текстаsettings.get_mulenpay_display_name_html()— получение HTML-форматированного текста
👨💼 Административные функции
- Массовое закрытие тикетов — кнопка «🔒 Закрыть все открытые» для быстрого закрытия всех открытых обращений с записью в аудит
- Прямые сообщения пользователям by @Gy9vin — возможность отправить сообщение любому пользователю из админ-панели через кнопку «✉️ Отправить сообщение»
- Обработка ошибок — корректная обработка случаев, когда пользователь заблокировал бота (Forbidden/BadRequest)
- FSM для отправки — новые состояния для ввода текста сообщения и подтверждения отправки
🔨 Технические улучшения
База данных
- Новый статус подписки
SubscriptionStatus.PENDING— требуется миграция для обновления enum - CRUD-операции для pending-подписок
- Связи с платежами — поддержка активации подписок через различные платёжные системы
Сервисы
app/services/subscription_purchase_service.py— новый сервис для создания заказов простой подписки- Улучшен
AdminNotificationService— корректная обработка данных платежа при отсутствии транзакции - Улучшен
UserService— добавление клавиатуры «Продлить подписку» в уведомлениях о пополнении - Исправлен
WataService— корректная сериализация времени с обработкой временных зон
Обработчики
app/handlers/simple_subscription/— новый модуль с полным набором обработчиков простой покупки- Рефакторинг
app/handlers/balance/yookassa.py— улучшенная обработка QR-кодов и confirmation data - Обновлены все платёжные обработчики для поддержки простой подписки
Платёжные системы
- YooKassa:
- Новый метод
_create_sbp_payment_with_confirmation_type()для гибкого создания платежей - Поддержка типов подтверждения:
qrиredirect - Безопасные проверки полей с
hasattr()для устойчивости к разным форматам ответов - Парсинг metadata для определения типа платежа
- Новый метод
- MulenPay:
- Гибкий парсинг статуса (
payment_status/status/paymentStatus) - Использование display name во всех текстах и логах
- Улучшенная обработка webhook с детальным логированием
- Гибкий парсинг статуса (
- Wata:
- Исправлена работа с datetime (корректная обработка ISO-строк и timezone)
WebAPI
app/webapi/routes/miniapp.py— endpoint возвращаетnameдля метода MulenPayapp/webapi/schemas/miniapp.py— расширена схемаMiniAppPaymentMethodполемname
Состояния FSM
- Добавлены состояния для простой покупки подписки
- Добавлены состояния для отправки сообщений пользователям из админки
🌍 Локализация и UI/UX
Интерфейс
- Новая кнопка «⚡ Простая покупка» в главном меню и в форме выбора периода
- Умное отображение кнопок оплаты для простой подписки
- QR-коды для СБП отправляются как изображения с подписью
- Адаптивные кнопки — «🔗 Перейти к оплате» или «📱 Оплатить в приложении банка» в зависимости от доступности данных
- Кнопка проверки статуса для отслеживания платежа
- MulenPay отображается с кастомным именем во всех интерфейсах
Статус подписки
- Переработана логика определения активной подписки
- Точный подсчёт оставшихся дней до окончания
- Корректное отображение всех статусов: active/trial/expired/disabled/pending
- Улучшенные тексты в меню с информацией о статусе
Админка
- Кнопка массового закрытия тикетов в списке
- Кнопка отправки сообщения в управлении пользователями
- Обновлены тексты настроек с учётом MulenPay display name
Новые переменные окружения
# Простая подписка
SIMPLE_SUBSCRIPTION_ENABLED=false
SIMPLE_SUBSCRIPTION_PERIOD_DAYS=30
SIMPLE_SUBSCRIPTION_DEVICE_LIMIT=1
SIMPLE_SUBSCRIPTION_TRAFFIC_GB=0
SIMPLE_SUBSCRIPTION_SQUAD_UUID=
# MulenPay кастомизация
MULENPAY_DISPLAY_NAME="Mulen Pay"⚠️ Изменения в ценах (проверьте перед деплоем!)
В .env.example были изменены следующие значения:
PRICE_30_DAYS— проверьте актуальное значениеPRICE_PER_DEVICE— изменено с5000→10000TRAFFIC_PACKAGES_CONFIG— обновлена конфигурация для безлимитного трафика (0)
Критично: Перед деплоем убедитесь, что эти изменения намеренные и соответствуют вашей ценовой политике!
Настройки по умолчанию
SIMPLE_SUBSCRIPTION_ENABLED=false— простая покупка выключенаMULENPAY_DISPLAY_NAME="Mulen Pay"— стандартное отображаемое имя
Рекомендации по деплою
- Обновить переменные окружения — добавить новые переменные из раздела выше
- Перезапустить все сервисы:
🐛 Исправления
- ✅ Устранён потенциальный
AttributeErrorпри отсутствии полейconfirmation.confirmation_data/confirmation.confirmation_urlв ответе YooKassa - ✅ Предотвращено двойное создание транзакций при повторных callback от MulenPay (улучшенное логирование)
- ✅ Исправлена сериализация datetime в Wata сервисе — корректная обработка timezone и ISO-строк
- ✅ Корректная обработка ошибок при отправке сообщений пользователям (
TelegramForbiddenError,TelegramBadRequest) - ✅ Graceful degradation при отсутствии библиотеки
qrcode— бот не падает, а логирует warning - ✅ Улучшена устойчивость к разным форматам ответов от платёжных систем (безопасные проверки полей)
- ✅ Исправлена обработка случаев, когда YooKassa не возвращает ни QR, ни URL — понятная ошибка пользователю
- ✅ Улучшена обработка ошибок lazy loading SQLAlchemy (корректное логирование stack trace)
🔜 Breaking Changes
Критические изменения
-
Логика проверки подписки изменилась: теперь проверяется
subscription.is_active/actual_statusвместо просто наличия записи subscription- Влияние: может измениться поведение UI и некоторых интеграций/скриптов
- Действие: проверьте все места, где проверяется наличие подписки
-
Новый статус PENDING — требуется миграция базы данных
- Влияние: если используется enum в БД, нужно обновить допустимые значения
- Действие: запустить миграцию Alembic для обновления enum
-
Изменения в webhook-обработке платежных систем
- YooKassa: новая обработка metadata и
payment_purpose - MulenPay: парсинг нескольких вариантов полей статуса
- Влияние: может потребоваться обновление внешних интеграций
- Действие: протестировать webhook-и от всех используемых платёжных систем
- YooKassa: новая обработка metadata и
Изменения API
-
YooKassa service:
- Новый метод
_create_sbp_payment_with_confirmation_type() create_sbp_payment()теперь возвращаетconfirmation_urlиqr_confirmation_data- Добавлены безопасные проверки
hasattr()для полей confirmation
- Новый метод
-
Payment handlers:
- Структура ответа от
create_yookassa_sbp_paymentизменилась (добавлено полеqr_confirmation_data)
- Структура ответа от
📚 Документация
Обновлено
.env.example— добавлены новые переменные окружения с описаниями- Inline-комментарии в коде для новых методов и сервисов
🔐 Безопасность
- Улучшена валидация webhook-подписей MulenPay с детальным логированием
- Добавлены защитные проверки от повторной обработки платежей
- Безопасная обработка отсутствующих полей в ответах платёжных систем
- Корректная обработка ошибок при работе с внешними API
Full Changelog: v2.5.2...v2.5.3