一般申请了公众号的想要快速部署投入应用的,可以使用微信公众号平台自带的消息自动回复等功能,但是不能对用户发来的消息进行处理,所以我们会使用程序对接微信公众号进行微信公众号开发。
于是大家可能都会遇到这个问题--微信为了保证用户的体验度,不肯能让你长时间处理消息而不回复用户的,所以有了这个5秒消息自动回复限制,每5秒微信服务器未收到我们程序返回任何的消息会进行二次消息推送,共三次,第三次还未返回消息,用户就会收到一条“该公众号提供的服务出现异常”的提示。
解决方法:
提示:当微信服务器发来第二次推送后,第一次推送的返回消息已经没用了,所以我们可以对要回复的消息进行缓存,等真正回复的时候再拿出来。
建一个全局缓存,(java例子)用map作为缓存类型,以时间戳作为key,value可以自行定义,方便自己识别就好,我的做法是用map,这样可以用MsgId作为key,value就存首次返回的消息内容。然后设定一个定时处理器,每10分钟(依据数据量)清除缓存中过期的数据。
但是有两个限制条件:
(1):必须保证处理消息在15秒内完成 (认证的订阅号或服务号可以用客服接口48小时内进行回复)
(2):为了让业务逻辑不受影响,对该处理消息的方法进行同步限定(这样能保证第一次的回复内容能够在第二次或第三次消息处理前进行缓存,但是损害了并发性,注意这里的同步限定不要放在全局的接收方法上,哪种消息处理需要5秒以上的另提取方法出来,这样不影响其它处理时间5秒内的消息的并行了)
简略流程图: