转载请注明出处:https://www.jjput.com/archives/wei-xin-ke-fu-ji-qi-ren
在第一步接受微信消息前,需要进入微信客服后台配置。
根据文档3.1-支持Http Get请求验证URL有效性(微信这方面有很多份文档,这点必须吐槽一下,有些过时了按照上面基本不对,基本都不是特别完善),我们需要完成一个Get请求,以用于微信配置时验证url正确性。
注意验证url与下面回调url都应该是相同路径,只是请求方式不同(Get&Post)
接收到Get请求后,还需要正确的解密数据,将解密后的数据返回。
微信解密说明文档
解不出来,可以借助官方解密demo(支持C++、Python、PHP、java、C#、golang、node)
完成准备工作以后,并正确的配置了回调路径后,我们开始接收回调消息通知。
详细查看文档-3.2支持Http Post请求接收业务数据
这里注意一下POST接收的消息体类型是text/xml
不是application/xml
!!更不可能是application/json;charset=UTF-8
!!!
做到这我真的快受不了,必须喷一下,他娘的微信的api文档他自己验证过没有?这就是堂堂一线大厂?对外公开文档如此不严谨。
这一步我们才是真正的获取到用户给我们发送到消息。
这里没什么好说的,按照官方文档可以走得通。
最后说明一下cursor
这个参数,第一次可以不带,后续请求务必带上,该字段主要过滤已经接收过的消息,避免重复消费。
当然我们自己还要做些策略,不要全信官方!!
我这里将每次的msgid
做了存储。消费策略是先判断消息时长未超过30分钟->msgid未被记录(redis缓存msgid,30分钟超时)。
这里直接参照官方文档走即可,并没有什么坑踩。
并且官方支持日常聊天的所有消息格式:
msgtype | 说明 |
---|---|
text | 文本 |
image | 图片 |
voice | 语音 |
video | 视频 |
file | 文件 |
location | 地理位置 |
msgmenu | 菜单 |
event event_type=enter_session |
用户进入会话 |
event event_type=msg_send_fail |
消息发送失败 |
机器人这边我不做过多介绍,考虑到每个人选择不同(我自己是用阿里的客服机器人)。
面上看上去只有两个步骤,但根据公司业务需求,背后的逻辑可能会非常多,比如什么情绪判断,主动接入人工,拟人化话说等等。
最后我给出自己的部分设计方案,希望大家探讨,有不合理之处欢迎指正。感激不尽!
我这里设计了两个队列(用的是RabbitMQ):
WechatMsgHandler
队列处理。WechatMsgHandler这里我考虑的很近,是否要加这个队列,最后还是决定要加。
因为主动拉取消息列表这个操作的时候,很可能一次性拉到非常多的消息(假如100个人同时发给客服消息),明显的当前的这个消费者会处理非常久。其实10个人同时发就会明显受不了。
但如果我通过再加一个消息队列,进行分流处理,就不一样了。WechatIssueMsg的消费者仅仅只是遍历一边列表,根据消费策略过滤已消费的,下发未消费的。这个过程非常快。
后期只需要加WechatMsgHandler消费者就可以很轻松的增加单位时间内的处理量。