| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- from sqlalchemy import Column, Integer, String, Text, DateTime, Enum, JSON, DECIMAL
- from datetime import datetime
- from app.core.database import Base
- class VasPayment(Base):
- __tablename__ = "vas_payment"
- id = Column(Integer, primary_key=True, autoincrement=True)
- order_id = Column(String(128), nullable=False)
- provider = Column(Enum('stripe', 'wechat', 'alipay'), nullable=False)
- channel = Column(String(50), nullable=False)
-
- # 支付意向ID (Stripe PaymentIntent ID)
- payment_intent_id = Column(String(255))
- # 外部交易号 (微信/支付宝的 transaction_id)
- external_trade_no = Column(String(255))
- # --- 修改点 1: 扩充状态枚举 ---
- status = Column(
- Enum(
- 'pending', # 待支付
- 'succeeded', # 支付成功
- 'failed', # 支付失败
- 'expired', # 支付超时
- 'late_paid', # 逾期支付(极少见)
- 'refunded', # 已全额退款
- ),
- default='pending',
- )
-
- base_amount = Column(Integer, nullable=False)
- base_currency = Column(String(10), nullable=False)
- amount = Column(Integer, nullable=False)
- currency = Column(String(10), nullable=False)
- random_offset = Column(Integer, nullable=False)
-
- exchange_rate = Column(DECIMAL(18, 8), nullable=False)
- qr_id = Column(Integer)
- payment_url = Column(Text)
- expire_at = Column(DateTime)
- provider_payload = Column(JSON)
-
- # 外部退款单号 (Stripe Refund ID / 微信退款单号 / 支付宝退款单号)
- external_refund_no = Column(String(255))
-
- # 退款时间
- refunded_at = Column(DateTime)
-
- # 退款原因/备注
- refund_reason = Column(String(255))
- created_at = Column(DateTime, default=datetime.utcnow)
- updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|