fix(payment): 同步回调中处理订单状态,防止异步延迟

- 同步回调中加锁查询订单,防止并发导致重复发放
- 将订单状态从PENDING更新为PAID,并记录支付交易号和支付时间
- 支付成功时增加用户积分,记录日志
- 异常时回滚事务并记录错误日志
- 异步通知加锁查询订单,确保并发安全
- 更新支付宝支付跳转和通知地址配置
This commit is contained in:
公司git 2026-01-23 15:00:34 +08:00
parent 2ef673d0d6
commit 8a107ee575
2 changed files with 35 additions and 3 deletions

View File

@ -76,6 +76,37 @@ def payment_return():
out_trade_no = data.get('out_trade_no')
if success:
# 同步回调也进行订单处理,防止异步回调延迟或失败
out_trade_no = data.get('out_trade_no')
trade_no = data.get('trade_no')
try:
# 查询订单 (加锁防止并发导致双重发放)
order = Order.query.filter_by(out_trade_no=out_trade_no).with_for_update().first()
# 如果订单存在且状态为PENDING则更新为PAID
if order and order.status == 'PENDING':
order.status = 'PAID'
order.trade_no = trade_no
order.paid_at = get_bj_now()
# 增加用户积分
user = db.session.get(User, order.user_id)
if user:
user.points += order.points
system_logger.info(f"同步回调-订单支付成功", order_id=out_trade_no, points=order.points, user_id=user.id)
db.session.commit()
elif order:
# 订单已经是完成状态,不做处理
pass
else:
system_logger.warning(f"同步回调-未找到订单", order_id=out_trade_no)
except Exception as e:
db.session.rollback()
system_logger.error(f"同步回调-订单状态更新失败: {str(e)}")
return redirect(url_for('auth.buy_page', success='true', out_trade_no=out_trade_no))
else:
system_logger.warning(f"支付同步回调验证失败", order_id=out_trade_no)
@ -150,7 +181,8 @@ def payment_notify():
out_trade_no = data.get('out_trade_no')
trade_no = data.get('trade_no')
order = Order.query.filter_by(out_trade_no=out_trade_no).first()
# 加锁查询,确保并发安全
order = Order.query.filter_by(out_trade_no=out_trade_no).with_for_update().first()
if order and order.status == 'PENDING':
order.status = 'PAID'
order.trade_no = trade_no

View File

@ -59,8 +59,8 @@ MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC+BMpGTJMzDoOnjyGh69rDLbV/8rlB
ALIPAY_PUBLIC_KEY = """-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlDx4KdOtOQE+tBq6jHKKFenRaRe2gbBnleBk++5gki9IQuxVyZUGTJixstf2gELFHWrGanpnwmGggXsqG+Rm5ZLJOlmFM1k0XeAIDvi6tP/rM+ZDFSu1bMBYtT5vzgVZC7mzIvOp9gsT/puqd3aNZmlviLD0R6OYN0zvFX+5qADZV7A9ziA+nXPFSHreBh7yY/q9ophVZNeHGPoYkDVI5++RrF1cALKOdit0giN5vxpe3ch9z3E6+FZg3LiP+1RW3tMiDQfp/SlVs6bNhLUtmlI5r7+mtFCKDUCEpnQ3S9e0II6rzyVXRyKCFs7qi5YzyhhmO3tJJoe9ilEFyNzfRQIDAQAB
-----END PUBLIC KEY-----""" # 支付宝公钥
ALIPAY_RETURN_URL = "http://331002.xyz:2010/payment/return" # 支付成功跳转地址
ALIPAY_NOTIFY_URL = "http://331002.xyz:2010/payment/notify" # 支付异步通知地址
ALIPAY_RETURN_URL = "http://860576.xyz:2010/payment/return" # 支付成功跳转地址
ALIPAY_NOTIFY_URL = "http://860576.xyz:2010/payment/notify" # 支付异步通知地址
ALIPAY_DEBUG = False # 是否使用沙箱环境
# 开发模式配置