共计 3707 个字符,预计需要花费 10 分钟才能阅读完成。
获取 access_token
access_token 作为微信接口全局访问的唯一调用凭据,公众号调用各个接口时候都需要使用 access_token。
access_token 的存储至少要保留 512 个字符空间。access_token 的有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效。
注意:
access_token 尽量获取一次,然后各个地方调用即可,切勿多次请求接口获取,防止造成冲突。
文档原文如下:
获取方式
接口调用请求说明
https 请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
参数说明
参数
是否必须
说明
grant_type
是
获取 access_token 填写 client_credential
appid
是
第三方用户唯一凭证
secret
是
第三方用户唯一凭证密钥,即 appsecret
返回说明
正常情况下,微信会返回下述 JSON 数据包给公众号:
{“access_token”:”ACCESS_TOKEN”,”expires_in”:7200}
参数说明
参数
说明
access_token
获取到的凭证
expires_in
凭证有效时间,单位:秒
错误时微信会返回错误码等信息,JSON 数据包示例如下(该示例为 AppID 无效错误):
{“errcode”:40013,”errmsg”:”invalid appid”}
返回码说明
返回码
说明
-1
系统繁忙,此时请开发者稍候再试
0
请求成功
40001
AppSecret 错误或者 AppSecret 不属于这个公众号,请开发者确认 AppSecret 的正确性
40002
请确保 grant_type 字段值为 client_credential
40164
调用接口的 IP 地址不在白名单中,请在接口 IP 白名单中进行设置。(小程序及小游戏调用不要求 IP 地址在白名单内。)
代码实现
实体类
public class AccessToken {
private String expires_in; // 成功有效时间
private String access_token; // 普通 Token
private String errcode; // 失败 ID
private String errmsg; // 失败消息
private long expiresIn; // 过期时间,默认 2 小时
public long getExpiresIn() {
return expiresIn;
}
public void setExpiresIn(long expiresIn) {
this.expiresIn = expiresIn;
}
public String getExpires_in() {
return expires_in;
}
public void setExpires_in(String expires_in) {
this.expires_in = expires_in;
}
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public String getErrcode() {
return errcode;
}
public void setErrcode(String errcode) {
this.errcode = errcode;
}
public String getErrmsg() {
return errmsg;
}
public void setErrmsg(String errmsg) {
this.errmsg = errmsg;
}
/**
*
* @param expires_in 从微信服务器获取到的过期时间
* @param access_token 从微信服务器获取到的过期时间 access-token
*/
public AccessToken(String expires_in, String access_token) {
this.access_token = access_token;
// 当前系统时间 + 上过期时间
expiresIn = System.currentTimeMillis() + Integer.parseInt(expires_in) * 1000;
}
// 判断 token 是否过期
public boolean isExpired() {
return System.currentTimeMillis() > expiresIn;
}
}
HttpUtil 工具
/**
* @param url 发送 get 请求方法
* @return
*/
public static String sendHttpByGet(String url){
try {
URL urlGet = new URL(url);
URLConnection urlConnection = urlGet.openConnection();
InputStream is = urlConnection.getInputStream();
String inputStreamData = getInputStreamData(is);
return inputStreamData;
} catch (Exception e) {
logger.info(“ 发送 get 请求方法异常!” + e);
e.printStackTrace();
}
return null;
}
请求获取
public class AccessTokenTool {
static Logger logger = LoggerFactory.getLogger(AccessTokenTool.class);
// 自己的 appid 和 appsecret
private static final String APPID = “wxb24662xxxx”;
private static final String APPSECRET = “1864f91ecdd3xxxxxxxxxxx”;
// 用于存储 token
private static AccessToken at;
/**
* @return
* @throws Exception
*/
private static com.example.bwjf.demo.pojo.AccessToken getAccessToken(){
String accessTokenUrl = “https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET”;
accessTokenUrl = accessTokenUrl.replace(“APPID”,APPID).replace(“APPSECRET”,APPSECRET);
logger.info(” 微信全局 token 的 url ” + accessTokenUrl);
String message = HttpUtil.sendHttpByGet(accessTokenUrl);
/**
* 获取 access_token
* 成功返回的 json : {“access_token”:”ACCESS_TOKEN”,”expires_in”:7200}
* 失败放的 json : {“errcode”:40013,”errmsg”:”invalid appid”}
*
*/
JSONObject jsonObject = JSONObject.parseObject(message);
String accessToken = jsonObject.getString(“access_token”);
String expires_in = jsonObject.getString(“expires_in”);
String errcode = jsonObject.getString(“errcode”);
logger.info(“accessToken = ” + accessToken);
logger.info(“expires_in = “+ expires_in);
if(!jsonObject.containsKey(errcode)){
// 创建 token,并且存起来
at = new AccessToken(expires_in,accessToken);
return at;
}
return null;
}
/**
* 对外提供获取 AccessTokenTool
* @return
*/
public static String getToken(){
if(at==null || at.isExpired()){
//logger.info(“ 过期 ”);
try {
getAccessToken();
} catch (Exception e) {
e.printStackTrace();
}
}
return at.getAccess_token();
}
}
注:
认证后公众号,可能出现的问题调用 Api 无权限或者为空(开发者测试账号除外)
请在微信公众平台,安全中心设置 ip 白名单即可!