概述
众所周知,在进行微信公众号的开发时,有一个比较关键的名词---access_token
这个东西是公众号的全局唯一接口调用凭据,并且公众号调用各接口时都需使用access_token。
例如自定义菜单的配置,客服接口发送消息,还有获取用户信息等一系列的操作,都需要使用。
access_token的获取上限:公众号未认证时,好像是有两千次的上限。认证后的公众号,他有100000次的上限。千万不要觉得100000次的上限很多,如果用户量很大,100000次的上限还是不够多。而每个access_token是有一个有效时长的,默认为2个小时(7200s)。所以,我们需要妥善保管这个access_token。
先和大家说一下我保存这个access_token的思路(我是存在数据库的):
1.首先,用户在调用需要access_token的接口的时候,先查询数据库里保存access_token的值是否存在。
2.如果access_token存在的话,判断此access_token是否有效。如果有效的话,直接返回此值。
3.如果没有效,则调用获取access_token的接口,再次获取,并且更改数据库中已经存在的access_token值。
4.接第一步骤,如果access_token不存在,则调用获取access_token的接口,将获取到的数据保存在数据库里。
基本上思路就是这样,现在和大家说一下怎么判断access_token值是否有效。
在请求获取access_token的接口时,如果请求成功,他会返回如下字段:
{"access_token":"ACCESS_TOKEN","expires_in":7200}
我们可以根据当前时间戳(注意是10位的),来加上那个7200,就是他的过期时间戳。如果保险一点的话,可以再把这个过期时间减上一分钟,或者五分钟。然后判断当前时间戳(10位)是否小于过期时间戳,就为有效。否则无效。
以上,就是我在处理access_token时所采用的方法,有什么不足希望大家指正,当然也可以保存在本地文件上,办法很多。
贴代码
AccessToken实体类:
public class AccessToken implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1775635938463800282L;
private int tokenId;
private String accessToken;
private int expiresIn;
private long expiresAfter;
public AccessToken() {
}
public AccessToken(String accessToken, int expiresIn, long expiresAfter, int tokenId) {
this.accessToken = accessToken;
this.expiresIn = expiresIn;
this.expiresAfter = expiresAfter;
this.tokenId = tokenId;
}
public int getTokenId() {
return tokenId;
}
public void setTokenId(int tokenId) {
this.tokenId = tokenId;
}
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public int getExpiresIn() {
return expiresIn;
}
public void setExpiresIn(int expiresIn) {
this.expiresIn = expiresIn;
}
public long getExpiresAfter() {
return expiresAfter;
}
public void setExpiresAfter(long expiresAfter) {
this.expiresAfter = expiresAfter;
}
}
AccessToken工具类:
public class AccessTokenUtils {
/**
* 获取当前时间戳,10位
* @return
*/
public static long getExpiresCurr() {
long currentTimeMillis = System.currentTimeMillis() /1000;
String expiresCurr = String.format("%010d", currentTimeMillis);
return Long.parseLong(expiresCurr);
}
/**
* 获取accessToken
* @param service
* @return
*/
public static String getAccessToken(IAccessTokenService service) {
// 查询数据库
AccessToken accessToken = service.getAccessToken();
long expiresCurr = getExpiresCurr();
// 判空
if (accessToken != null) {
long expiresAfter = accessToken.getExpiresAfter();
System.out.println("expiresCurr = " + expiresCurr + ",expiresAfter = " + expiresAfter);
// 判断accessToken是否有效
if (expiresCurr < (expiresAfter - 300)) {
System.out.println(1);
accessToken = service.getAccessToken();
return accessToken.getAccessToken();
} else {
System.out.println(2);
// 更改
updateToken(service, accessToken);
accessToken = service.getAccessToken();
return accessToken.getAccessToken();
}
} else {
// 如果为空
System.out.println(2222);
// 获取accessToken
getToken(service);
System.out.println(3333);
accessToken = service.getAccessToken();
return accessToken.getAccessToken();
}
}
/**
* 更改accesstoken的方法
* @param service
* @param accessToken
*/
private static void updateToken(IAccessTokenService service, AccessToken accessToken) {
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
String replace = url.replace("APPID", Constant.APP_ID).replace("APPSECRET", Constant.APP_SECRET);
CloseableHttpClient client = HttpClients.createDefault();
HttpGet get = new HttpGet(replace);
try {
CloseableHttpResponse execute = client.execute(get);
if (execute.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = execute.getEntity();
String result = EntityUtils.toString(entity, "UTF-8");
JSONObject jsonObject = (JSONObject) JSON.parse(result);
String access_token = jsonObject.getString("access_token");
Integer expiresIn = jsonObject.getInteger("expires_in");
if (access_token != null && expiresIn != null) {
long expiresCurr = getExpiresCurr();
long expiresAfter = expiresCurr + expiresIn;
accessToken.setExpiresAfter(expiresAfter);
accessToken.setAccessToken(access_token);
accessToken.setExpiresIn(expiresIn);
int addAccssToken = service.updateAccessToken(accessToken);
if (addAccssToken > 0) {
System.out.println("更改token成功");
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取accessToken的方法
* @param service
*/
public static void getToken(IAccessTokenService service) {
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
String replace = url.replace("APPID", Constant.APP_ID).replace("APPSECRET", Constant.APP_SECRET);
CloseableHttpClient client = HttpClients.createDefault();
HttpGet get = new HttpGet(replace);
try {
CloseableHttpResponse execute = client.execute(get);
if (execute.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = execute.getEntity();
String result = EntityUtils.toString(entity, "UTF-8");
System.out.println(result);
JSONObject jsonObject = (JSONObject) JSON.parse(result);
String access_token = jsonObject.getString("access_token");
Integer expiresIn = jsonObject.getInteger("expires_in");
if (access_token != null && expiresIn != null) {
long expiresCurr = getExpiresCurr();
long expiresAfter = expiresCurr + expiresIn;
System.out.println("expiresAfter = " + expiresAfter);
AccessToken accessToken = new AccessToken();
accessToken.setExpiresAfter(expiresAfter);
accessToken.setAccessToken(access_token);
accessToken.setExpiresIn(expiresIn);
int addAccssToken = service.addAccssToken(accessToken);
if (addAccssToken > 0) {
System.out.println("获取token成功");
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
调用accessToken:
String accessToken = AccessTokenUtils.getAccessToken(tokenService);
基本上就是这些,有什么问题请指正,有什么疑惑请留言。谢谢~
最后
以上就是醉熏雨为你收集整理的java-微信公众号开发之获取accessToken的全部内容,希望文章能够帮你解决java-微信公众号开发之获取accessToken所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复