payment.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from sqlalchemy import Column, Integer, String, Text, DateTime, Enum, JSON, DECIMAL
  2. from datetime import datetime
  3. from app.core.database import Base
  4. class VasPayment(Base):
  5. __tablename__ = "vas_payment"
  6. id = Column(Integer, primary_key=True, autoincrement=True)
  7. order_id = Column(String(128), nullable=False)
  8. provider = Column(Enum('stripe', 'wechat', 'alipay'), nullable=False)
  9. channel = Column(String(50), nullable=False)
  10. # 支付意向ID (Stripe PaymentIntent ID)
  11. payment_intent_id = Column(String(255))
  12. # 外部交易号 (微信/支付宝的 transaction_id)
  13. external_trade_no = Column(String(255))
  14. # --- 修改点 1: 扩充状态枚举 ---
  15. status = Column(
  16. Enum(
  17. 'pending', # 待支付
  18. 'succeeded', # 支付成功
  19. 'failed', # 支付失败
  20. 'expired', # 支付超时
  21. 'late_paid', # 逾期支付(极少见)
  22. 'refunded', # 已全额退款
  23. ),
  24. default='pending',
  25. )
  26. base_amount = Column(Integer, nullable=False)
  27. base_currency = Column(String(10), nullable=False)
  28. amount = Column(Integer, nullable=False)
  29. currency = Column(String(10), nullable=False)
  30. random_offset = Column(Integer, nullable=False)
  31. exchange_rate = Column(DECIMAL(18, 8), nullable=False)
  32. qr_id = Column(Integer)
  33. payment_url = Column(Text)
  34. expire_at = Column(DateTime)
  35. provider_payload = Column(JSON)
  36. # 外部退款单号 (Stripe Refund ID / 微信退款单号 / 支付宝退款单号)
  37. external_refund_no = Column(String(255))
  38. # 退款时间
  39. refunded_at = Column(DateTime)
  40. # 退款原因/备注
  41. refund_reason = Column(String(255))
  42. created_at = Column(DateTime, default=datetime.utcnow)
  43. updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)