天天看点

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

众所周知,在进行微信公众号的开发时,有一个比较关键的名词---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 {

public static long getExpiresCurr() {

long currentTimeMillis = System.currentTimeMillis() /1000;

String expiresCurr = String.format("%010d", currentTimeMillis);

return Long.parseLong(expiresCurr);

}

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();

}

}

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();

}

}

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);

基本上就是这些,有什么问题请指正,有什么疑惑请留言。谢谢~