payment.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. adjustment_delta = Column(Integer, default=0)
  28. final_amount = Column(Integer, nullable=False)
  29. base_currency = Column(String(10), nullable=False)
  30. amount = Column(Integer, nullable=False)
  31. currency = Column(String(10), nullable=False)
  32. random_offset = Column(Integer, nullable=False)
  33. exchange_rate = Column(DECIMAL(18, 8), nullable=False)
  34. qr_id = Column(Integer)
  35. payment_url = Column(Text)
  36. expire_at = Column(DateTime)
  37. provider_payload = Column(JSON)
  38. # 外部退款单号 (Stripe Refund ID / 微信退款单号 / 支付宝退款单号)
  39. external_refund_no = Column(String(255))
  40. # 退款时间
  41. refunded_at = Column(DateTime)
  42. # 退款原因/备注
  43. refund_reason = Column(String(255))
  44. created_at = Column(DateTime, default=datetime.utcnow)
  45. updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)