From ba8be7c3f9728dea9aa0d64a4f83ac4294f50fca Mon Sep 17 00:00:00 2001 From: machka-pasla Date: Thu, 4 Sep 2025 18:26:15 +0300 Subject: [PATCH] Standardize YooMoney wallet display across payment handlers and localization - Updated the display logic for YooMoney wallet in payment and subscription handlers to ensure consistent naming and avoid leaking sensitive account information. - Introduced a new localization string for wallet display, enhancing clarity in user-facing messages. - Refactored relevant sections to improve overall code maintainability and user experience. --- bot/handlers/user/payment.py | 6 ++++-- bot/handlers/user/subscription.py | 33 ++++++++++++++++++++++++------- locales/en.json | 1 + locales/ru.json | 1 + 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/bot/handlers/user/payment.py b/bot/handlers/user/payment.py index 3b4c083..5b5cbe8 100644 --- a/bot/handlers/user/payment.py +++ b/bot/handlers/user/payment.py @@ -151,7 +151,8 @@ async def process_successful_payment(session: AsyncSession, bot: Bot, display_network = card.get("card_type") or title or "Card" display_last4 = card.get("last4") elif (pm_type or "").lower() in {"yoo_money", "yoomoney", "yoo-money", "wallet"}: - display_network = title or "YooMoney" + # Normalize wallet display name to avoid leaking full account from title + display_network = "YooMoney" if isinstance(account_number, str) and len(account_number) >= 4: display_last4 = account_number[-4:] else: @@ -500,7 +501,8 @@ async def yookassa_webhook_route(request: web.Request): display_network = card.get("card_type") or title or "Card" display_last4 = card.get("last4") elif (pm_type or "").lower() in {"yoo_money", "yoomoney", "yoo-money", "wallet"}: - display_network = title or "YooMoney" + # Normalize wallet display name to avoid leaking full account from title + display_network = "YooMoney" if isinstance(account_number, str) and len(account_number) >= 4: display_last4 = account_number[-4:] else: diff --git a/bot/handlers/user/subscription.py b/bot/handlers/user/subscription.py index e0bac3e..aa9b4d3 100644 --- a/bot/handlers/user/subscription.py +++ b/bot/handlers/user/subscription.py @@ -321,7 +321,8 @@ async def pay_yk_callback_handler( display_network = card.get('card_type') or title or 'Card' display_last4 = card.get('last4') elif (pm_type or '').lower() in {"yoo_money", "yoomoney", "yoo-money", "wallet"}: - display_network = title or 'YooMoney' + # Normalize wallet display name to avoid leaking full account from title + display_network = 'YooMoney' display_last4 = account_number[-4:] if isinstance(account_number, str) and len(account_number) >= 4 else None else: display_network = title or (pm_type.upper() if pm_type else 'Payment method') @@ -618,7 +619,10 @@ async def payment_methods_manage(callback: types.CallbackQuery, settings: Settin cards: List[tuple] = [] for m in methods: if m.card_last4: - title = get_text("payment_method_card_title", network=m.card_network or "Card", last4=m.card_last4) + if (m.card_network or '').lower() in {"yoomoney", "yoo money", "yoo-money", "yoomoney wallet", "yoomoney кошелек", "yoomoney кошелёк"} or (m.card_network or '') == "YooMoney": + title = get_text("payment_method_wallet_title", last4=m.card_last4) + else: + title = get_text("payment_method_card_title", network=m.card_network or "Card", last4=m.card_last4) else: title = get_text("payment_method_generic_title", network=m.card_network or "Payment method") cards.append((str(m.method_id), title if not m.is_default else f"⭐ {title}")) @@ -700,7 +704,10 @@ async def payment_method_delete(callback: types.CallbackQuery, settings: Setting cards = [] for m in methods: if m.card_last4: - title = _("payment_method_card_title", network=m.card_network or "Card", last4=m.card_last4) + if (m.card_network or '').lower() in {"yoomoney", "yoo money", "yoo-money", "yoomoney wallet", "yoomoney кошелек", "yoomoney кошелёк"} or (m.card_network or '') == "YooMoney": + title = _("payment_method_wallet_title", last4=m.card_last4) + else: + title = _("payment_method_card_title", network=m.card_network or "Card", last4=m.card_last4) else: title = _("payment_method_generic_title", network=m.card_network or "Payment method") cards.append((str(m.method_id), title if not m.is_default else f"⭐ {title}")) @@ -733,7 +740,10 @@ async def payment_method_delete(callback: types.CallbackQuery, settings: Setting cards = [] for m in methods: if m.card_last4: - title = _("payment_method_card_title", network=m.card_network or "Card", last4=m.card_last4) + if (m.card_network or '').lower() in {"yoomoney", "yoo money", "yoo-money", "yoomoney wallet", "yoomoney кошелек", "yoomoney кошелёк"} or (m.card_network or '') == "YooMoney": + title = _("payment_method_wallet_title", last4=m.card_last4) + else: + title = _("payment_method_card_title", network=m.card_network or "Card", last4=m.card_last4) else: title = _("payment_method_generic_title", network=m.card_network or "Payment method") cards.append((str(m.method_id), title if not m.is_default else f"⭐ {title}")) @@ -766,7 +776,10 @@ async def payment_method_view(callback: types.CallbackQuery, settings: Settings, # Map: sel = next((m for m in methods if str(m.method_id) == pm_id or m.provider_payment_method_id == pm_id), methods[0]) if sel.card_last4: - title = _("payment_method_card_title", network=sel.card_network or "Card", last4=sel.card_last4) + if (sel.card_network or '').lower() in {"yoomoney", "yoo money", "yoo-money", "yoomoney wallet", "yoomoney кошелек", "yoomoney кошелёк"} or (sel.card_network or '') == "YooMoney": + title = _("payment_method_wallet_title", last4=sel.card_last4) + else: + title = _("payment_method_card_title", network=sel.card_network or "Card", last4=sel.card_last4) else: title = _("payment_method_generic_title", network=sel.card_network or "Payment method") added_at = sel.created_at.strftime('%Y-%m-%d') if getattr(sel, 'created_at', None) else "—" @@ -817,7 +830,10 @@ async def payment_method_view(callback: types.CallbackQuery, settings: Settings, except Exception: pass if billing.card_last4: - title = _("payment_method_card_title", network=billing.card_network or "Card", last4=billing.card_last4) + if (billing.card_network or '').lower() in {"yoomoney", "yoo money", "yoo-money", "yoomoney wallet", "yoomoney кошелек", "yoomoney кошелёк"} or (billing.card_network or '') == "YooMoney": + title = _("payment_method_wallet_title", last4=billing.card_last4) + else: + title = _("payment_method_card_title", network=billing.card_network or "Card", last4=billing.card_last4) else: title = _("payment_method_generic_title", network=billing.card_network or "Payment method") details = f"{title}\n{_('payment_method_added_at', date=added_at)}\n{_('payment_method_last_tx', date=last_tx)}" @@ -876,7 +892,10 @@ async def payment_methods_list(callback: types.CallbackQuery, settings: Settings methods = await list_user_payment_methods(session, callback.from_user.id) for m in methods: if m.card_last4: - title = get_text("payment_method_card_title", network=m.card_network or "Card", last4=m.card_last4) + if (m.card_network or '').lower() in {"yoomoney", "yoo money", "yoo-money", "yoomoney wallet", "yoomoney кошелек", "yoomoney кошелёк"} or (m.card_network or '') == "YooMoney": + title = get_text("payment_method_wallet_title", last4=m.card_last4) + else: + title = get_text("payment_method_card_title", network=m.card_network or "Card", last4=m.card_last4) else: title = get_text("payment_method_generic_title", network=m.card_network or "Payment method") cards.append((str(m.method_id), title if not m.is_default else f"⭐ {title}")) diff --git a/locales/en.json b/locales/en.json index b66d666..bf67424 100644 --- a/locales/en.json +++ b/locales/en.json @@ -386,6 +386,7 @@ "payment_method_delete_confirm": "Remove saved payment method?", "payment_method_card_title": "💳 {network} ••••{last4}", "payment_method_generic_title": "💳 {network}", + "payment_method_wallet_title": "💼 YooMoney wallet ••••{last4}", "payment_method_added_at": "Added: {date}", "payment_method_last_tx": "Last transaction: {date}", "payment_method_tx_history_title": "📜 Transactions history", diff --git a/locales/ru.json b/locales/ru.json index 199436d..12ee215 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -385,6 +385,7 @@ "payment_method_delete_confirm": "Удалить сохранённый способ оплаты?", "payment_method_card_title": "💳 {network} ••••{last4}", "payment_method_generic_title": "💳 {network}", + "payment_method_wallet_title": "💼 Кошелёк YooMoney ••••{last4}", "payment_method_added_at": "Добавлена: {date}", "payment_method_last_tx": "Последняя операция: {date}", "payment_method_tx_history_title": "📜 История операций",