微信公众号开发----获取access_token,定时刷新access_token

首先先查看微信公众技术文档之获取access_token,了解各参数含义

前提:获取到公众号的AppId和AppSecret

一、常量类

/**
 * 公众号相关
 */
public class WechatConst {

    //公众号的唯一标识
    public static final String appId = "appId";
    //公众号的appsecret
    public static final String appSecret = "appSecret";
     //accessToken
    public static String ACCESS_TOKEN = "";
    
    /**
     * 获取access_token的URL
     */
    public static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";

    }

二、创建实体类
AccessToken

/**
 * 封装AccessToken实体
 */
public class AccessToken {

    private String accessToken;
    private int expiresIn;

    public String getAccessToken() {
        return accessToken;
    }

    public void setAccessToken(String accessToken) {
        this.accessToken = accessToken;
    }

    public void setExpiresIn(int expiresIn) {
        this.expiresIn = expiresIn;
    }

    public int getExpiresIn() {
        return expiresIn;
    }
}

三、工具类
用于发送POST或GET请求:HttpUtil类

四、定时刷新

import com.alibaba.fastjson.JSONObject;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 * 定时刷新accessToken
 */
public class AccessTokenRefresher {

        private static Logger log = LogManager.getLogger(AccessTokenRefresher.class);
        private int organizationId;
        private Thread listener;

        public static final AccessTokenRefresher me = new AccessTokenRefresher();

        public void start(){
            //获取各个机构的AccessToken并定时更新
            List<Organization> organizations =Organization.dao.find(SQL.SELECT_ALL_ORGANIZATION_ID);
            for (Organization organization:organizations){
                start(organization.getId());
            }
        }

        public void start(int id){
            this.organizationId = id;
            listener = new Thread(()->refresh());
            listener.setName("access_token_thread_"+id);
            listener.start();
        }

        public void refresh() {
            int retryTimes = 0;
            while (true) {
                AccessToken accessToken = getAccessToken(organizationId);
                if (null != accessToken) {
                    AccessTokenRedisDao.set(accessToken.getAccessToken(),organizationId);
                    try {
                        Thread.sleep((accessToken.getExpiresIn()-200)*1000);//休眠7000秒
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    retryTimes = 0;
                } else {
                    // 当accessToken获取不成功时重试1次
                    if (retryTimes >=  1) {
                        break;
                    }
                    retryTimes += 1;
                }
            }
        }

        /**
         * 获取access_token
         * @return
         */
        private AccessToken getAccessToken(int organizationId){
            Organization organization = Organization.dao.findById(organizationId);
            //公众号的唯一标识
            String appId = organization.getSubscriptionId();
            //公众号的appsecret
            String appSecret = organization.getSubscriptionKey();
            AccessToken accessToken = new AccessToken();
            String url = WechatConst.ACCESS_TOKEN_URL.replace("APPID" ,appId).replace("APPSECRET",appSecret);
            JSONObject jsonObject =  HttpsUtil.request(url, "GET", null);
            if(jsonObject !=null){
                Integer errCode = jsonObject.getInteger("errcode");
                if (errCode == null) {
                    accessToken.setAccessToken(jsonObject.getString("access_token"));
                    accessToken.setExpiresIn(jsonObject.getInteger("expires_in"));
                }else {
                    log.warn("获取access_token失败:"+jsonObject.toJSONString());
                    return null;
                }
            }
            return accessToken;
        }

   		public void shutdown(){
     	   listener.interrupt();
    	}

}

五、项目启动后开启定时刷新

本人使用的框架为Jfinal:

 public void afterJFinalStart() {
      //定时刷新accessToken
      AccessTokenRefresher.me.start();
 }
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值