feat(payments): reuse pending provider payments
This commit is contained in:
@@ -42,6 +42,7 @@ from .common import (
|
||||
payment_record_amounts,
|
||||
payment_unavailable,
|
||||
payment_units_for_activation,
|
||||
reusable_webapp_payment_response,
|
||||
sale_mode_base,
|
||||
sale_mode_is_hwid_devices,
|
||||
sale_mode_is_traffic,
|
||||
@@ -117,6 +118,7 @@ __all__ = [
|
||||
"payment_link_message_text",
|
||||
"payment_link_response",
|
||||
"payment_record_amounts",
|
||||
"reusable_webapp_payment_response",
|
||||
"payment_units_for_activation",
|
||||
"payment_unavailable",
|
||||
"post_json_request",
|
||||
|
||||
@@ -285,6 +285,7 @@ async def safe_store_provider_payment_id(
|
||||
payment: Payment,
|
||||
*,
|
||||
provider_payment_id: str,
|
||||
provider_payment_url: Optional[str] = None,
|
||||
new_status: Optional[str] = None,
|
||||
log_prefix: str,
|
||||
) -> bool:
|
||||
@@ -300,6 +301,7 @@ async def safe_store_provider_payment_id(
|
||||
payment.payment_id,
|
||||
str(provider_payment_id),
|
||||
new_status or payment.status,
|
||||
provider_payment_url=provider_payment_url,
|
||||
)
|
||||
await session.commit()
|
||||
return True
|
||||
@@ -359,6 +361,7 @@ async def render_link_or_fail(
|
||||
session,
|
||||
payment,
|
||||
provider_payment_id=provider_payment_id,
|
||||
provider_payment_url=payment_url,
|
||||
new_status=new_status,
|
||||
log_prefix=log_prefix,
|
||||
)
|
||||
|
||||
@@ -315,6 +315,45 @@ async def create_webapp_payment_record(
|
||||
)
|
||||
|
||||
|
||||
async def reusable_webapp_payment_response(
|
||||
ctx: WebAppPaymentContext,
|
||||
provider_spec: Any,
|
||||
*,
|
||||
since_minutes: Optional[int] = None,
|
||||
) -> Optional[web.Response]:
|
||||
resolver = getattr(provider_spec, "reuse_webapp_payment", None)
|
||||
if resolver is None:
|
||||
return None
|
||||
|
||||
amounts = payment_record_amounts(
|
||||
months=ctx.months,
|
||||
sale_mode=ctx.sale_mode,
|
||||
traffic_gb=ctx.traffic_gb,
|
||||
hwid_device_count=ctx.hwid_device_count,
|
||||
)
|
||||
payment = await payment_dal.find_recent_pending_provider_payment(
|
||||
ctx.session,
|
||||
user_id=ctx.user_id,
|
||||
provider=provider_spec.provider_key,
|
||||
pending_status=provider_spec.pending_status,
|
||||
amount=ctx.price,
|
||||
currency=ctx.currency,
|
||||
sale_mode=ctx.sale_mode,
|
||||
months=amounts.months,
|
||||
purchased_gb=amounts.purchased_gb,
|
||||
purchased_hwid_devices=amounts.purchased_hwid_devices,
|
||||
tariff_key=amounts.tariff_key,
|
||||
since_minutes=since_minutes,
|
||||
)
|
||||
if payment is None:
|
||||
return None
|
||||
|
||||
payment_url = await resolver(ctx, payment)
|
||||
if not payment_url:
|
||||
return None
|
||||
return payment_link_response(payment_url=payment_url, payment_id=payment.payment_id)
|
||||
|
||||
|
||||
async def mark_payment_failed_creation(session: AsyncSession, payment_id: int) -> None:
|
||||
await payment_dal.update_payment_status_by_db_id(session, payment_id, "failed_creation")
|
||||
await session.commit()
|
||||
|
||||
@@ -46,6 +46,7 @@ async def finalize_webapp_link_payment(
|
||||
payment.payment_id,
|
||||
str(provider_payment_id),
|
||||
new_status or payment.status,
|
||||
provider_payment_url=payment_url,
|
||||
)
|
||||
await session.commit()
|
||||
except Exception:
|
||||
|
||||
Reference in New Issue
Block a user