今天有好多小伙伴问到了我关于微信AccessToekn怎么避免失效的问题,前段时间也有人问过,那今天就一起讲了吧,首先我们要了解AccessToken在API中的作用
AccessToken时效:7200s
获取AccessToekn的参数:公众号(appid,secret)2000次/每日、企业号(corpid,corpsecret)次数限制API没说明
当中企业号API有这样一说:
AccessToken是企业号的全局唯一票据,调用接口时需携带AccessToken。
AccessToken需要用CorpID和Secret来换取,不同的Secret会返回不同的AccessToken。正常情况下AccessToken有效期为7200秒,有效期内重复获取返回相同结果,并自动续期
似乎企业号是自动续期的,今天先不管这个,反正不影响程序使用,首先说说具体思想,因为AccessToekn的时效性是7200s,所以我们只需要给定两个写死的获取凭证的参数,
之后判断这2个参数是否有取到,没有值就需要自行配置,之后启动一个线程,传参(初始值)给新起的线程,之后写一个死循
环,执行一次获取,对获取到的对象实例进行一次判断
如果值为null,那就调用线程休眠,具体休眠时间看自己情况并且结合API计算,因为是死循环,所以当第二次取到值的时
候,就又一次进行了判断,当然这次不可能为null,除非
你的参数有问题,这时候我们就不需要在次继续执行下去了,我们需要休眠线程,因为值已经取到了,根据API说明,7200s
的时效性,每天2000次调用频率,其实2000次数足够
我们调用了,7200/3600=2h, 24/2h=12 ,每天12次就OK了,更何况是2000次呢?那我们就让线程休眠7000+s,之后的时间
(7200-7000)剩下200+s左右,这200+s里我们重新唤
醒线程开始对值判断,然后200+s我们又可以合理管理调用时间间隔,以自己的情况为准,这样就完全可以避免
AccessToekn的失效了
接下来说说参数配置的问题,我们在web.xml里需要配置如下几个参数,作为线程启动且获取凭证的映射
<servlet> <servlet-name>InitAccessTokenServlet</servlet-name> <servlet-class> engineerjsp.accesstoken.util.InitAccessTokenServlet </servlet-class> <init-param> <param-name>appid</param-name> <param-value>你的appid</param-value> </init-param> <init-param> <param-name>appsecret</param-name> <param-value>你的appsecret</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet>
Servlet-name ,Servlet-class就不说了,分别在你的init-param 属性下配置好appid,appsecret,load-on-startup 为0 就是当这个服务启动时,InitAccessTokenServlet就自动
启动,并且同时启动线程服务
1)通过配置<init-param>向Servlet中传入参数
2)通过配置<load-on-startup>使得Web服务器启动时就加载该Servlet
3)没有配置<servlet-mapping>因为InitServlet并不对外提供访问
以上就是大致的思想,具体代码稍后附上地址,有需要的朋友自行下载,不懂得及时在本博留言,不要QQ找我,因为基本上不会回,白天要上班,希望大家理解下
下面看看测试效果,线程效果本地检测图(故意给了错误逻辑,看执行效果):
服务器(本地)测试,服务开启之后,log打印日志:
正常测试值,我这里是6s执行一次,当且仅当休眠时间过了7000s之后,唤醒线程,且剩余的200+s,每间隔6s,执行一次凭证获取,大致思想就这么多,我附上Dome,
下载地址:http://download.csdn.net/detail/jspping/8249643
还是那句话:不懂得及时在本博留言,不要QQ找我,因为基本上不会回,白天要上班,希望大家理解下~