SELECT item_id, price,
       ROUND(price * 260 / 300, 2) AS refundable
FROM wp_order_item WHERE order_id = 8812;

订单原价 300,用了满 300 减 40 的券,实付 260。用户退其中一件 100 元的商品,系统退回去 100,渠道账单里这笔订单净收只剩 160。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:退款金额直接取商品原价,没有把优惠券和运费按比例摊到每件商品上。订单实付与商品原价之和不相等,退一件就必然多退。

「部分退款金额计算」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

处理上按这个顺序:下单时把优惠金额按行金额比例摊到每条 order_item,落库保存 share_amount;退款按 share_amount 计算,运费是否退按规则单独判断,不混进商品金额;退款前校验累计退款额不超过订单实付,超出直接拒绝并记录。

确认没问题再收工,退掉 100 元那件,退款金额为 86.67,全部退完累计正好等于实付 260。

作者 9823189