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:
@@ -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'):
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user