微信access_token和refresh_token保存于redis
简介
- 通常理解的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_tokenmyapp:
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的更多相关文章
- 微信公众平台开发之微信access_token如何有效长期保存
随着微信使用越来越广泛,微信公众平台开放了许多接口以提供更多个性化的服务,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等,开发者在调用这些接口时,都需要传入一个相同的参数ac ...
- (实用篇)PHP定时任务获取微信access_token
最近开发微信公众平台,公众号调用各接口时都需使用access_token,access_token是公众号的全局唯一接口调用凭据,开发时需要进行妥善保存. access_token有效期为7200秒 ...
- PHP定时任务获取微信access_token的方法
一.使用brew安装php多版本方法 # brew install php56# brew install php70二.安装切换工具 # brew install php-version# sour ...
- 获取微信access_token
/** * 获取微信access_token * @return mixed */function get_access_token() { $appId = C('APPID'); $secret ...
- python之获取微信access_token
# -*- coding: cp936 -*- #python 27 #xiaodeng #获取微信access_token #办法一:将该url直接填写到浏览器地址中可以获得access_token ...
- 微信access_token设计的原理解析
1.access_token是加密的字符串,其目的是为了接口安全考虑,不然随便就能调用微信服务器的接口会有很大风险. 2.用户在公众号中填写的Token就相当于本项目中的xiaoming,是签名验证中 ...
- 微信小程序图片保存到本地
微信小程序图片保存到本地是一个常用功能: 这里讲解下完整实现思路: 因为微信官方的授权只弹一次,用户拒绝后再次调用,就需要结合button组件的微信开放能力来调起,以下方案在微信各种授权中可参考. w ...
- 既生瑜何生亮 access_token VS refresh_token
中国有句老话, 既生瑜何生亮, 既然有我周瑜在世, 为什么老天还要一个诸葛亮啊? 同样的, 众所周知, 在 OAuth 2.0 授权协议中, 也有两个令牌 token , 分别是 access_tok ...
- 由获取微信access_token引出的Java多线程并发问题
背景: access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保留512个字符空间.acces ...
随机推荐
- 程序猿必备技能:数据库管理——关于MySQL
一.初识MySQL 1.什么是数据库? 数据库(Database,DB)简而言之就是存放数据的仓库,是为了实现一定目的,按照某种规则组织起来的数据的集合. 2.使用数据库的必要性 (1)结构化存储大量 ...
- element-ui中单独引入Message组件的问题
import Message from './src/main.js'; export default Message; 由于Message组件并没有install 方法供Vue来操作的,是直接返回的 ...
- MySQL主键和外键使用及说明
摘自网上一个经典的例子:大哥和小弟 一.外键约束 MySQL通过外键约束来保证表与表之间的数据的完整性和准确性. 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说 ...
- 【题解】NOIP2017时间复杂度
对大模拟抱有深深的恐惧……不过这次写好像还好?拿个栈维护一下循环的嵌套,然后重定义一下读入即可.记得去年在考场上面死活调不粗来,代码也奇丑无比……希望今年能好一点吧! #include <bit ...
- 基于三个kinect的人体建模
单个kinect的人体重建,在Kinect SDK 1.8中,Kinect Fusion的效果已经很不错了.其缺点显而易见,一是扫描时间长,重建对象也需要长时间保持静态:二是需要人体或者kine ...
- 深入详解windows安全认证机制ntlm&Kerberos
0x01 为什么要理解windows 安全认证机制: 加深对后续各种漏洞利用的理解深度,还是那句话,要知其然,更要知其所以然,不废话,咱们直接开始 0x02 windows认证协议主要有以下两种: 基 ...
- Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程
Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- java之面向对象20160818
本文主要是介绍一下java面向对象编程方面的知识,涉及的内容可能有点多,所以可能会感觉比较笼统,详细请参见<Java编程思想>里面比较具体点. 1.面向对象 和遵循设计原则和设计模式, 目 ...
- poi对word的操作(总结)
★★★ POI在读写word docx文件时是通过xwpf模块来进行的,其核心是XWPFDocument. 1.正文段落:一个文档包含多个段落Paragraph,一个段落包含多个Runs,一个R ...
- Linux下如何卸载软件(Debian系)
说明:此方法适用于Debian.Ubuntu等带apt工具的操作系统. 步骤: 1.首先我们需要知道将要卸载的软件名称,比如我现在打算卸载tightvncserver,但是如果你不确定名称,没关系,可 ...