1、玩过微信公众号开发的人都知道access_token的重要性,基本上的接口调用都需要这玩意儿,自己写demo的时候可以手动获取,需要的时候获取一下。但是如果在项目中,手动获取就不好了。这边博客主要介绍在项目中如何获取access_token和管理access_token。
2、基本流程
注:获取access_token,判断是否为空,为空3秒获取一次,不空90分钟获取一次,每次获取的access_token,放在一次整个项目都可以访问的池子中。
2.1 具体实现
获取accessToken:AccessTokenThread,这个类主要是用于获取access_token
import com.google.gson.Gson;
import com.wechat.common.parameter.Parameter;
import com.wechat.common.util.Request;
/**
* accessToken线程类
*
* @author WRY
*
*/
public class AccessTokenThread implements Runnable {
// 微信获取accessToken接口
private static String ACCESSTOKENURL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appId}&secret={appSecret}";
public void run() {
while (true) {
String accessToken = getAccessToken();
if (null != accessToken && !accessToken.trim().equals("")) {
Parameter.ACCESSTOKEN = accessToken;
System.out.println(accessToken);
try {
Thread.sleep(1000 * 5400);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
try {
Thread.sleep(1000 * 3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 获取access_Token
*
* @return
*/
public static String getAccessToken() {
String url = ACCESSTOKENURL.replace("{appId}", Parameter.APPID).replace("{appSecret}", Parameter.APPSECRET);
String accessTokenJsonStr = Request.httpGet(url);
Gson gson = new Gson();
AccessToken accessToken = gson.fromJson(accessTokenJsonStr, AccessToken.class);
return accessToken.getAccess_token();
}
}
其中appid和appsercret是自己公众号的两个参数替换一下即可。我是用静态的变量存放数据的,这个静态的数据在整个工程中是有效的(注:自己用junit和main测试是取不到这个值的,静态变量的作用域可以理解为一个main函数入口下的工程共享)。下面是我的保存方式:parameter类是我用来存放所有参数的一个类,ACCESSTOKEN变量是静态的。
Parameter.ACCESSTOKEN = accessToken;
Request工具类,用httpclient封装。
/**
* 用来发送请求
* @author WRY
*
*/
public class Request {
/**
* get 请求
*
* @param url
* @return
*/
public static String httpGet(String url) {
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
RequestConfig config = RequestConfig.custom().setConnectionRequestTimeout(5000).setConnectTimeout(5000)
.setSocketTimeout(5000).build();
HttpGet httpGet = new HttpGet(url);
httpGet.setConfig(config);
String soundCode = null;
CloseableHttpResponse httpResponse = null;
try {
httpResponse = httpClient.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
HttpEntity entity = httpResponse.getEntity();
soundCode = EntityUtils.toString(entity, "utf-8");
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (httpResponse != null) {
try {
httpResponse.close();
httpResponse = null;
} catch (IOException e) {
}
}
if (httpClient != null) {
try {
httpClient.close();
httpClient = null;
} catch (IOException e) {
}
}
}
return soundCode;
}
}
3、有了上面的工具,就可以获取access_token了,下面还有一个关键的点就是何时何地启动这个线程。根据实际需要启动肯定是要在接口访问之前,根据这个需求,我们可以放在至少两种地方:一、放在监听器中。 二、放在一个单独的servlet的init方法中。这样就可以保证项目启动了,access_token就有值了
下面以放在监听器中为例
构造一个监听器
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* 监听器
* @author WRY
*
*/
public class AccessTokenlistener implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
// 启动accessToken获取线程
new Thread(new AccessTokenThread()).start();
}
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("监听器销毁ֹ");
}
}
在web.xml中配置监听器
<!-- 获取accessToken的监听器 -->
<listener>
<listener-class>com.wechat.common.accesstoken.AccessTokenlistener</listener-class>
</listener>
好了上述就可以实现在项目启动的时候,获取access_token的值,并且每个90分钟自动获取。确保每次获取的值都是有效的。