简介

  • 通常理解的access_token和refresh_token

    • access_token是用来对客户端进行认证的,类似与密码,有一定的有效期。当过期后可使用refresh_token重新获取一个新的access_token。refresh_token的有效期相对较长
  • 微信开发设置到两种access_token
    • 第一种是接口授权access_token,是用来调用微信高级接口的,有次数限制,是来区分公众号的
    • 另外一种是用户授权access_token,是用户授权公众号获取用户信息是得到的,无次数限制,使用用来区分用户的(一般用在微信H5开发上)
  • 由于上述第一种access_token是有次数限制的,因此我们需要将太缓存(保存)起来,每次调用接口的时候先取我们缓存的access_token,而不是从新获取一个新的access_token。
  • 由于refresh_token的有效期相对较长,且使用频率较少,此处只说明access_token的保存(refresh_token可类似处理)

使用redis保存access_token

  • 微信公众平台API每日有调用上限,即使某些公众号或服务号有清零某些接口调用的次数权限,但也架不住滥用或错误的调用,官方建议access_token由一台服务来维护和提供查询功能,另外特别重要的一点是每个凭证都拥有生命周期,长短不同,access_token的生命周期是7200秒,在这段时间内可以重复使用,所以不要在每使用一次凭证就重新获取一个access_token了。
  • 通常会保存在内存数据库中,如Redis,当然也可以直接放在应用程序的内存中,不建议放在oracle或MySQL,拿取开销较比其它手段太重。放在内存数据库中的好处较比放在应用程序的内存中是维护性好,尤其是搭配了可视化管理工具后。另外不仅可以放access_token,也可以其它数据库。[^1] [^2]
  • 示例(基于springboot)

    • redis等其他基础配置省略

    • application.yml 其中myapp下的key都需要进行自定义参数配置,此处也存储了用户授权access_token

      myapp:
      redisWxUserAccessToken: "user.wxUserAccessToken"
      redisWxUserRefreshToken: "user.wxUserRefreshToken"
      redisWxAccessToken: "sys.wxAccessToken"
      redisWxRefreshToken: "sys.wxRefreshToken"
    • 此处以保存用户授权access_token为例,接口调用access_token可在项目启动时进行缓存。部分代码如下:

      @Autowired
      private RedisTemplate<String, String> redisTemplate; @Value("${myapp.redisWxUserAccessToken}")
      private String redisWxUserAccessToken; // 获取
      public String getUserAccessToken(Object userId) {
      String accessToken = null;
      if(StringUtils.isEmpty(userId)) return accessToken; String accessTokenStr = (String) redisTemplate.opsForHash().get(redisWxUserAccessToken, String.valueOf(userId));
      long now = (new Date()).getTime();
      if(!StringUtils.isEmpty(accessTokenStr)) {
      String[] arr = accessTokenStr.split("#"); if(now < Long.valueOf(arr[1])) {
      accessToken = arr[0];
      }
      } if(StringUtils.isEmpty(accessToken)) {
      accessToken = getUserAccessTokenByRefreshToken(userId);
      } return accessToken;
      } // 重新获取
      Object expiresIn = accessTokenMap.get("expires_in"); // 调用微信授权接口后,返回的expires_in参数
      String value = accessTokenNew + "#" + getNowExpiresIn(expiresIn); // 此处是设置有效期
      redisTemplate.opsForHash().put(redisWxUserAccessToken, String.valueOf(userId), value); public Long getNowExpiresIn(Object expiresIn) {
      long now = (new Date()).getTime();
      if(expiresIn == null) return now; Long expiresMs = Long.valueOf(String.valueOf(expiresIn)) - 15 * 60;
      return expiresMs * 1000 + now;
      }

[^1] 网页授权的access_token大家是怎么缓存的

[^2] https://segmentfault.com/q/1010000004995599/a-1020000005016398

微信access_token和refresh_token保存于redis的更多相关文章

  1. 微信公众平台开发之微信access_token如何有效长期保存

    随着微信使用越来越广泛,微信公众平台开放了许多接口以提供更多个性化的服务,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等,开发者在调用这些接口时,都需要传入一个相同的参数ac ...

  2. (实用篇)PHP定时任务获取微信access_token

    最近开发微信公众平台,公众号调用各接口时都需使用access_token,access_token是公众号的全局唯一接口调用凭据,开发时需要进行妥善保存. access_token有效期为7200秒 ...

  3. PHP定时任务获取微信access_token的方法

    一.使用brew安装php多版本方法 # brew install php56# brew install php70二.安装切换工具 # brew install php-version# sour ...

  4. 获取微信access_token

    /** * 获取微信access_token * @return mixed */function get_access_token() { $appId = C('APPID'); $secret ...

  5. python之获取微信access_token

    # -*- coding: cp936 -*- #python 27 #xiaodeng #获取微信access_token #办法一:将该url直接填写到浏览器地址中可以获得access_token ...

  6. 微信access_token设计的原理解析

    1.access_token是加密的字符串,其目的是为了接口安全考虑,不然随便就能调用微信服务器的接口会有很大风险. 2.用户在公众号中填写的Token就相当于本项目中的xiaoming,是签名验证中 ...

  7. 微信小程序图片保存到本地

    微信小程序图片保存到本地是一个常用功能: 这里讲解下完整实现思路: 因为微信官方的授权只弹一次,用户拒绝后再次调用,就需要结合button组件的微信开放能力来调起,以下方案在微信各种授权中可参考. w ...

  8. 既生瑜何生亮 access_token VS refresh_token

    中国有句老话, 既生瑜何生亮, 既然有我周瑜在世, 为什么老天还要一个诸葛亮啊? 同样的, 众所周知, 在 OAuth 2.0 授权协议中, 也有两个令牌 token , 分别是 access_tok ...

  9. 由获取微信access_token引出的Java多线程并发问题

    背景: access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保留512个字符空间.acces ...

随机推荐

  1. 【bzoj1430】小猴打架 Prufer序列

    题目描述 给出 $n$ 个点,每次选择任意一条边,问这样 $n-1$ 次后得到一棵树的方案数是多少. 输入 一个整数N. 输出 一行,方案数mod 9999991. 样例输入 4 样例输出 96 题解 ...

  2. BZOJ4878 挑战NP-Hard(dfs树)

    既然是二选一,考虑两个问题有什么联系.题面没有说无解怎么办,所以如果不存在经过k条边的简单路径,一定存在k染色方案.考虑怎么证明这个东西,我们造一棵dfs树.于是可以发现如果树深>k(根节点深度 ...

  3. [洛谷P4563][JXOI2018]守卫

    题目大意:有一段$n(n\leqslant5\times10^3)$个点的折线,特殊点可以覆盖它以及它左边的它可以“看见”的点(“看见”指连线没有其他东西阻挡).定义$f_{l,r}$为区间$[l,r ...

  4. splay tree 学习笔记

    首先感谢litble的精彩讲解,原文博客: litble的小天地 在学完二叉平衡树后,发现这是只是一个不稳定的垃圾玩意,真正实用的应有Treap.AVL.Splay这样的查找树.于是最近刚学了学了点S ...

  5. Django summernote 富文本

    Summernote is a simple WYSIWYG editor. GITHUB:https://github.com/summernote/django-summernote SETUP ...

  6. Hdu3223 Decrypt Messages

    Decrypt Messages Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. Leetcode 492. 构造矩形

    1.题目描述 作为一位web开发者, 懂得怎样去规划一个页面的尺寸是很重要的. 现给定一个具体的矩形页面面积,你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面.要求: 1. 你设 ...

  8. IOS性能调优系列:使用Time Profiler发现性能瓶颈

    硬广:<IOS性能调优系列>第五篇,预计会有二十多篇,持续更新,欢迎关注. 之前四篇都是关注于内存方面,分析了内存泄漏.僵尸对象.内存分配,本篇介绍Time Profiler工具的使用,开 ...

  9. SSH免密码登录,实现数据传输备份

    简单来说,就是通过ssh-keygen -t rsa命令来产生一组公私钥,私钥是id_rsa,公钥是id_rsa.pub,把公钥上传到另一台服务器对应账号的.ssh/authorized_keys,即 ...

  10. linux之nginx的安装

    (一)这次是自己折腾服务器的环境,所以自己算是都装过一遍,在装的过程中也是在网上搜索,其实最后在公司运维的指导下知道自己安装出错在哪里的.不说了,直接说安装和问题 (二):首先从 http://ngi ...