前言
官方文档地址开始开发 / 获取 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();
}
}