微信公众号开发中的access_token 是调用微信接口的唯一凭证,每次成功调用都会使上次的失效;每次调用次数限制为2000,每一个access_token的时长为7200s(2小时);
下图为微信公众平台的官方文档:

我们这时就需要解决access_token的有效时间,思路有两个:
1.定时获取access_token ,将其保存在内存中;
2.定时获取access_token,将其保存到数据库中;
在sprigBoot下的定时任务很简单,实例如下:
先创建一个task类,负责将获取到的access_token 保存到内存中:
/**
* 微信的accessToken有效时间为两个小时,调用微信接口很多都要用到accessToken所以需要将accessToken保存(保存到内存中或者保存到数据库中)这里使用保存到内存中的方式实现
*/
package com.b505.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import com.b505.weixin.pojo.WeixinAccessToken;
import com.b505.weixin.util.WeixinCommenUtil;
import com.b505.weixin.util.WeixinConstants;
/**
* <p>Company: B505信息技术研究所 </p>
* @Description: 定时获取微信accessToken(7100s)保存到内存中
* @Create Date: 2017年10月23日上午10:47:32
* @Version: V1.00
* @Author: 追到乌云的尽头找太阳
*/
@Component
public class WeixinAccessTokenTask {
Logger logger = LoggerFactory.getLogger(WeixinAccessTokenTask.class);
@Autowired
private WeixinCommenUtil weixinCommenUtil;
// 第一次延迟1秒执行,当执行完后7100秒再执行
@Scheduled(initialDelay = 1000, fixedDelay = 7000*1000 )
public void getWeixinAccessToken(){
try {
String token = weixinCommenUtil.getToken(WeixinConstants.APPID, WeixinConstants.APPSECRET).getAccess_token();
WeixinAccessToken.setToken(token);
logger.info("获取到的微信accessToken为"+token);
} catch (Exception e) {
logger.error("获取微信adcessToken出错,信息如下");
e.printStackTrace();
this.getWeixinAccessToken();
// 此处可能陷入死循环
}
}
}
这里需要注意的是使用了一个@Component注解,将其标注为一个bean ,注册到Spring容器中; 一个@Scheduled(initialDelay = 1000, fixedDelay = 7000*1000 ) 注解标注此为一个定时任务,第一次延迟1秒执行,然后每7100s执行一次,但是此时定时任务并不能真正执行,需要开启定时任务,找到程序的入口,有@SpringBootApplication注解的启动类,添加@EnableScheduling注解开启定时任务;就可以在SpringBoot项目中开启定时任务了;
/**
* SpringBoot程序的启动入口
*/
package com.b505;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* <p>Company: B505信息技术研究所 </p>
* @Description: 程序的入口(一些需要在程序启动就需要加载的配置)
* @Create Date: 2017年9月14日下午1:11:05
* @Version: V1.00
* @Author: 追到乌云的尽头找太阳
*/
@SpringBootApplication // 组合注解,加载SpringBoot
@EnableScheduling // 开启定时任务
public class SpringBootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
}
}
此时在SpringBoot中开启定时任务就完成了;
获取access_token 的代码如下:
/**
* 微信公用操作的类,获取accessToken
*/
package com.b505.weixin.util;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.b505.util.HttpRequestUtil;
import com.b505.weixin.pojo.AccessToken;
/**
* <p>Company: B505信息技术研究所 </p>
* @Description: 微信公用和常用的操作类
* @Create Date: 2017年10月18日下午2:07:56
* @Version: V1.00
* @Author: 追到乌云的尽头找太阳
*/
@Component
public class WeixinCommenUtil {
Logger logger = LoggerFactory.getLogger(WeixinCommenUtil.class);
@Autowired
private HttpRequestUtil httpRequestUtil;
// 获取access_token的接口地址(GET) 限2000(次/天)
private static String url=WeixinConstants.ACCESS_TOKEN_URL;
public AccessToken getToken(String appid, String appsecret){
AccessToken token=null;
//访问微信服务器的地址
String requestUrl=url.replace("APPID", appid).replace("APPSECRET", appsecret);
//HttpRequestUtil httpRequestUtil=new HttpRequestUtil();
//创建一个json对象
JSONObject json =httpRequestUtil.httpsRequest(requestUrl,"GET",null);
System.out.println("获取到的json格式的Token为:"+json);
//判断json是否为空
if (json!=null){
try{
token=new AccessToken();
//将获取的access_token放入accessToken对象中
token.setAccess_token(json.getString("access_token"));
//将获取的expires_in时间放入accessToken对象中
token.setExpires_in(json.getInt("expires_in"));
}
catch (Exception e){
token=null;
e.printStackTrace();
System.out.println("系统出错了!");
}
}else {
token=null;
// 获取token失败
logger.error("获取token失败 errcode:{} errmsg:{}");
}
return token;
}
}
获取access_token 的url为:
https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

运行后如下:

这里定时任务已经执行,并且已经获取到了access_token,为了增强效果可以将时间改为每5秒获取一次
// 第一次延迟1秒执行,当执行完后5秒再执行
@Scheduled(initialDelay = 1000, fixedDelay = 5000 )
,效果如下:

根据时间间隔可以看出每5秒获取一次access_token;
这是将access_token 保存到内存中;

本文介绍了一种在SpringBoot环境下定时获取并管理微信公众号access_token的方法,通过将access_token保存在内存中,确保了微信接口调用的有效性和时效性。
4828

被折叠的 条评论
为什么被折叠?



