微信小程序01: springboot获取accessToken方式 ,配合redis缓存使用

本文介绍了如何在SpringBoot项目中获取微信小程序的access_token,并实现自动刷新机制,通过Redis存储并设置定时任务确保不超过频率限制。还涵盖了微信小程序的access_token获取流程和异常处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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
  • 过期时间: 两小时

所以准备步骤如下:

  1. 注册公众号 获取appid与appsecret =>传送门: 小程序信息获取方式 <=
  2. 上文配置文件中填写这俩参数 名字对应
  3. 需要准备redis存储accessToken 过期时间小于两小时(建议不要等于) String类型即可
  4. 启动类执行时执行一次
  5. 定时器 每低于2小时内执行一次 我是一小时执行一次

整体执行思路

  1. 项目启动时 执行一次向微信请求获取accessToken,并将其存入redis中设置过期时间(大于60分钟, 小于120分钟)
  2. 定时器每小时整点执行获取一次, 重新赋值给redis
  3. 每次请求均请求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 本文总结

  1. redis使用
  2. 文档的查看与使用
  3. restTemplate的使用(httpUtils等等都行 自己写也行)
  4. 微信文档没有坑,说明也挺清晰

3.2 下文预告

  1. 获取openId与unionId
  2. 获取不限制小程序二维码
  3. 获取手机号(新版)


作者pingzhuyan 感谢观看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pingzhuyan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值