fix(payment): 同步回调中处理订单状态,防止异步延迟
- 同步回调中加锁查询订单,防止并发导致重复发放 - 将订单状态从PENDING更新为PAID,并记录支付交易号和支付时间 - 支付成功时增加用户积分,记录日志 - 异常时回滚事务并记录错误日志 - 异步通知加锁查询订单,确保并发安全 - 更新支付宝支付跳转和通知地址配置
This commit is contained in:
parent
2ef673d0d6
commit
8a107ee575
@ -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
|
||||
|
||||
@ -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 # 是否使用沙箱环境
|
||||
|
||||
# 开发模式配置
|
||||
|
||||
Loading…
Reference in New Issue
Block a user