文档里的设置回调接口只登记一个 URL:之后该 Token 下设备收到的消息,会 POST 到这个地址。关键词自动回复不是回调接口的参数,是你在自己的服务里:先收下事件,再决定是否调用 /msg/sendText。
回调接口形态:
-
方法:
/client/setCallback -
callbackUrl:公网可访问地址 -
authType:文档示例为Authorization -
authSecret:你自己定的密钥
配成功后没有「关键词」字段可填。规则表在你这边。
{
"method": "/client/setCallback",
"params": {
"callbackUrl": "https://你的域名/wecom/webhook",
"authType": "Authorization",
"authSecret": "自行保管的密钥"
}
}
(正文里这是请求体示例,不是对外推广链接。)
功能怎么接在回调后面
-
平台 POST 事件到
callbackUrl -
校验
authSecret,读出guid、群 ID、发送人、文本 -
3 秒内返回 HTTP 200,事件写入队列;超时按丢弃
-
Worker 用关键词表匹配
-
命中则用事件里的同一个
guid,toId用群roomId,调/msg/sendText{
"method": "/msg/sendText",
"params": {
"guid": "回调里的设备ID",
"toId": "回调里的群roomId",
"content": "发「报价」获取价目,发「工单」加单号查询进度。",
"isNoNeedRead": true
}
}
事件里的 cmd、msgType、群 ID 字段名以回调结构说明为准,不要按猜测解析。接口自己发出去的消息不会再进回调,所以关键词匹配的是客户或手机端人工发的内容,不是机器人刚回的那句。
关键词表怎么设计才不像误触发
先做精确词或前缀,例如:报价、工单、发票、人工。不要一上来上正则扫整句。
同一条事件只回一条。优先级写死:人工 > 工单 > 报价。匹配不到就沉默,不要每条群聊都回「未识别」。
去重键用回调里的消息唯一标识;没有该字段时用 guid + 群ID + 发送人 + 时间戳 + 正文哈希。同一 JSON 被 POST 三次,群里只许出现一次回复。
多设备共用一个回调 URL 时,禁止写死某个 guid。谁收到的事件,谁负责回。同一群进了两个托管号,会有两路事件,必须用「该群主责 guid」过滤,否则客户会看到两个头像同时答。
回调侧必须遵守的约束
-
URL 要公网可达;本机 localhost 配不上
-
先读完 Body 再 200,再入队,避免框架先结束请求导致 Body 丢失
-
鉴权失败打日志;不要在回调线程里查库、调模型、调发送
-
配置后会有一条校验请求,用来确认地址活着,不要把它当群消息去做关键词回复
登录不在线、areaCode 和省份不一致,是设备问题,关键词表再完整也发不出去。回复失败按发送接口的 code、isSendSuccess 记日志,不要在回调里重试发送。
上线时怎么验
配好回调后,在测试外部群分别发 报价、随便聊聊、连续三条 报价。预期:第一类有一条固定回复,第二类无回复,第三类三条事件对应三次业务回复且没有因重试变成六次。把校验用的那次 POST 从关键词逻辑里排除。改主责 guid 后再测,确认回消息的是新设备而不是旧号。
这个功能停在「指定词 → 指定句」。意图识别、知识库、转人工工单都是 Worker 里后续分支,不是 /client/setCallback 的参数扩展。