客服把聊天截图甩过来:客户只问了一句「在吗」,机器人回了两句一模一样的「在的,请问有什么可以帮您」。
工单系统里还并排躺着两张新建单。研发第一反应常常是:「回调怎么推了两次?平台有问题吧?」
先把心态摆正:推两次很常见,算不上事故。真正丢人的,是你的业务被执行了两次。
做个人微信 API 二次开发,尤其是接 GeWe API 这类通道时,消息回调会因网络抖动、处理超时、补偿重试等原因重复到达。你几乎控制不了「绝对只推一次」,但完全可以保证「同一条消息,业务只认真做一次」。
重复推送时,线上到底会发生什么
典型连锁反应是这样的:
客户发来一条消息
你的服务收到回调,开始查库、调逻辑,甚至同步等 AI
处理偏慢,对端认为失败,又推了一次
两次回调都跑完自动回复和建单
客户觉得被刷屏,客服觉得系统疯了
所以防重复不是「锦上添花」,而是自动回复、工单、CRM 同步的底线能力。
业务端怎么做:三道闸
第一道:进门先认人
每条进来的消息,先生成一把「防重复钥匙」。
优先用消息自带的唯一编号
没有编号时,用几样拼起来:哪台设备、哪个聊天窗口、谁发的、大概什么时间、内容摘要
钥匙已经存在:说明处理过了,直接返回成功,后面什么业务都别做。
钥匙不存在:先占住,再往下走。
这里有个反直觉点:重复请求也要返回成功。你要是返回失败,对方可能继续重推,重复问题更严重。
第二道:回调里只做轻活
很多人卡在回调里又查资料、又调模型、又发消息,干完才返回。时间一长,重推概率直接上升。
比较稳的节奏:
收到回调 → 校验 → 去重占坑 → 写入队列或数据库 → 马上返回成功 慢活(规则、AI、发消息、建单)全部放到后台 Worker可以记一句口诀:先进柜,再慢慢干。
第三道:发出去之前再挡一次
进门去重防止「处理两遍」,还挡不住「发出去两遍」。
自动回复、创建工单、修改订单状态,建议各自再备一把业务钥匙,例如:
消息ID + 已回复消息ID + 已建单
占住了就不能再做第二次。这样即使 Worker 重试、进程重启,也不会给客户再来一条。
钥匙少拼一项,会出什么怪事
少了什么 | 可能后果 |
|---|---|
设备 | 多账号之间互相误判为重复,表现为偶发不回 |
聊天窗口 | 不同群里同一句「好的」撞车 |
发送人 | 群里两个人说一样的话被当成一条 |
用服务器收到时间当钥匙 | 重推时间一变,去重失效 |
上线前怎么验收
用同一条消息内容,对着回调地址连打 3 次:只回一句、只建一张单
故意把 Worker 处理拖慢:回调仍快速成功,且最终仍不双回
看日志里去重命中次数是否在升高(升高说明重推存在,但被挡住了,这是健康信号)
小结
回调重复不可怕,业务重复才可怕。
接个人微信自动化时,把「认人、快回、出门再占坑」做进自己的服务,比反复纠结「为什么会推两次」有用得多。字段与回调约定以官方说明为准。
接入说明见 GeWe API 文档