全文目录,一步到位
- 1.前言简介
- 1.1 专栏传送门
- 1.1.1 上文小总结
- 1.1.2 上文传送门
- 2. springboot获取accessToken
- 2.0 accessToken简介
- 2.1 准备工作
- 2.2 具体代码使用与注释如下
- 2.2.1 代码解释(一)[无需复制]
- 2.2.2 代码解释(二)[无需复制]
- 2.3 最后一步 获取accessToken
- 2.3.1 两行代码搞定
- 2.3.2 微信小程序异常码(如图所示)
- 3. 文章的总结与预告
- 3.1 本文总结
- 3.2 下文预告
1.前言简介
access_token是有
次数限制
的一天2000次
超过了需要刷新accessToken
限制次数,10次/月
1.1 专栏传送门
1.1.1 上文小总结
上文为核心文章
, 请先复制上文的代码
后再复制此篇代码
里面是对微信小程序大部分操作的总结与封装
1.1.2 上文传送门
===> 微信小程序00: 获取accessToken,手机号, 小程序二维码,openId与unionId 公共配置类(核心篇)
2. springboot获取accessToken
微信小程序官方文档: => 传送门 <=
2.0 accessToken简介
access token即访问令牌的概念。
微信公众平台注册微信公众号
时,微信平台会分配你一个appid
和appsecret
,
- 用appid和appsecret用来产生
access_token
- 是公众号的
全局唯一接口调用凭据
,公众号调用各接口时都需使用access_token。- access_token的存储至少要保留
512
个字符空间。- access_token的有效期目前为
2
个小时,需定时刷新
2.1 准备工作
2.0简介
中提到几个关键词
- 公众号,
appid appsecret
- 字符空间:
512
- 过期时间:
两小时
所以准备步骤如下:
- 注册公众号 获取appid与appsecret =>传送门: 小程序信息获取方式 <=
- 在
上文配置文件
中填写这俩参数名字对应
- 需要准备
redis存储accessToken
过期时间小于两小时(建议不要等于)
String类型即可- 启动类执行时执行一次
定时器 每低于2小时内执行一次
我是一小时执行一次整体执行思路
- 项目启动时
执行一次向微信请求获取accessToken
,并将其存入redis中设置过期时间
(大于60分钟, 小于120分钟)- 定时器
每小时整点执行获取一次
, 重新赋值给redis每次请求均请求redis的key
, 定时任务执行失败, 支持直接请求微信接口获取
2.2 具体代码使用与注释如下
特别注意: 请先复制上篇: ===> 微信小程序00: 获取accessToken,手机号, 小程序二维码,openId与unionId 公共配置类(核心篇)
2.2.1 代码解释(一)[无需复制]
找到
WechatServiceUtils
类 的getRedisCacheAccessToken()
方法
这个是获取缓存中的accessToken
* 2. 获取缓存中的AccessToken
* <p>
* 没有从微信拉取[可配合定时]
*
* @return accessToken
*/
public String getRedisCacheAccessToken() {
/*校验: 缓存中有accessToken的key*/
if (redisCache.hasKey(CacheConstants.WX_ACCESS_TOKEN)) {
log.info("二级缓存数据取出accessToken成功!");
return redisCache.getCacheObject(CacheConstants.WX_ACCESS_TOKEN);
}
//这里不用三目(不好看~~)
return getWxMiniAccessToken();
}
2.2.2 代码解释(二)[无需复制]
找到
WechatServiceUtils
类 的getWxMiniAccessToken()
方法
访问微信官方获取两小时的 accessToken
- JSONObject 需要引fastJson/fastJson2包
/**
* 3. 访问微信官方获取两小时的 accessToken
*
* @return accessToken
*/
public String getWxMiniAccessToken() {
Map<String, String> query = new HashMap<>();
query.put("grant_type", wechatConfigProperties.getGrantType());//client_credential
query.put("secret", wechatConfigProperties.getAppSecret());
query.put("appid", wechatConfigProperties.getAppId());
try {
String aTokenUrl = wechatConfigProperties.getATokenUrl();
// ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(aTokenUrl, query, JSONObject.class);
ResponseEntity<JSONObject> responseEntity = restTemplate.getForEntity(aTokenUrl, JSONObject.class, query);
HttpStatus statusCode = responseEntity.getStatusCode(); //状态码
// System.out.println(responseEntity.getHeaders());//获取到头信息
/*校验: 如果接口成功 200*/
if (Objects.equals(statusCode.value(), 200)) {
JSONObject responseJsonBody = responseEntity.getBody();//响应体
log.info("[请求微信小程序官方接口] => 获取accessToken请求成功返回值:{}", responseJsonBody);
if (responseJsonBody == null) {
log.info("微信小程序获取accessToken请求返回result是null!");
throw new ServiceException(ResponseEnum.A10005);
}
//获取accessToken
String accessToken = responseJsonBody.getString("access_token");
if (StringUtils.isBlank(accessToken)) {
log.info("微信小程序获取accessToken请求返回access_token是null!");
throw new ServiceException(ResponseEnum.A10005);
}
//放入缓存中
redisCache.setCacheObject(CacheConstants.WX_ACCESS_TOKEN, accessToken, wechatConfigProperties.getExpiredTime(), TimeUnit.MINUTES);
return accessToken;
} else {
log.error("微信HttpStatus的StatusCode不是200 {}", statusCode.value());
throw new ServiceException(ResponseEnum.A10005);
}
} catch (Exception e) {
e.printStackTrace();
log.info("微信小程序获取accessToken请求异常信息 {}", e.getMessage());
throw new ServiceException(ResponseEnum.A10005);
}
}
2.3 最后一步 获取accessToken
2.3.1 两行代码搞定
第一行代码 AutoWired注入一下 (我用的lombok注解@RequiredArgsConstructor)
解释一下:
- @AutoWired可以加到构造方法上, 同时在构造方法上的注入会自动填充
- 那么也就是全参构造 @AllArgsConstructor 注解, 替代了属性上的@AutoWired
- 有一些属性不希望@AutoWired, 在
希望的属性上加final, 在类上加@RequiredAllArgsConstructor
代码如下
private final WechatServiceUtils wechatServiceUtils;
第二行代码 直接获取即可
//1.获取access_token
String accessToken = wechatServiceUtils.getRedisCacheAccessToken();
执行结果如下:
2.3.2 微信小程序异常码(如图所示)
到此本文结束
3. 文章的总结与预告
3.1 本文总结
- redis使用
- 文档的查看与使用
- restTemplate的使用(httpUtils等等都行 自己写也行)
- 微信文档没有坑,说明也挺清晰
3.2 下文预告
- 获取openId与unionId
- 获取不限制小程序二维码
- 获取手机号(新版)
作者pingzhuyan 感谢观看