diff --git a/bot/handlers/user/payment.py b/bot/handlers/user/payment.py index 2249a3e..cc6f5e4 100644 --- a/bot/handlers/user/payment.py +++ b/bot/handlers/user/payment.py @@ -21,6 +21,7 @@ from bot.services.yookassa_service import YooKassaService from bot.middlewares.i18n import JsonI18n from config.settings import Settings from bot.services.notification_service import notify_admin_new_payment +from bot.keyboards.inline.user_keyboards import get_connect_and_main_keyboard payment_processing_lock = asyncio.Lock() @@ -176,6 +177,30 @@ async def process_successful_payment(session: AsyncSession, bot: Bot, f"Failed to send final payment success message to user {user_id}: {e_notify}" ) + config_link = activation_details.get("subscription_url") or _( + "config_link_not_available" + ) + details_message = _( + "payment_successful_full", + end_date=final_end_date_for_user.strftime("%d.%m.%Y %H:%M:%S"), + config_link=config_link, + ) + details_markup = get_connect_and_main_keyboard( + user_lang, i18n, settings, config_link + ) + try: + await bot.send_message( + user_id, + details_message, + reply_markup=details_markup, + parse_mode="HTML", + disable_web_page_preview=True, + ) + except Exception as e_notify: + logging.error( + f"Failed to send payment details message to user {user_id}: {e_notify}" + ) + await notify_admin_new_payment( bot, settings, diff --git a/bot/keyboards/inline/user_keyboards.py b/bot/keyboards/inline/user_keyboards.py index eaec5a8..2fb1953 100644 --- a/bot/keyboards/inline/user_keyboards.py +++ b/bot/keyboards/inline/user_keyboards.py @@ -185,3 +185,41 @@ def get_user_banned_keyboard(support_link: Optional[str], lang: str, builder = InlineKeyboardBuilder() builder.button(text=_(key="menu_support_button"), url=support_link) return builder.as_markup() + + +def get_connect_and_main_keyboard( + lang: str, + i18n_instance, + settings: Settings, + config_link: Optional[str]) -> InlineKeyboardMarkup: + """Keyboard with a connect button and a back to main menu button.""" + _ = lambda key, **kwargs: i18n_instance.gettext(lang, key, **kwargs) + builder = InlineKeyboardBuilder() + + if settings.SUBSCRIPTION_MINI_APP_URL: + builder.row( + InlineKeyboardButton( + text=_("connect_button"), + web_app=WebAppInfo(url=settings.SUBSCRIPTION_MINI_APP_URL), + ) + ) + elif config_link: + builder.row( + InlineKeyboardButton(text=_("connect_button"), url=config_link) + ) + else: + builder.row( + InlineKeyboardButton( + text=_("connect_button"), + callback_data="main_action:my_subscription", + ) + ) + + builder.row( + InlineKeyboardButton( + text=_("back_to_main_menu_button"), + callback_data="main_action:back_to_main", + ) + ) + + return builder.as_markup() diff --git a/locales/en.json b/locales/en.json index de1a5ad..1edcb7b 100644 --- a/locales/en.json +++ b/locales/en.json @@ -27,6 +27,7 @@ "pay_with_yookassa_button": "💳 YooKassa", "pay_with_tribute_button": "❤️ Tribute", "pay_with_stars_button": "🌟 Telegram Stars", + "connect_button": "🔗 Connect", "cancel_button": "❌ Cancel", "payment_description_subscription": "Subscription payment for {months} mo.", "payment_service_unavailable": "Payment service temporarily unavailable. Please try again later.", @@ -39,6 +40,7 @@ "payment_successful_with_promo": "✅ Payment successful!\nYour {months}-month subscription (with promo bonus +{bonus_days} days) is active until {end_date}.", "payment_successful_with_referral_bonus": "✅ Payment successful!\nYour {months}-month subscription (base end date: {base_end_date}) has been extended by {bonus_days} bonus days for referral from {inviter_name} and is now active until {final_end_date}.", "payment_successful_error_details": "✅ Payment succeeded, but an error occurred displaying details. Your subscription is active. Contact support if anything is wrong.", + "payment_successful_full": "Thank you for your purchase!\n\nSubscription paid until: {end_date}\n\nConnection key:\n{config_link}\n\nTo connect, open the link and follow the instructions 👇", "payment_failed": "❌ Payment failed or was cancelled. Please try again or contact support.", "error_processing_your_payment": "An error occurred processing your payment after success. Please contact support with the details.", diff --git a/locales/ru.json b/locales/ru.json index fac70f8..a0a8877 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -27,6 +27,7 @@ "pay_with_yookassa_button": "💳 ЮKassa", "pay_with_tribute_button": "❤️ Tribute", "pay_with_stars_button": "🌟 Звезды Telegram", + "connect_button": "🔗 Подключиться", "cancel_button": "❌ Отмена", "payment_description_subscription": "Оплата подписки на {months} мес.", "payment_service_unavailable": "Платежный сервис временно недоступен. Пожалуйста, попробуйте позже.", @@ -39,6 +40,7 @@ "payment_successful_with_promo": "✅ Оплата прошла успешно!\nВаша подписка на {months} мес. (с учетом промокода на +{bonus_days} дней) активна до {end_date}.", "payment_successful_with_referral_bonus": "✅ Оплата прошла успешно!\nВаша подписка на {months} мес. (базовая дата окончания: {base_end_date}) продлена на {bonus_days} бонусных дней за приглашение от {inviter_name} и теперь активна до {final_end_date}.", "payment_successful_error_details": "✅ Оплата прошла успешно, но возникла ошибка при отображении деталей. Ваша подписка активна. Свяжитесь с поддержкой, если что-то не так.", + "payment_successful_full": "Спасибо за покупку!\n\nПодписка оплачена до: {end_date}\n\nКлюч подключения:\n{config_link}\n\nЧтобы подключиться, перейдите по ссылке и следуйте инструкции 👇", "payment_failed": "❌ Оплата не удалась или была отменена. Пожалуйста, попробуйте еще раз или свяжитесь с поддержкой.", "error_processing_your_payment": "Произошла ошибка при обработке вашего платежа после его успеха. Пожалуйста, свяжитесь с поддержкой, указав детали.",