java优化获取微信公众号的accessToken

想必大家也知道accessToken每天只能调用2000次 那么频繁的调用会是accessToken不够用
获取accessToken的官方文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183

接下来我就简单的对这种方法进行一点优化

首先定义accessToken实体类


/**
 * accesstoken 实体类
 * 
 * @author Administrator
 *
 */
public class AccessToken {

	private String accessToken;// 获取到的凭证
	private int expiresin;// 凭证有效时间 单位:秒

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

}

接下来就是声明一个静态类 来存放获取到的accessToken

/**
 * 用于存放生成的accesstoken
 * 
 * @author Administrator
 *
 */
public class AccessTokenInfo {
	// 注意是静态的
	public static AccessToken accessToken = null;
}

接下来定义一个servlet来获取assessToken

/**
 * 用于获取accessToken的Servlet
 * 
 * @author Administrator
 *
 */
@WebServlet(name = "AccessTokenServlet", urlPatterns = { "/AccessTokenServlet" }, loadOnStartup = 1, initParams = {
		@WebInitParam(name = "appId", value = "wx**********"),//对应公众号的appid
		@WebInitParam(name = "appSecret", value = "*************") })//对应公众号的appSecret
public class AccessTokenServlet extends HttpServlet {

	// 定义log4j输出
	Logger logger = Logger.getLogger(this.getClass());

	@Override
	public void init() throws ServletException {
		super.init();
		//获取定义的公众号信息
		final String appId = getInitParameter("appId");
		final String appSecret = getInitParameter("appSecret");
		new Thread(new Runnable() {
			@Override
			public void run() {
				while (true) {
					try { // 获取accessToken
						AccessTokenInfo.accessToken = getAccessToken(appId, appSecret); // 获取成功
						if (AccessTokenInfo.accessToken != null) {
							System.out.println(AccessTokenInfo.accessToken.getAccessToken());
							Thread.sleep(7000 * 1000);
							// Thread.sleep(10 * 1000);// 10秒钟获取一次
						} else { // 获取失败
							Thread.sleep(1000 * 3);
							// 获取的access_token为空 休眠3秒
						}
					} catch (Exception e) {
						logger.error("获取accessToken异常:" + e);
						try {
							Thread.sleep(1000 * 10);
							// 发生异常休眠10秒
						} catch (Exception e1) {
							logger.error("线程休眠异常:" + e1);
						}
					}
				}
			}
		}).start();
	}

	/**
	 * 获取access_token
	 *
	 * @return AccessToken
	 */
	private AccessToken getAccessToken(String appId, String appSecret) {
		/**
		 * 接口地址为https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET,其中grant_type固定写为client_credential即可。
		 */
		// 获取基础接口的token 微信公众号的 appid和secret
		String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret="
				+ appSecret;
		// 调用请求方法
		String json = urlToJson(url);
		// 把获取的数据转换为json格式
		JSONObject json1 = JSONObject.parseObject(json.toString());
		// 获取access_token
		// String access_token = json1.get("access_token").toString();
		AccessToken token = new AccessToken();
		token.setAccessToken(json1.getString("access_token"));
		token.setExpiresin(json1.getInteger("expires_in"));
		return token;
	}

	/**
	 * 对url发送请求并获取返回的数据
	 * 
	 * @param url
	 * @return
	 */
	public String urlToJson(String url) {
		StringBuffer json1 = new StringBuffer();
		try {
			URL oracle = new URL(url);
			URLConnection yc = oracle.openConnection();
			BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream(), "utf-8"));
			String inputLine = null;
			// StringBuffer json1 = new StringBuffer();
			while ((inputLine = in.readLine()) != null) {
				json1.append(inputLine);
			}
		} catch (Exception e) {
			logger.error("Exception url请求错误", e);
		}
		return json1.toString();
	}
}

这样就可以在项目启动的时候获取一次accessToken 然后接下来每两小时获取一次

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值