github BEDOLAGA-DEV/remnawave-bedolaga-telegram-bot v2.5.3

latest releases: v3.17.0, v3.16.3, v3.16.2...
4 months ago

🎉 Основные нововведения

⚡ Простая покупка подписки 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 для метода MulenPay
  • app/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 — изменено с 500010000
  • TRAFFIC_PACKAGES_CONFIG — обновлена конфигурация для безлимитного трафика (0)

Критично: Перед деплоем убедитесь, что эти изменения намеренные и соответствуют вашей ценовой политике!

Настройки по умолчанию

  • SIMPLE_SUBSCRIPTION_ENABLED=false — простая покупка выключена
  • MULENPAY_DISPLAY_NAME="Mulen Pay" — стандартное отображаемое имя

Рекомендации по деплою

  1. Обновить переменные окружения — добавить новые переменные из раздела выше
  2. Перезапустить все сервисы:

🐛 Исправления

  • ✅ Устранён потенциальный 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-и от всех используемых платёжных систем

Изменения 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

Don't miss a new remnawave-bedolaga-telegram-bot release

NewReleases is sending notifications on new releases.