在企业微信二次开发中,客户连续发送相同问题是比较常见的情况。
比如客户在外部群发送“查询订单1001”,由于后台接口响应较慢,又连续发送了两三次。如果每条消息都创建新任务,就会造成接口重复调用、业务资源浪费,甚至重复发送回复。
通过星云API对接企业微信消息收发能力,可以结合消息去重、任务状态管理和业务幂等机制,避免重复提问导致任务反复执行。
相关接口参考顶部星云官网卡片里的接口文档 。
一、先区分重复消息和重复提问
这两种情况需要采用不同的处理方式。
| 类型 | 处理方式 |
|---|---|
| 同一消息重复回调 | 通过messageId去重 |
| 客户连续发送相同问题 | 根据客户ID和业务参数判断 |
| 相同业务正在处理 | 返回已有任务状态 |
| 相同业务已经完成 | 根据业务规则返回已有结果 |
例如客户连续发送两次“查询订单1001”,虽然消息ID不同,但可以关联到同一个正在执行的查询任务。
二、建立业务请求唯一标识
建议根据客户身份、业务类型和业务参数生成请求标识。
例如:
requestKey = customerId + businessType + orderId
实际生成结果:
USER001:order_query:ORDER1001
收到消息后,先通过requestKey查询是否存在相同的未完成任务。
如果任务正在执行,就不需要重新调用订单接口。
对于已完成的查询,可以设置合理的结果缓存时间,过期后允许重新查询,避免客户一直收到旧数据。
三、重复提问的处理流程
客户发送业务消息
↓
识别客户身份与业务参数
↓
生成业务请求标识
↓
查询是否存在相同任务
↓
┌──────┴──────┐
↓ ↓
已存在 不存在
↓ ↓
查询任务状态 创建新任务
↓ ↓
返回已有进度 调用业务接口
↓
保存执行结果
↓
回复对应客户
例如客户第一次发送:
查询订单1001
系统回复:
订单1001正在查询中,请稍候。
客户再次发送相同问题时,可以回复:
订单1001的查询任务仍在处理中,
完成后会自动通知您。
这样既能让客户知道系统已经收到请求,也能避免重复创建任务。
四、实际开发需要注意什么
1. 不要只根据消息内容去重
不同客户可能发送相同指令,因此需要结合客户ID、业务编号和会话信息判断。
2. 防止并发创建重复任务
可以使用Redis的SET NX EX原子操作控制任务创建。对于订单提交等重要业务,还需要增加数据库唯一约束。
3. 区分查询和提交类业务
订单查询可以设置短时间缓存,订单创建、售后申请等操作则需要更严格的幂等控制。
4. 不要频繁回复重复提示
可以对重复提问设置提示间隔,避免客户连续发送消息时,机器人也连续刷屏。
5. 保存任务与会话关系
任务创建时记录实例ID、群ID、客户ID和任务ID,确保最终业务结果准确返回原始会话。
五、总结
企业微信自动回复处理重复提问时,关键不是简单屏蔽相同消息,而是判断客户是否已经存在相同的业务任务。
通过消息ID去重、业务请求唯一标识、任务状态查询和结果缓存,可以减少重复接口调用,也能避免客户反复提交业务。
本文探讨企业微信二次开发中自动回复场景下重复提问的识别与处理机制,重点介绍如何通过业务请求唯一标识、Redis原子操作、任务状态管理及结果缓存实现消息去重与业务幂等,避免重复调用接口、资源浪费和重复回复,涵盖查询类与提交类业务的差异化处理策略。
456

被折叠的 条评论
为什么被折叠?



