渠道后台显示只通知了一次,本地日志里 trade_no 4200001 的 notify 却出现三条,仓库系统收到三张出库单。第三张打印时快递单号已经重复。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
INSERT INTO wp_notify_log (trade_no, body, created_at)
VALUES ('4200001', '{}', NOW());
-- 1062 表示重复通知,直接 echo 'success'
回调接口处理完写库要八百毫秒,渠道等两秒没收到 success 就重发,而接口没有按交易号去重。每条通知都新建一条发货任务,重复的单要到仓库侧才被发现。这一点先确认清楚,后面就不用反复试。
「回调重复通知」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
具体做法是,建一张 notify_log 表,trade_no 加唯一索引,插入成功才继续处理,重复的直接返回 success;处理成功后用状态条件更新把订单从待发货改成已发货,防止二次流转;返回给渠道的响应必须是纯文本 success,带 HTML 或 JSON 会让渠道一直重试。
改完照着核一遍,用 curl 连发三次同样的报文,只有第一条产生发货单,后两条返回 success 且订单状态不变。
