玩转微信公号开发(八)——消息的排重与回复

随着微信公号系统的逐步完善,原来的许多机制都得到了升级、增强,这可以让我们公众号的表现更稳定,但有时,也会给我们带来一下麻烦,比如下面这段微信文档新增的内容

————————————————
微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次,如果在调试中,发现用户无法收到响应的消息,可以检查是否消息处理超时。

关于重试的消息排重,有msgid的消息推荐使用msgid排重。事件类型消息推荐使用FromUserName + CreateTime 排重。

假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。 这种情况下,可以使用客服消息接口进行异步回复。
————————————————

首先,如果后端没有复杂的逻辑,5秒足够了,但是如果不能保证5秒内回复消息,就只能调客服消息接口了,可惜客服接口属于高级接口,订阅号是没有的(坑爹啊!),并且,即使是订阅号,客服消息的限制也挺多

另外,所谓的“断掉连接,重新发起请求”并不靠谱,我自己扫码或者点按钮后就经常会收到重复消息,也就是说,第一个请求还没结束,的二个请求可能就来了。。。

综合这两点,我们其实可以搭建一种这样的回复方式:

一个消息来了以后,首先根据微信文档里提到的排重方式,比如使用fromusername/msgid/event/count/createtime做md5,作为key,来标示这个消息,在这个请求内,处理相关的业务逻辑,但处理结果不在这个消息内回复,而是放到类似redis的缓存内

再有消息来时,由于同一个消息重复发送,key也是相同的,首先检查redis有没有该消息key的回复内容存在,如果有,直接回复,如果没有,再走上面的逻辑

这样子,不但可以排重,还可以为自己的业务逻辑多争取些处理时间

 

————

转载请注明出处:http://www.jiangkl.com/2014/03/重复消息/ ‎

 

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

*