diff --git a/app/handlers/admin/bot_configuration.py b/app/handlers/admin/bot_configuration.py index c580be9e..f01744a9 100644 --- a/app/handlers/admin/bot_configuration.py +++ b/app/handlers/admin/bot_configuration.py @@ -862,7 +862,7 @@ async def test_payment_provider( await _refresh_markup() return - payment_url = payment_result.get("link_url") or payment_result.get("link_page_url") + payment_url = payment_result.get("link_page_url") or payment_result.get("link_url") message_text = ( "🧪 Тестовый платеж PayPalych\n\n" f"💰 Сумма: {texts.format_price(amount_kopeks)}\n" @@ -872,7 +872,7 @@ async def test_payment_provider( inline_keyboard=[ [ types.InlineKeyboardButton( - text="💳 Перейти к оплате", + text="🏦 Перейти к оплате (СБП)", url=payment_url, ) ], diff --git a/app/handlers/balance.py b/app/handlers/balance.py index ab9f205f..e6f0b832 100644 --- a/app/handlers/balance.py +++ b/app/handlers/balance.py @@ -386,9 +386,9 @@ async def start_pal24_payment( message_text = texts.t( "PAL24_TOPUP_PROMPT", ( - "💳 Оплата через PayPalych\n\n" + "🏦 Оплата через PayPalych (СБП)\n\n" "Введите сумму для пополнения от 100 до 1 000 000 ₽.\n" - "Оплата проходит через защищенную платформу PayPalych." + "Оплата проходит через систему быстрых платежей PayPalych." ), ) @@ -1002,7 +1002,9 @@ async def process_pal24_payment_amount( language=db_user.language, ) - if not payment_result or not payment_result.get("link_url"): + if not payment_result or not ( + payment_result.get("link_url") or payment_result.get("link_page_url") + ): await message.answer( texts.t( "PAL24_PAYMENT_ERROR", @@ -1012,7 +1014,10 @@ async def process_pal24_payment_amount( await state.clear() return - link_url = payment_result.get("link_url") + payment_url = ( + payment_result.get("link_page_url") + or payment_result.get("link_url") + ) bill_id = payment_result.get("bill_id") local_payment_id = payment_result.get("local_payment_id") @@ -1020,8 +1025,8 @@ async def process_pal24_payment_amount( inline_keyboard=[ [ types.InlineKeyboardButton( - text=texts.t("PAL24_PAY_BUTTON", "💳 Оплатить через PayPalych"), - url=link_url, + text=texts.t("PAL24_PAY_BUTTON", "🏦 Оплатить через PayPalych (СБП)"), + url=payment_url, ) ], [ @@ -1037,11 +1042,11 @@ async def process_pal24_payment_amount( message_template = texts.t( "PAL24_PAYMENT_INSTRUCTIONS", ( - "💳 Оплата через PayPalych\n\n" + "🏦 Оплата через PayPalych (СБП)\n\n" "💰 Сумма: {amount}\n" "🆔 ID счета: {bill_id}\n\n" "📱 Инструкция:\n" - "1. Нажмите кнопку ‘Оплатить через PayPalych’\n" + "1. Нажмите кнопку ‘Оплатить через PayPalych (СБП)’\n" "2. Следуйте подсказкам платежной системы\n" "3. Подтвердите перевод\n" "4. Средства зачислятся автоматически\n\n" @@ -1226,8 +1231,10 @@ async def check_pal24_payment_status( emoji, status_text = status_labels.get(payment.status, ("❓", "Неизвестно")) + payment_link = payment.link_page_url or payment.link_url + message_lines = [ - "💳 Статус платежа PayPalych:\n\n", + "🏦 Статус платежа PayPalych (СБП):\n\n", f"🆔 ID счета: {payment.bill_id}\n", f"💰 Сумма: {settings.format_price(payment.amount_kopeks)}\n", f"📊 Статус: {emoji} {status_text}\n", @@ -1238,8 +1245,8 @@ async def check_pal24_payment_status( message_lines.append("\n✅ Платеж успешно завершен! Средства уже на балансе.") elif payment.status in {"NEW", "PROCESS"}: message_lines.append("\n⏳ Платеж еще не завершен. Оплатите счет и проверьте статус позже.") - if payment.link_url: - message_lines.append(f"\n🔗 Ссылка на оплату: {payment.link_url}") + if payment_link: + message_lines.append(f"\n🔗 Ссылка на оплату: {payment_link}") elif payment.status in {"FAIL", "UNDERPAID", "OVERPAID"}: message_lines.append( f"\n❌ Платеж не завершен корректно. Обратитесь в {settings.get_support_contact_display()}" @@ -1528,6 +1535,12 @@ async def handle_quick_amount_selection( await process_mulenpay_payment_amount( callback.message, db_user, db, amount_kopeks, state ) + elif payment_method == "pal24": + from app.database.database import AsyncSessionLocal + async with AsyncSessionLocal() as db: + await process_pal24_payment_amount( + callback.message, db_user, db, amount_kopeks, state + ) else: await callback.answer("❌ Неизвестный способ оплаты", show_alert=True) return diff --git a/app/keyboards/inline.py b/app/keyboards/inline.py index 737b58b2..6037e941 100644 --- a/app/keyboards/inline.py +++ b/app/keyboards/inline.py @@ -832,7 +832,7 @@ def get_payment_methods_keyboard(amount_kopeks: int, language: str = DEFAULT_LAN if settings.is_pal24_enabled(): keyboard.append([ InlineKeyboardButton( - text=texts.t("PAYMENT_CARD_PAL24", "💳 Банковская карта (PayPalych)"), + text=texts.t("PAYMENT_CARD_PAL24", "🏦 СБП (PayPalych)"), callback_data=_build_callback("pal24") ) ]) diff --git a/app/services/admin_notification_service.py b/app/services/admin_notification_service.py index d5543e44..19fb035c 100644 --- a/app/services/admin_notification_service.py +++ b/app/services/admin_notification_service.py @@ -358,7 +358,7 @@ class AdminNotificationService: 'yookassa': '💳 YooKassa (карта)', 'tribute': '💎 Tribute (карта)', 'mulenpay': '💳 Mulen Pay (карта)', - 'pal24': '💳 PayPalych (карта)', + 'pal24': '🏦 PayPalych (СБП)', 'manual': '🛠️ Вручную (админ)', 'balance': '💰 С баланса' } diff --git a/app/services/pal24_service.py b/app/services/pal24_service.py index a4f72047..26b7e799 100644 --- a/app/services/pal24_service.py +++ b/app/services/pal24_service.py @@ -37,6 +37,7 @@ class Pal24Service: ttl_seconds: Optional[int] = None, custom_payload: Optional[Dict[str, Any]] = None, payer_email: Optional[str] = None, + payment_method: Optional[str] = None, ) -> Dict[str, Any]: if not self.is_configured: raise Pal24APIError("Pal24 service is not configured") @@ -49,6 +50,8 @@ class Pal24Service: if payer_email: extra_payload["payer_email"] = payer_email + if payment_method: + extra_payload["payment_method"] = payment_method filtered_payload = {k: v for k, v in extra_payload.items() if v not in (None, {})} diff --git a/app/services/payment_service.py b/app/services/payment_service.py index 63d07597..c615e8cc 100644 --- a/app/services/payment_service.py +++ b/app/services/payment_service.py @@ -857,6 +857,7 @@ class PaymentService: ttl_seconds=ttl_seconds, custom_payload=custom_payload, payer_email=payer_email, + payment_method="SBP", ) except Pal24APIError as error: logger.error("Ошибка Pal24 API при создании счета: %s", error) @@ -873,6 +874,7 @@ class PaymentService: link_url = response.get("link_url") link_page_url = response.get("link_page_url") + primary_link = link_page_url or link_url payment = await create_pal24_payment( db, @@ -884,8 +886,8 @@ class PaymentService: status=response.get("status", "NEW"), type_=response.get("type", "normal"), currency=response.get("currency", "RUB"), - link_url=link_url, - link_page_url=link_page_url, + link_url=primary_link, + link_page_url=link_page_url or link_url, ttl=ttl_seconds, metadata={ "raw_response": response, @@ -896,8 +898,8 @@ class PaymentService: payment_info = { "bill_id": bill_id, "order_id": order_id, - "link_url": link_url or link_page_url, - "link_page_url": link_page_url, + "link_url": primary_link, + "link_page_url": link_page_url or link_url, "local_payment_id": payment.id, "amount_kopeks": amount_kopeks, } diff --git a/app/utils/payment_utils.py b/app/utils/payment_utils.py index 83b704b1..3b598f73 100644 --- a/app/utils/payment_utils.py +++ b/app/utils/payment_utils.py @@ -48,8 +48,8 @@ def get_available_payment_methods() -> List[Dict[str, str]]: if settings.is_pal24_enabled(): methods.append({ "id": "pal24", - "name": "Банковская карта", - "icon": "💳", + "name": "СБП", + "icon": "🏦", "description": "через PayPalych", "callback": "topup_pal24" }) diff --git a/locales/en.json b/locales/en.json index bdabdeab..ef640f62 100644 --- a/locales/en.json +++ b/locales/en.json @@ -69,7 +69,7 @@ "PAYMENTS_TEMPORARILY_UNAVAILABLE": "⚠️ Payment methods are temporarily unavailable", "PAYMENT_CARD_TRIBUTE": "💳 Bank card (Tribute)", "PAYMENT_CARD_MULENPAY": "💳 Bank card (Mulen Pay)", - "PAYMENT_CARD_PAL24": "💳 Bank card (PayPalych)", + "PAYMENT_CARD_PAL24": "🏦 SBP (PayPalych)", "PAYMENT_CARD_YOOKASSA": "💳 Bank card (YooKassa)", "PAYMENT_CRYPTOBOT": "🪙 Cryptocurrency (CryptoBot)", "PAYMENT_SBP_YOOKASSA": "🏦 Pay via SBP (YooKassa)", @@ -81,10 +81,10 @@ "MULENPAY_PAYMENT_ERROR": "❌ Failed to create Mulen Pay payment. Please try again later or contact support.", "MULENPAY_PAY_BUTTON": "💳 Pay with Mulen Pay", "MULENPAY_PAYMENT_INSTRUCTIONS": "💳 Mulen Pay payment\n\n💰 Amount: {amount}\n🆔 Payment ID: {payment_id}\n\n📱 How to pay:\n1. Press ‘Pay with Mulen Pay’\n2. Follow the instructions on the payment page\n3. Confirm the transfer\n4. Funds will be credited automatically\n\n❓ Need help? Contact {support}", - "PAL24_TOPUP_PROMPT": "💳 PayPalych payment\n\nEnter an amount between 100 and 1,000,000 ₽.\nThe payment is processed by the secure PayPalych platform.", + "PAL24_TOPUP_PROMPT": "🏦 PayPalych (SBP) payment\n\nEnter an amount between 100 and 1,000,000 ₽.\nThe payment is processed via the PayPalych Faster Payments System.", "PAL24_PAYMENT_ERROR": "❌ Failed to create a PayPalych payment. Please try again later or contact support.", - "PAL24_PAY_BUTTON": "💳 Pay with PayPalych", - "PAL24_PAYMENT_INSTRUCTIONS": "💳 PayPalych payment\n\n💰 Amount: {amount}\n🆔 Invoice ID: {bill_id}\n\n📱 How to pay:\n1. Press ‘Pay with PayPalych’\n2. Follow the system prompts\n3. Confirm the transfer\n4. Funds will be credited automatically\n\n❓ Need help? Contact {support}", + "PAL24_PAY_BUTTON": "🏦 Pay with PayPalych (SBP)", + "PAL24_PAYMENT_INSTRUCTIONS": "🏦 PayPalych (SBP) payment\n\n💰 Amount: {amount}\n🆔 Invoice ID: {bill_id}\n\n📱 How to pay:\n1. Press ‘Pay with PayPalych (SBP)’\n2. Follow the system prompts\n3. Confirm the transfer\n4. Funds will be credited automatically\n\n❓ Need help? Contact {support}", "PENDING_CANCEL_BUTTON": "⌛ Cancel", "POST_REGISTRATION_TRIAL_BUTTON": "🚀 Activate free trial 🚀", "REFERRAL_ANALYTICS_BUTTON": "📊 Analytics", @@ -507,8 +507,8 @@ "PAYMENT_METHOD_TRIBUTE_DESCRIPTION": "via Tribute", "PAYMENT_METHOD_MULENPAY_NAME": "💳 Bank card (Mulen Pay)", "PAYMENT_METHOD_MULENPAY_DESCRIPTION": "via Mulen Pay", - "PAYMENT_METHOD_PAL24_NAME": "💳 Bank card (PayPalych)", - "PAYMENT_METHOD_PAL24_DESCRIPTION": "via PayPalych", + "PAYMENT_METHOD_PAL24_NAME": "🏦 SBP (PayPalych)", + "PAYMENT_METHOD_PAL24_DESCRIPTION": "via Faster Payments System", "PAYMENT_METHOD_CRYPTOBOT_NAME": "🪙 Cryptocurrency", "PAYMENT_METHOD_CRYPTOBOT_DESCRIPTION": "via CryptoBot", "PAYMENT_METHOD_SUPPORT_NAME": "🛠️ Support team", diff --git a/locales/ru.json b/locales/ru.json index 290c1fbc..e1ce4224 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -259,7 +259,7 @@ "PAYMENTS_TEMPORARILY_UNAVAILABLE": "⚠️ Способы оплаты временно недоступны", "PAYMENT_CARD_TRIBUTE": "💳 Банковская карта (Tribute)", "PAYMENT_CARD_MULENPAY": "💳 Банковская карта (Mulen Pay)", - "PAYMENT_CARD_PAL24": "💳 Банковская карта (PayPalych)", + "PAYMENT_CARD_PAL24": "🏦 СБП (PayPalych)", "PAYMENT_CARD_YOOKASSA": "💳 Банковская карта (YooKassa)", "PAYMENT_CRYPTOBOT": "🪙 Криптовалюта (CryptoBot)", "PAYMENT_SBP_YOOKASSA": "🏬 Оплатить по СБП (YooKassa)", @@ -271,10 +271,10 @@ "MULENPAY_PAYMENT_ERROR": "❌ Ошибка создания платежа Mulen Pay. Попробуйте позже или обратитесь в поддержку.", "MULENPAY_PAY_BUTTON": "💳 Оплатить через Mulen Pay", "MULENPAY_PAYMENT_INSTRUCTIONS": "💳 Оплата через Mulen Pay\n\n💰 Сумма: {amount}\n🆔 ID платежа: {payment_id}\n\n📱 Инструкция:\n1. Нажмите кнопку ‘Оплатить через Mulen Pay’\n2. Следуйте подсказкам платежной системы\n3. Подтвердите перевод\n4. Средства зачислятся автоматически\n\n❓ Если возникнут проблемы, обратитесь в {support}", - "PAL24_TOPUP_PROMPT": "💳 Оплата через PayPalych\n\nВведите сумму для пополнения от 100 до 1 000 000 ₽.\nОплата проходит через защищенную платформу PayPalych.", + "PAL24_TOPUP_PROMPT": "🏦 Оплата через PayPalych (СБП)\n\nВведите сумму для пополнения от 100 до 1 000 000 ₽.\nОплата проходит через систему быстрых платежей PayPalych.", "PAL24_PAYMENT_ERROR": "❌ Ошибка создания платежа PayPalych. Попробуйте позже или обратитесь в поддержку.", - "PAL24_PAY_BUTTON": "💳 Оплатить через PayPalych", - "PAL24_PAYMENT_INSTRUCTIONS": "💳 Оплата через PayPalych\n\n💰 Сумма: {amount}\n🆔 ID счета: {bill_id}\n\n📱 Инструкция:\n1. Нажмите кнопку ‘Оплатить через PayPalych’\n2. Следуйте подсказкам платежной системы\n3. Подтвердите перевод\n4. Средства зачислятся автоматически\n\n❓ Если возникнут проблемы, обратитесь в {support}", + "PAL24_PAY_BUTTON": "🏦 Оплатить через PayPalych (СБП)", + "PAL24_PAYMENT_INSTRUCTIONS": "🏦 Оплата через PayPalych (СБП)\n\n💰 Сумма: {amount}\n🆔 ID счета: {bill_id}\n\n📱 Инструкция:\n1. Нажмите кнопку ‘Оплатить через PayPalych (СБП)’\n2. Следуйте подсказкам платежной системы\n3. Подтвердите перевод\n4. Средства зачислятся автоматически\n\n❓ Если возникнут проблемы, обратитесь в {support}", "PENDING_CANCEL_BUTTON": "⌛ Отмена", "PERIOD_14_DAYS": "📅 14 дней - {settings.format_price(settings.PRICE_14_DAYS)}", "PERIOD_180_DAYS": "📅 180 дней - {settings.format_price(settings.PRICE_180_DAYS)}", @@ -507,8 +507,8 @@ "PAYMENT_METHOD_TRIBUTE_DESCRIPTION": "через Tribute", "PAYMENT_METHOD_MULENPAY_NAME": "💳 Банковская карта (Mulen Pay)", "PAYMENT_METHOD_MULENPAY_DESCRIPTION": "через Mulen Pay", - "PAYMENT_METHOD_PAL24_NAME": "💳 Банковская карта (PayPalych)", - "PAYMENT_METHOD_PAL24_DESCRIPTION": "через PayPalych", + "PAYMENT_METHOD_PAL24_NAME": "🏦 СБП (PayPalych)", + "PAYMENT_METHOD_PAL24_DESCRIPTION": "через систему быстрых платежей", "PAYMENT_METHOD_CRYPTOBOT_NAME": "🪙 Криптовалюта", "PAYMENT_METHOD_CRYPTOBOT_DESCRIPTION": "через CryptoBot", "PAYMENT_METHOD_SUPPORT_NAME": "🛠️ Через поддержку",