node.js 微信开发之定时获取access_token


Posted in Javascript onFebruary 07, 2020

什么是access_token

access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效

当你的多个微信开发相关服务并存时,多个服务各自去获取 access_token ,最后导致其中一些服务会不能正常访问.
所以这种情况下,应该设置一个获取 access_token 的中控服务器.
因为 access_token 的有效期为 2个小时,
所以你的中控服务器必须能够定时去拉取最新的 access_token .

下面我们设置一个非常简单的中控服务器

此中控服务器需要有以下几个特点:

1.可以定时执行
2.拉取到最新 access_token 可以持久化
3.持久化的access_token 可以被其他相关服务访问到.

node.js下定时任务

我们采用 node-schedule

npm install node-schedule --save

schedule.scheduleJob(A,B)

scheduleJob 方法接收2个参数, A 为日期规则 (多长时间执行)   B 为回调方法 (当日期符合条件时,将要做什么)

先来看下参数 A :

##六颗星方式

‘* * * * * *'

┬     ┬    ┬    ┬    ┬    ┬
│    │    │    │    │     |
│    │    │    │    │    └ 星期几 (0 - 7) ( 0 或者 7 表示星期日 )
│    │    │    │    └───── 月份 (1 - 12)
│    │    │    └────────── 日期 (1 - 31)
│    │    └─────────────── 小时 (0 - 23)
│    └──────────────────── 分钟 (0 - 59)
└───────────────────────── 秒 (0 - 59)

下面用此方式我们约定在 8月30日0点0分0秒 执行程序.
对应的参数A 设置如下:
‘0 0 0 30 8 *'

var m= schedule.scheduleJob('0 0 0 30 8 *',function(){
  getToken();
});

上面的 getToken() 是我自定义的一个获取微信 access_token 的方法,下面会有说明.

设置每30秒执行一次定时任务
‘30 * * * * *'

设置每1分30秒执行一次任务
‘30 1 * * * *'

设置凌晨0点1分30秒执行任务
‘30 1 0 * * *'

RecurrenceRule 方式

//定义一个时间规则
var rule = new schedule.RecurrenceRule();
  // rule.dayOfWeek = 0;
  // rule.month = 0;
  // rule.dayOfMonth = 0;
  // rule.hour = 0;
  // rule.minute = 0;
  rule.second = 0;
  
schedule.scheduleJob(rule, function(){
    getToken();
});

创建了一个 RecurrenceRule 对象,它有6个属性,分别对应 星期,月份,日期,小时,分钟,秒
通过各个参数来设置你的时间规则器.

上面介绍了  node.js 下使用 node-schedule 来执行定时任务,下面我们来看下如何获取微信 access_token

获取微信 access_token

GET 请求方式:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}

注意上面的 {APPID} 和 {APPSECRET} 要登录微信公众后台获取.

下面我们使用 request 来提交一个get 请求即可:

npm install request --save

我们还用到了 redis , npm install redis --save

var client=redis.createClient({
  "host":"127.0.0.1",
  "port":"6379"
});

var getToken=function(){
var url=util.format('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s',wechat.appid,wechat.secret);

  request(url,function(error, response, body){

    if (!error && response.statusCode == 200) {
      var bodyToken=JSON.parse(body);
      if(bodyToken&&bodyToken.access_token){
        setToken(bodyToken.access_token);
      }
    }
  })
}

var setToken=function(token){
  if(token){
    client.set("YG-WECHAT-TOKEN",token);
  }
}

每小时执行一次定时任务 getToken()
拿到最新 access_token 后存储在 redis 中,key 为 YG-WECHAT-TOKEN

获取 access_token

上面的流程我们已经每小时让定时任务拿到了最新的 access_token,并且持久化到了 redis 中.
其他服务如何获取 access_token 呢?
直接连接 redis 服务,根据 key 获取对应的 token.
当然你也可以写一个统一的接口,通过接口拿到 access_token.

Javascript 相关文章推荐
IE6与IE7中,innerHTML获取param的区别
Mar 15 Javascript
JQuery设置文本框和密码框得到焦点时的样式
Aug 30 Javascript
jQuery插件Tmpl的简单使用方法
Apr 27 Javascript
JavaScript实现简单的数字倒计时
May 15 Javascript
动态加载js、css的实例代码
May 26 Javascript
js 创建对象 经典模式全面了解
Aug 16 Javascript
js实现瀑布流效果(自动生成新的内容)
Mar 16 Javascript
浅谈JavaScript作用域和闭包
Sep 18 Javascript
vue.js父子组件通信动态绑定的实例
Sep 28 Javascript
Emberjs 通过 axios 下载文件的方法
Sep 03 Javascript
JS script脚本中async和defer区别详解
Jun 24 Javascript
vue项目配置同一局域网可使用ip访问的操作
Oct 23 Javascript
jQuery操作选中select下拉框的值代码实例
Feb 07 #jQuery
webpack的 rquire.context用法实现工程自动化的方法
Feb 07 #Javascript
详解为element-ui的Select和Cascader添加弹层底部操作按钮
Feb 07 #Javascript
vue-cli设置css不生效的解决方法
Feb 07 #Javascript
js生成1到100的随机数最简单的实现方法
Feb 07 #Javascript
JavaScript实现飞舞的泡泡效果
Feb 07 #Javascript
JavaScript实现Excel表格效果
Feb 07 #Javascript
You might like
关于PHP语言构造器介绍
2013/07/08 PHP
PHP实现生成唯一编号(36进制的不重复编号)
2014/07/01 PHP
php实现留言板功能
2017/03/05 PHP
laravel admin实现分类树/模型树的示例代码
2020/06/10 PHP
防止动态加载JavaScript引起的内存泄漏问题
2009/10/08 Javascript
javascript 命名规则 变量命名规则
2010/02/25 Javascript
Array.prototype.slice 使用扩展
2010/06/09 Javascript
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
2012/10/11 Javascript
JS文本框追加多个下拉框的值的简单实例
2013/07/12 Javascript
jquery datepicker参数介绍和示例
2014/04/15 Javascript
高效的jQuery代码编写技巧总结
2017/02/22 Javascript
Swiper 4.x 使用方法(移动端网站的内容触摸滑动)
2018/05/17 Javascript
vue 组件中添加样式不生效的解决方法
2018/07/06 Javascript
vue mounted 调用两次的完美解决办法
2018/10/29 Javascript
写给新手同学的vuex快速上手指北小结
2020/04/14 Javascript
uniapp微信小程序:key失效的解决方法
2021/01/20 Javascript
浅析Python中return和finally共同挖的坑
2017/08/18 Python
Python数据类型之String字符串实例详解
2019/05/08 Python
打包python 加icon 去掉cmd黑窗口方法
2019/06/24 Python
pyenv与virtualenv安装实现python多版本多项目管理
2019/08/17 Python
pytorch常见的Tensor类型详解
2020/01/15 Python
python获取依赖包和安装依赖包教程
2020/02/13 Python
使用python+poco+夜神模拟器进行自动化测试实例
2020/04/23 Python
python如何安装下载后的模块
2020/07/03 Python
python3代码输出嵌套式对象实例详解
2020/12/03 Python
日本非常有名的内衣丝袜品牌:GUNZE
2017/01/06 全球购物
法国在线药房:1001Pharmacies
2021/03/07 全球购物
万豪国际住宅与别墅集团:Homes & Villas by Marriott International
2020/10/08 全球购物
花卉与景观设计系大学生求职信
2013/10/01 职场文书
后勤副校长自我鉴定
2013/10/13 职场文书
求职信标题怎么写
2014/05/26 职场文书
研究生简历自我评
2015/03/11 职场文书
2016暑期师德培训心得体会
2016/01/09 职场文书
实体类或对象序列化时,忽略为空属性的操作
2021/06/30 Java/Android
Vue的列表之渲染,排序,过滤详解
2022/02/24 Vue.js
MySQL深分页问题解决思路
2022/12/24 MySQL