payment.py 1.3 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']] = 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 VasPaymentUpdate(VasPaymentBase):
  25. pass
  26. class VasPaymentOut(VasPaymentBase):
  27. id: int
  28. order_id: str
  29. provider: str
  30. channel: str
  31. payment_intent_id: Optional[str]
  32. external_trade_no: Optional[str]
  33. base_amount: int
  34. base_currency: str
  35. amount: int
  36. currency: str
  37. random_offset: int
  38. exchange_rate: float # 注意:仅用于展示,DB 里是 DECIMAL
  39. created_at: datetime
  40. updated_at: datetime
  41. class Config:
  42. orm_mode = True