中控服务器accesstoken

 access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

1、为了保密appsecrect,第三方需要一个access_token获取和刷新的中控服务器。而其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则会造成access_token覆盖而影响业务;
2、目前access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。
中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器对外输出的依然是老access_token,此时公众平台后台会保证在刷新短时间内,新老access_token都可用,这保证了第三方业务的平滑过渡;
3、access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。

简单起见,使用一个随servlet容器一起启动的servlet来实现获取access_token的功能,具体为:因为该servlet随着web容器而启动,在该servlet的init方法中触发一个线程来获得access_token,该线程是一个无线循环的线程,每隔2个小时刷新一次access_token。相关代码如下:
1)servlet代码
?
public class InitServlet extends HttpServlet
{
     private static final long serialVersionUID = 1L;
 
     public void init(ServletConfig config) throws ServletException
     {
         new Thread( new AccessTokenThread()).start(); 
     }
 
}

 2)线程代码

?
public class AccessTokenThread implements Runnable
{
     public static AccessToken accessToken;
     
     @Override
     public void run()
     {
         while ( true )
         {
             try {
                 AccessToken token = AccessTokenUtil.freshAccessToken(); // 从微信服务器刷新access_token
                 if (token != null ){
                     accessToken = token;
                 } else {
                     System.out.println( "get access_token failed------------------------------" );
                 }
             } catch (IOException e){
                 e.printStackTrace();
             }
             
             try {
                 if ( null != accessToken){
                     Thread.sleep((accessToken.getExpire_in() - 200 ) * 1000 );    // 休眠7000秒
                 } else {
                     Thread.sleep( 60 * 1000 );    // 如果access_token为null,60秒后再获取
                 }
             } catch (InterruptedException e){
                 try {
                     Thread.sleep( 60 * 1000 );
                 } catch (InterruptedException e1){
                     e1.printStackTrace();
                 }
             }
         }
     }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值