客服下班后客户消息没人回,是中小团队最常见的痛点。一个最小可用的自动应答服务,核心就三段:接收推送、识别意图、回复消息。

这篇用 Express 实现一个关键词应答机器人,重点讲清楚两件容易被忽略的事:重推幂等和应答顺序。接口行为基于实际联调,代码需按文档校验。

消息流转路径

客户微信 → 平台 → Webhook推送(message.received) → 接收服务 → 关键词匹配 → sendText回复客户
                                        │
                                        └─ 消息表落库(newMsgId唯一索引)

Eyun 提供的调试控制台可以直接发起一次真实推送,联调时比等真实消息快得多,建议先用它验证接收逻辑。

接收与应答代码

// 示例代码,需按官方文档校验
app.post('/webhook/receive', express.raw({ type: '*/*' }), async (req, res) => {
  // 1. 验签:密钥与调用凭证是两个独立凭证,只显示一次
  if (!verifySign(req.body, req.get('X-Eyun-Signature'))) {
    return res.status(401).end();
  }
  const event = JSON.parse(req.body);
  if (req.get('X-Eyun-Event') !== 'message.received') return res.json({ ok: true });

  // 2. 先落库再应答;newMsgId 19位大整数,按字符串处理
  const msgId = String(event.data.newMsgId);
  const inserted = await db.insertIgnore('wx_message', { msg_id: msgId, payload: req.body });
  if (!inserted) return res.json({ ok: true }); // 重推的消息,不再回复

  // 3. 应答和回复分离:先返回2xx,回复走异步
  res.json({ ok: true });
  await replyQueue.add({ msgId, from: event.data.from, content: event.data.content });
});

// 异步消费者:关键词匹配后回复
replyQueue.process(async (job) => {
  const { from, content } = job.data;
  const answer = KB[content.trim()] || '已收到您的消息,人工客服上班后会第一时间回复您';
  await axios.post(`${BASE_URL}/sendText`, {
    wId: process.env.WX_INSTANCE_ID, wcId: from, content: answer,
  }, { headers: { Authorization: `Bearer ${process.env.EYUN_TOKEN}` } });
});

回调地址配置和验签规则见Eyun开发文档,全部事件类型在事件索引里,不止 message.received 一种。

踩坑:重推导致客户收到两条相同回复

平台推送有重试机制,接收方返回非 2xx 或超时就重推。我们早期版本里,回复动作写在应答之前,一次下游超时触发重推,同一个客户两条消息间隔 3 秒,内容一字不差。

修复思路就是把「收到」和「处理」解耦:落库带唯一索引,插入冲突直接确认为重推;回复动作只对首次落库的消息执行。宁可晚回复一秒,不要重复回复。

另一个细节:验签失败要在日志里记下原因。我们有一次重置回调密钥后忘了同步接收服务,表现是平台侧显示送达、业务侧零消息,日志里全是验签失败,五分钟定位,没日志的话要查一晚上。

权衡:关键词匹配还是接大模型

自动应答的意图识别有三档选择:

方案

成本

适用

关键词/正则

零

答案固定的FAQ场景

规则+词表

低

意图稍多样但可控

接LLM

按量付费

开放式咨询

实测建议:先上关键词,跑两周看未命中日志,高频问题补进词表;LLM 只给人工客服当草稿生成用,不要让它直接回复客户——个人微信场景下回复内容不可控的风险太大,这是我们的取舍,不是通用结论。

上线检查

  • 验签、幂等、先存后应答,三件事顺序不能乱

  • 回复走异步队列,接收服务不在请求里做慢逻辑

  • 未命中的关键词有日志,每周过一遍补词表

关键词词表冷启动没头绪的话,从过去一个月人工客服的聊天记录里挑高频问题,命中率比拍脑袋高得多。欢迎交流你的应答策略。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐