payment.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import json
  2. from pydantic import BaseModel, field_validator
  3. from typing import Optional, Dict, Any, Literal, List
  4. from datetime import datetime
  5. class VasPaymentBase(BaseModel):
  6. status: Optional[Literal['pending', 'succeeded', 'failed', 'expired', 'late_paid', 'refunded']] = None
  7. qr_id: Optional[int] = None
  8. payment_url: Optional[str] = None
  9. expire_at: Optional[datetime] = None
  10. provider_payload: Optional[Dict[str, Any]] = None
  11. @field_validator("provider_payload", mode="before")
  12. def normalize_json_field(cls, v):
  13. if v is None:
  14. return None
  15. if isinstance(v, str):
  16. try:
  17. return json.loads(v)
  18. except Exception:
  19. return {}
  20. return v
  21. class VasPaymentCreate(BaseModel):
  22. order_id: str
  23. provider: Literal['stripe', 'wechat', 'alipay']
  24. class VasPaymentOut(VasPaymentBase):
  25. id: int
  26. order_id: str
  27. provider: str
  28. channel: str
  29. payment_intent_id: Optional[str]
  30. external_trade_no: Optional[str]
  31. base_amount: int
  32. base_currency: str
  33. amount: int
  34. currency: str
  35. random_offset: int
  36. exchange_rate: float # 注意:仅用于展示,DB 里是 DECIMAL
  37. external_refund_no: Optional[str]
  38. refund_reason: Optional[str]
  39. refunded_at: Optional[datetime]
  40. created_at: datetime
  41. updated_at: datetime
  42. class Config:
  43. orm_mode = True