持续获取微信接口的access_token

access_token是公众号的全局唯一接口调用凭据,

公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。

access_token的存储至少要保留512个字符空间。

access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

access_token每日调用上限次数是2000次/日。

解决:

如何保证access_token一直都有效?

微信公众平台开发文档
https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html

接口请求方式
https请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

注意!!!

本文中获取access_token值会调用一个工具类,需要相关的核心包,当然也有其他方式发送请求来获取,如有需要可以练习我共同探讨
我的个人QQ:1285906731


image.png

方案一:

在项目启动时开启一个循环线程来获取access_token,获取完毕以后让线程休眠,休眠结束有再次重写获取access_token,以此来实现定时获取access_token

一、自定义一个线程类
public class AccessTokenThread extends Thread {

    //access_token值
    public static String ACCESS_TOKEN_VAL;

    @Override
    public void run(){

        //死循环,使线程在项目启动以后一直运行,并定时获取access_token值
        while (true){

            //获取access_token值并赋值给全局变量
            ACCESS_TOKEN_VAL = this.getAccessToken();

            try {//线程睡眠2小时,也就是每隔俩小时获取一次access_token
                Thread.sleep(1000*60*50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    //获取微信access_token
    private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";

    public String getAccessToken(){

        //将地址中的appId和appSecret替换为自己真实微信测试账号中的对应值
        String url = ACCESS_TOKEN_URL.replace("APPID", MenuManager.appId).replace("APPSECRET",MenuManager.appSecret);

        //调用工具类发送请求,返回json数据,返回的数据中就包含了access_token值
        JSONObject json = WeixinUtil.httpRequest(url,"GET",null);

        System.out.println(json.toString());

        return json.getString("access_token");
    }

}
二、创建一个监听器,使项目启动时就创建线程并运行
//监听器
@Component
public class AccessTokenListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {

        //启动线程获取token
        new AccessTokenThread().start();

    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {

        System.out.println("销毁");

    }

}

三、此时启动项目,创建的线程会定时发送请求获取access_token值进行打印
image.png

方案二:

将获取到的access_token值存入Redis数据库中,并设置过期时间,这样每次到数据库中查询access_token值,如果过去不存在就重新发送请求获取access_token值

一、整合Redis,启动Linux系统并启动dockers Redis ,使其保持连接
二、创建一个类,获取access_token值,存入数据库并设置过期时间
@Component
public class AccessTokenRedis {

    //access_token值
    private static final String REDIS_KEY_ACCESS_TOKEN = "access_token:val";

    @Autowired
    private RedisTemplate redisTemplate;

    public String getAccessTokenValRedis(){

        //如果数据库中access_token的key值不为空,返回value值
        if(redisTemplate.hasKey(REDIS_KEY_ACCESS_TOKEN)){
            return (String) redisTemplate.opsForValue().get(REDIS_KEY_ACCESS_TOKEN);
        }else {
            //获取access_token值
            String result = getAccessToken();
            //存入Redis
            redisTemplate.opsForValue().set(REDIS_KEY_ACCESS_TOKEN,result);
            //设置两小时过期时间
            redisTemplate.expire(REDIS_KEY_ACCESS_TOKEN,5, TimeUnit.SECONDS);
            //返回结果
            return result;
        }
    }


    //获取微信access_token
    private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";

    private String getAccessToken(){

        String url = ACCESS_TOKEN_URL.replace("APPID", MenuManager.appId).replace("APPSECRET",MenuManager.appSecret);

        JSONObject json = WeixinUtil.httpRequest(url,"GET",null);

        System.out.println(json.toString());

        return json.getString("access_token");
    }
}

这样,每次调用getAccessTokenValRedis方法时就会查询Redis数据库,一旦发现access_token过期就向微信平台发送请求重新获取

你可能感兴趣的:(持续获取微信接口的access_token)