您的位置:首页 > 移动开发 > 微信开发

java-微信公众号开发之获取accessToken

2018-01-15 12:11 423 查看
众所周知,在进行微信公众号的开发时,有一个比较关键的名词---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 access_token