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": "🛠️ Через поддержку",