修复了订单状态(所有支付接口)更新的问题
This commit is contained in:
@@ -423,60 +423,21 @@ class ShangjiaHuitiao(View):
|
||||
return self.wechat_response('SUCCESS', 'OK')
|
||||
|
||||
# 6. 验证金额(微信返回的是分,需要转换)
|
||||
wechat_amount_yuan = Decimal(str(total_fee)) / Decimal('100') # 转换为元
|
||||
order_amount_yuan = Decimal(str(order.jine)) # 订单金额(元)
|
||||
wechat_amount_yuan = total_fee / 100 # 转换为元
|
||||
order_amount_yuan = float(order.jine) # 订单金额(元)
|
||||
|
||||
# 允许1分钱的误差
|
||||
if abs(wechat_amount_yuan - order_amount_yuan) > Decimal('0.01'):
|
||||
# 允许1分钱的误差(浮点数比较)
|
||||
if abs(wechat_amount_yuan - order_amount_yuan) > 0.01:
|
||||
logger.error(f"商家订单金额不一致: 订单金额{order_amount_yuan}元, 支付金额{wechat_amount_yuan}元")
|
||||
return self.wechat_response('FAIL', '金额不一致')
|
||||
|
||||
# ===== 在这里添加收支记录更新代码 =====
|
||||
# 更新收支记录表
|
||||
# 7. 调用统一履约函数(事务 + 行锁 + 幂等 + 收支记录)
|
||||
from jituan.services.czjilu_fulfill import fulfill_shangjia, CzjiluFulfillError
|
||||
try:
|
||||
jine_decimal = Decimal(str(order.jine)) if not isinstance(order.jine, Decimal) else order.jine
|
||||
from jituan.services.szjilu_accounting import repair_wechat_income_if_missing
|
||||
repair_wechat_income_if_missing(
|
||||
jine_decimal,
|
||||
getattr(order, 'club_id', None),
|
||||
biz_ref=f'cz:{order.dingdan_id}',
|
||||
)
|
||||
|
||||
logger.info(f"收支记录更新成功: 订单{order.dingdan_id}, 金额{jine_decimal}元")
|
||||
|
||||
except Exception as e:
|
||||
# 收支记录更新失败不影响主流程,只记录日志
|
||||
logger.error(f"更新收支记录失败: {str(e)}", exc_info=True)
|
||||
# ===== 添加结束 =====
|
||||
|
||||
|
||||
|
||||
# 7. 使用事务更新订单状态和商家余额
|
||||
with transaction.atomic():
|
||||
# 更新订单状态为已支付(3)
|
||||
order.zhuangtai = 3
|
||||
order.save(update_fields=['zhuangtai'])
|
||||
logger.info(f"商家订单状态更新成功: {order.dingdan_id} -> 3")
|
||||
|
||||
# 更新商家余额
|
||||
try:
|
||||
# 通过用户ID查找商家(高效查询)
|
||||
shangjia = UserShangjia.query.get(user__UserUID=order.yonghuid)
|
||||
|
||||
# 增加余额
|
||||
shangjia.yue += order_amount_yuan
|
||||
shangjia.save(update_fields=['yue'])
|
||||
|
||||
logger.info(f"商家余额更新成功: 商家{shangjia.nicheng}, 增加{order_amount_yuan}元, 新余额{shangjia.yue}")
|
||||
|
||||
except UserShangjia.DoesNotExist:
|
||||
# 如果找不到商家,记录错误,但依然返回成功(避免微信重复回调)
|
||||
logger.error(f"商家信息不存在: 用户{order.yonghuid}")
|
||||
return self.wechat_response('SUCCESS', 'OK')
|
||||
except Exception as e:
|
||||
logger.error(f"更新商家余额失败: {str(e)}", exc_info=True)
|
||||
# 回滚事务
|
||||
raise
|
||||
fulfill_shangjia(out_trade_no, paid_amount_yuan=wechat_amount_yuan)
|
||||
except CzjiluFulfillError as exc:
|
||||
logger.error('商家充值回调履约失败 %s: %s', out_trade_no, exc)
|
||||
return self.wechat_response('FAIL', str(exc))
|
||||
|
||||
# 8. 返回成功响应给微信
|
||||
logger.info(f"商家支付回调处理完成: {out_trade_no}")
|
||||
|
||||
Reference in New Issue
Block a user