69 lines
2.3 KiB
Python
69 lines
2.3 KiB
Python
"""
|
|
支付模型
|
|
"""
|
|
from datetime import datetime
|
|
from config.database import db
|
|
|
|
|
|
class Payment(db.Model):
|
|
"""支付记录模型"""
|
|
__tablename__ = 'payments'
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
order_id = db.Column(db.Integer, db.ForeignKey('orders.id'), nullable=False)
|
|
payment_sn = db.Column(db.String(64), unique=True, nullable=False)
|
|
payment_method = db.Column(db.String(20), nullable=False)
|
|
amount = db.Column(db.Numeric(10, 2), nullable=False)
|
|
status = db.Column(db.Integer, default=1) # 1-待支付 2-支付成功 3-支付失败 4-已退款
|
|
third_party_sn = db.Column(db.String(100)) # 第三方支付流水号
|
|
callback_data = db.Column(db.Text) # 支付回调数据
|
|
paid_at = db.Column(db.DateTime)
|
|
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
|
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
|
|
|
# 关联关系
|
|
order = db.relationship('Order', backref='payments')
|
|
|
|
# 状态常量
|
|
STATUS_PENDING = 1 # 待支付
|
|
STATUS_SUCCESS = 2 # 支付成功
|
|
STATUS_FAILED = 3 # 支付失败
|
|
STATUS_REFUNDED = 4 # 已退款
|
|
|
|
STATUS_CHOICES = {
|
|
STATUS_PENDING: '待支付',
|
|
STATUS_SUCCESS: '支付成功',
|
|
STATUS_FAILED: '支付失败',
|
|
STATUS_REFUNDED: '已退款'
|
|
}
|
|
|
|
def get_status_text(self):
|
|
"""获取状态文本"""
|
|
return self.STATUS_CHOICES.get(self.status, '未知状态')
|
|
|
|
def to_dict(self):
|
|
"""转换为字典"""
|
|
return {
|
|
'id': self.id,
|
|
'payment_sn': self.payment_sn,
|
|
'payment_method': self.payment_method,
|
|
'amount': float(self.amount),
|
|
'status': self.status,
|
|
'status_text': self.get_status_text(),
|
|
'third_party_sn': self.third_party_sn,
|
|
'paid_at': self.paid_at.isoformat() if self.paid_at else None,
|
|
'created_at': self.created_at.isoformat() if self.created_at else None
|
|
}
|
|
|
|
@classmethod
|
|
def generate_payment_sn(cls):
|
|
"""生成支付流水号"""
|
|
import time
|
|
import random
|
|
timestamp = str(int(time.time()))
|
|
random_str = str(random.randint(100000, 999999))
|
|
return f"PAY{timestamp}{random_str}"
|
|
|
|
def __repr__(self):
|
|
return f'<Payment {self.payment_sn}>'
|