前言
官方文档地址开始开发 / 获取 Access token
微信公众号开发中绝大多数接口调用都需要带上access_token这个参数,这个参数是7200秒过期,但是如果业务量稍微大一点,每次都从微信服务器获取一次的话,获取的次数是不够的,每天获取access_token的次数是有限的,所以我们不能每次使用接口都获取一次,我们需要进行一个存储和超时监测。
获取原始的Token回显
我们需要进行一个GET请求,可以直接浏览器进行一下尝试,APPID和APPSECRET需要填写你自己真实的(或者测试号的)一个字符串
你需要对这个URL进行一次GET请求,https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
一切正常的话你会出现一个这样子的JSON回显,access_token就是你需要的那个字符串,expires_in代表有效期为7200秒
{ "access_token": "73__tC83-IVcgP_p2Fdj78uXCTDKqbMyLqa7BBK_zcLHCYSB3ct3bDIE77X7Mba8mfjomkZuuqWPvOnQTu-ZVWk0M9UPdEAHyhFV2_-zG48G7RznKmmYP8ymwdvXToCUGjABAIAM", "expires_in": 7200 }
AccessToken存储类
由于每天的调用次数有限,我们是需要本地存着它,过期再获取
我们需要定义一个类,这个类有两个参数,一个是字符串类型的token,一个是超时时间expireTime
我们直接将超时时间设置成当前时间加上默认的超时时间,微信返回的json结构中的expires_in为单位为秒的7200,而java中时间的默认值为long类型的一个毫秒值,所以我们改写这个SetExpireTime
public void setExpireTime(long expireIn) { this.expireTime = System.currentTimeMillis() + expireIn * 1000; }
我们再写一个方法用于判断token是否超时
public boolean isExpired() { return System.currentTimeMillis() > this.expireTime; }
完整的类代码
package cn.omvn.domain.wechat; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * 2023-10-05 * 栋dong */ public class WechatAccessToken { private String token; private long expireTime; public void setExpireTime(long expireIn) { this.expireTime = System.currentTimeMillis() + expireIn * 1000; } public boolean isExpired() { return System.currentTimeMillis() > this.expireTime; } public String getToken() { return token; } public void setToken(String token) { this.token = token; } public long getExpireTime() { return expireTime; } }
获取AccessToken的工具类
这个工具类有唯一的作用就是获取微信公众号的AccessToken,需要三个参数,一个就是刚刚定义的AccessToken存储类,一个是appID,还有appsecret,这两个参数最好从配置文件中获取。
这个类中需要有两个方法,一个是私有的通过GET请求获取token并且设置token和超时时间,JAVA进行GET请求可以通过这篇文章写一个静态的工具类
你需要用string的format方法进行字符串拼接,把APPID和APPSECRET进行拼接
String url = String.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", appID, appsecret);
一个是公共的供外部调用GetToken,在里面判断token为空或者token已经超时的话,调用私有的方法重新获取一下token,然后进行返回
package cn.omvn.utils; /** * 2023-10-05 * 栋dong */ import cn.omvn.domain.wechat.WechatAccessToken; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class WechatToken { @Value("${wechat.appID}") private String appID; @Value("${wechat.appsecret}") private String appsecret; private static WechatAccessToken wechatAccessToken = new WechatAccessToken(); private void getToken() { String url = String.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", appID, appsecret); System.out.println("公众号的APPID为:"+appID); System.out.println("公众号的appsecret为:"+appsecret); System.out.println("进行获取token的url为:"+url); try { String response = HttpUtil.doGet(url); JSONObject jsonObject = JSON.parseObject(String.valueOf(response)); // 访问解析后的数据 String Token = jsonObject.getString("access_token"); long expiresIn = jsonObject.getLong("expires_in"); wechatAccessToken.setToken(Token); wechatAccessToken.setExpireTime(expiresIn); } catch (Exception e) { e.printStackTrace(); } } public String GetToken(){ if(wechatAccessToken == null || wechatAccessToken.isExpired()){ this.getToken(); } return wechatAccessToken.getToken(); } }