| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- import json
- from pydantic import BaseModel, field_validator
- from typing import Optional, Dict, Any, Literal, List
- from datetime import datetime
- class VasPaymentBase(BaseModel):
- status: Optional[Literal['pending', 'succeeded', 'failed', 'expired', 'late_paid', 'refunded']] = None
- qr_id: Optional[int] = None
- payment_url: Optional[str] = None
- expire_at: Optional[datetime] = None
- provider_payload: Optional[Dict[str, Any]] = None
-
- @field_validator("provider_payload", mode="before")
- def normalize_json_field(cls, v):
- if v is None:
- return None
- if isinstance(v, str):
- try:
- return json.loads(v)
- except Exception:
- return {}
- return v
-
- class VasPaymentCreate(BaseModel):
- order_id: str
- provider: Literal['stripe', 'wechat', 'alipay']
-
- class AdminUpdateStatusPayload(BaseModel):
- remark: Optional[str] = None
- status: Literal['succeeded', 'failed']
- class VasPaymentOut(VasPaymentBase):
- id: int
- order_id: str
- provider: str
- channel: str
- payment_intent_id: Optional[str]
- external_trade_no: Optional[str]
-
- base_amount: int
- base_currency: str
-
- adjustment_delta: int
- final_amount: int
- amount: int
- currency: str
- random_offset: int
-
- exchange_rate: float # 注意:仅用于展示,DB 里是 DECIMAL
- external_refund_no: Optional[str]
- refund_reason: Optional[str]
- refunded_at: Optional[datetime]
- created_at: datetime
- updated_at: datetime
- model_config = {
- "from_attributes": True
- }
|