from __future__ import annotations from dataclasses import dataclass from typing import Optional from data.orders.models import utc_now_iso @dataclass class PaymentRecord: id: str order_id: str provider: str amount_cents: int currency: str = "CNY" status: str = "pending" provider_trade_no: Optional[str] = None checkout_token: Optional[str] = None # payment-bound return key, never portal token callback_payload: Optional[str] = None refund_reason: Optional[str] = None failure_reason: Optional[str] = None # 6/19: 失败 webhook 持久化原因 created_at: str = "" updated_at: str = "" paid_at: Optional[str] = None refunded_at: Optional[str] = None failed_at: Optional[str] = None # 6/19: 失败 webhook 时间戳 def __post_init__(self) -> None: now = utc_now_iso() if not self.created_at: self.created_at = now if not self.updated_at: self.updated_at = self.created_at @dataclass class PaymentCheckout: payment_id: str provider: str checkout_url: str status: str @dataclass class WebhookHandleResult: payment_id: str processed: bool idempotent: bool order_status: str @dataclass class RefundRequestResult: payment_id: str status: str