获取微信access_token 通过线程休眠定时获取微信access_token保证可用性及效率

微信服务号的access_token获取及使用方法

access_token有2个小时的时效性,要有一个机制保证最长2个小时重新获取一次
因为接口调用上限每天2000次,所以不能调用太频繁

基于以上2点

这里要处理的就是:系统启动时,初始化一个线程进行token的获取,在token过期之前就行再次获取。保证可用性。

首先:appid和appsercret要在测试号或者公众号中获取到

1,web.xml中配置一个servlet进行监听

<!-- 配置初始化获取微信权限token的servlet --> 
    <servlet>
    <servlet-name>initServlet</servlet-name>  
        <servlet-class>  
            com.xxx.weixin.InitServlet  
        </servlet-class>  
        <load-on-startup>0</load-on-startup>
    </servlet>

2,处理servlet并注入appid和appsecret参数启动线程

public class InitServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static Logger logger = LoggerFactory.getLogger(InitServlet.class);

    public void init() throws ServletException {
        logger.info("****初始化微信access_token获取****");
        try {
            logger.info("weixin api appid:" + WeiXinConstant.getAppid());
            logger.info("weixin api appsecret:" + WeiXinConstant.getAppsecret());
            if ("".equals(WeiXinConstant.getAppid()) || "".equals(WeiXinConstant.getAppsecret())) {
                logger.error("微信获取accessToken时 ,appid 和  appsecret无效。");
            } else {
                // 启动定时获取access_token的线程
                logger.info("****启动线程获取微信access_token");
                new Thread(new TokenThread()).start();
            }
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("获取微信access_token出错了===", e);
        }
    }
}

3,线程的实现最好在7000秒以内进行再次获取token

使用的时候 直接TokenThread.accessToken.getToken() 就ok了

public class TokenThread implements Runnable {
    private static Logger log = LoggerFactory.getLogger(TokenThread.class);
    public static AccessToken accessToken = WeiXinUtil.getAccessToken(WeiXinConstant.getAppid(), WeiXinConstant.getAppsecret());
    public void run() {
        log.info("--------------------TokenThread进来 了------------------------------");
        while (true) {
            try {
                    accessToken = WeiXinUtil.getAccessToken(WeiXinConstant.getAppid(), WeiXinConstant.getAppsecret());

                if (null != accessToken) {
                    log.info("微信获取access_token成功,有效时长{}秒 token:{}", accessToken.getExpiresIn(), accessToken.getToken());
                    // 休眠7000秒
                    Thread.sleep((accessToken.getExpiresIn() - 200) * 1000);
                } else {
                    log.info("微信获取access_token为空了,休眠60秒后重新获取。");
                    // 如果access_token为null,60秒后再获取
                    Thread.sleep(60 * 1000);
                }
            } catch (InterruptedException e) {
                try {
                    Thread.sleep(60 * 1000);
                } catch (InterruptedException e1) {
                    log.error("线程休眠出错=={}", e1.getMessage());
                }
                log.error("获取微信token线程出错=={}", e.getMessage());
            }
        }
    }
}

4,例:获取用户信息返回json

返回值:{“city”:”“,”country”:”中国”,”groupid”:0,”headimgurl”:”“…}

//获取openid参考上一篇
https://blog.csdn.net/alen_en/article/details/80944373
//获取用户信息
JSONObject jsonObject = WeiXinUtil.getUserInfo(TokenThread.accessToken.getToken(),openid);

具体方法

public static JSONObject getUserInfo(String accessToken, String openid) {

        String requestUrl = WeiXinConstant.userinfo_url.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openid);
        JSONObject jsonObject = httpRequest(requestUrl, "GET", null);
         return jsonObject;
    }

// 直接获取用户信息
public static String userinfo_url = “https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN“;

猜你喜欢

转载自blog.csdn.net/alen_en/article/details/80975014