微信小程序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 感谢观看

好的,以下是获取企业微信accesstokenJava方法,使用Redis缓存缓存时间为1.5小时: ```java import redis.clients.jedis.Jedis; public class AccessTokenManager { // 企业微信应用ID private final static String APP_ID = "your_app_id"; // 企业微信应用的secret private final static String APP_SECRET = "your_app_secret"; // Redis缓存的key值 private final static String REDIS_KEY = "access_token"; // Redis缓存缓存时间,单位:秒 private final static int CACHE_TIME = 5400; //即1.5小时 /** * 获取企业微信accesstoken * * @return accesstoken */ public static String getAccessToken() { // 先从缓存获取 String accessToken = getCacheAccessToken(); if (accessToken == null) { // 缓存中没有,则重新获取 accessToken = getNewAccessToken(); // 将新的accesstoken缓存Redis中 setCacheAccessToken(accessToken); } return accessToken; } /** * 从缓存获取accesstoken * * @return accesstoken */ private static String getCacheAccessToken() { Jedis jedis = null; String accessToken = null; try { jedis = new Jedis("localhost"); accessToken = jedis.get(REDIS_KEY); } catch (Exception e) { e.printStackTrace(); } finally { if (jedis != null) { jedis.close(); } } return accessToken; } /** * 将accesstoken缓存Redis中 * * @param accessToken accesstoken */ private static void setCacheAccessToken(String accessToken) { Jedis jedis = null; try { jedis = new Jedis("localhost"); jedis.setex(REDIS_KEY, CACHE_TIME, accessToken); } catch (Exception e) { e.printStackTrace(); } finally { if (jedis != null) { jedis.close(); } } } /** * 获取新的accesstoken * * @return accesstoken */ private static String getNewAccessToken() { // 发送HTTP请求,获取新的accesstoken String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + APP_ID + "&corpsecret=" + APP_SECRET; String accessToken = null; try { String response = HttpClientUtils.sendGet(url); JSONObject jsonObject = JSONObject.parseObject(response); accessToken = jsonObject.getString("access_token"); } catch (Exception e) { e.printStackTrace(); } return accessToken; } } ``` 以上方法中,`APP_ID`和`APP_SECRET`需要替换为自己企业微信应用的对应值。其中获取新的accesstoken的方法使用了`HttpClientUtils.sendGet(url)`这个HTTP请求的工具类,工具类可以自行百度实现。 另外,以上方法中的`Jedis`是RedisJava客户端,需要通过`maven`引入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

pingzhuyan

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

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

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

打赏作者

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

抵扣说明:

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

余额充值