fix: encode payment status in provider return URLs and wire failed_url

- Add &status=success/failed to cabinet return URLs for instant UX feedback
  without needing API auth in external browser
- Platega: pass cabinet_failed_url (was hardcoded to server URL)
- Heleket: add success_url param, pass cabinet_success_url for url_success
- WATA: add failed_url param, pass cabinet_failed_url to failRedirectUrl
- CloudPayments: add failed_url param, pass cabinet_failed_url
- Strip trailing slash from CABINET_URL for safety
This commit is contained in:
Fringg
2026-03-09 04:59:56 +03:00
parent 7a9264b173
commit 275f249bbd
5 changed files with 20 additions and 7 deletions
+10 -4
View File
@@ -349,7 +349,9 @@ async def create_topup(
amount_rubles = request.amount_kopeks / 100
payment_url = None
payment_id = None
cabinet_return_url = f'{settings.CABINET_URL}/balance/top-up/result?method={request.payment_method}'
cabinet_return_url = f'{settings.CABINET_URL.rstrip("/")}/balance/top-up/result?method={request.payment_method}'
cabinet_success_url = f'{cabinet_return_url}&status=success'
cabinet_failed_url = f'{cabinet_return_url}&status=failed'
try:
if request.payment_method == 'yookassa':
@@ -493,7 +495,8 @@ async def create_topup(
),
language=getattr(user, 'language', None) or settings.DEFAULT_LANGUAGE,
payment_method_code=method_code,
return_url=cabinet_return_url,
return_url=cabinet_success_url,
failed_url=cabinet_failed_url,
)
if result and result.get('redirect_url'):
@@ -520,6 +523,7 @@ async def create_topup(
description=settings.get_balance_payment_description(request.amount_kopeks),
language=getattr(user, 'language', None) or settings.DEFAULT_LANGUAGE,
return_url=cabinet_return_url,
success_url=cabinet_success_url,
)
if result and result.get('payment_url'):
@@ -617,7 +621,8 @@ async def create_topup(
amount_kopeks=request.amount_kopeks,
description=settings.get_balance_payment_description(request.amount_kopeks),
language=getattr(user, 'language', None) or settings.DEFAULT_LANGUAGE,
return_url=cabinet_return_url,
return_url=cabinet_success_url,
failed_url=cabinet_failed_url,
)
if result and result.get('payment_url'):
@@ -644,7 +649,8 @@ async def create_topup(
description=settings.get_balance_payment_description(request.amount_kopeks),
telegram_id=user.telegram_id,
language=getattr(user, 'language', None) or settings.DEFAULT_LANGUAGE,
return_url=cabinet_return_url,
return_url=cabinet_success_url,
failed_url=cabinet_failed_url,
)
if result and result.get('payment_url'):
+2
View File
@@ -29,6 +29,7 @@ class CloudPaymentsPaymentMixin:
language: str | None = None,
email: str | None = None,
return_url: str | None = None,
failed_url: str | None = None,
) -> dict[str, Any] | None:
"""
Create a CloudPayments payment and return payment link info.
@@ -80,6 +81,7 @@ class CloudPaymentsPaymentMixin:
description=description,
email=email,
success_redirect_url=return_url,
fail_redirect_url=failed_url,
)
except CloudPaymentsAPIError as error:
logger.error('Ошибка создания CloudPayments платежа', error=error)
+2 -1
View File
@@ -28,6 +28,7 @@ class HeleketPaymentMixin:
*,
language: str | None = None,
return_url: str | None = None,
success_url: str | None = None,
) -> dict[str, Any] | None:
if not getattr(self, 'heleket_service', None):
logger.error('Heleket сервис не инициализирован')
@@ -72,7 +73,7 @@ class HeleketPaymentMixin:
payload['url_callback'] = callback_url
effective_return = return_url or settings.HELEKET_RETURN_URL
effective_success = return_url or settings.HELEKET_SUCCESS_URL
effective_success = success_url or return_url or settings.HELEKET_SUCCESS_URL
if effective_return:
payload['url_return'] = effective_return
if effective_success:
+4 -2
View File
@@ -33,6 +33,7 @@ class PlategaPaymentMixin:
language: str,
payment_method_code: int,
return_url: str | None = None,
failed_url: str | None = None,
) -> dict[str, Any] | None:
service: PlategaService | None = getattr(self, 'platega_service', None)
if not service or not service.is_configured:
@@ -61,6 +62,7 @@ class PlategaPaymentMixin:
amount_value = amount_kopeks / 100
effective_return_url = return_url or settings.get_platega_return_url()
effective_failed_url = failed_url or settings.get_platega_failed_url()
try:
response = await service.create_payment(
@@ -69,7 +71,7 @@ class PlategaPaymentMixin:
currency=settings.PLATEGA_CURRENCY,
description=description,
return_url=effective_return_url,
failed_url=settings.get_platega_failed_url(),
failed_url=effective_failed_url,
payload=payload_token,
)
except Exception as error: # pragma: no cover - network errors
@@ -105,7 +107,7 @@ class PlategaPaymentMixin:
platega_transaction_id=transaction_id,
redirect_url=redirect_url,
return_url=effective_return_url,
failed_url=settings.get_platega_failed_url(),
failed_url=effective_failed_url,
payload=payload_token,
metadata=metadata,
expires_at=expires_at,
+2
View File
@@ -74,6 +74,7 @@ class WataPaymentMixin:
*,
language: str | None = None,
return_url: str | None = None,
failed_url: str | None = None,
) -> dict[str, Any] | None:
if not getattr(self, 'wata_service', None):
logger.error('WATA service is not initialised')
@@ -120,6 +121,7 @@ class WataPaymentMixin:
description=description,
order_id=order_id,
success_url=return_url,
fail_url=failed_url,
)
except WataAPIError as error:
logger.error('Ошибка создания WATA платежа', error=error)