wechat-0011,微信公众号,access_token的获取与管理

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分钟自动获取。确保每次获取的值都是有效的。





猜你喜欢

转载自blog.csdn.net/wrongyao/article/details/80276888