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 相关文章推荐
动态添加js事件实现代码
Mar 12 Javascript
jQuery EasyUI API 中文文档 DateTimeBox日期时间框
Oct 16 Javascript
jquery左边浮动到一定位置时显示返回顶部按钮
Jun 05 Javascript
利用js实现禁止复制文本信息
Jun 03 Javascript
JS实现DIV容器赋值的方法
Dec 14 Javascript
jQuery获取checkbox选中的值
Jan 28 Javascript
JavaScript数据结构与算法之栈与队列
Jan 29 Javascript
React Native如何消除启动时白屏的方法
Aug 08 Javascript
js实现移动端轮播图效果
Dec 09 Javascript
基于js文件加载优化(详解)
Jan 03 Javascript
React 组件渲染和更新的实现代码示例
Feb 21 Javascript
Vue触发隐藏input file的方法实例详解
Aug 14 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自定义错误日志
2015/02/13 PHP
PHP实现简单爬虫的方法
2015/07/29 PHP
php curl 模拟登录并获取数据实例详解
2016/12/22 PHP
PHP PDOStatement::setFetchMode讲解
2019/02/03 PHP
jqPlot Option配置对象详解
2009/07/25 Javascript
IE事件对象(The Internet Explorer Event Object)
2012/06/27 Javascript
JavaScript实现的使用键盘控制人物走动实例
2014/08/27 Javascript
js实现带按钮的上下滚动效果
2015/05/12 Javascript
jQuery+css实现炫目的动态块漂移效果
2016/01/28 Javascript
简述Matlab中size()函数的用法
2016/03/20 Javascript
JavaScript实战(原生range和自定义特效)简单实例
2016/08/21 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
node koa2实现上传图片并且同步上传到七牛云存储
2017/07/31 Javascript
详解在Vue中有条件地使用CSS类
2017/09/30 Javascript
vue.js element-ui tree树形控件改iview的方法
2018/03/29 Javascript
JS计算两个数组的交集、差集、并集、补集(多种实现方式)
2019/05/21 Javascript
24个ES6方法解决JS实际开发问题(小结)
2020/05/31 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
2020/06/25 Javascript
vue动态设置页面title的方法实例
2020/08/23 Javascript
用Python写的图片蜘蛛人代码
2012/08/27 Python
Python上下文管理器和with块详解
2017/09/09 Python
用TensorFlow实现戴明回归算法的示例
2018/05/02 Python
pandas分别写入excel的不同sheet方法
2018/12/11 Python
Python同步遍历多个列表的示例
2019/02/19 Python
python笔记之mean()函数实现求取均值的功能代码
2019/07/05 Python
处理python中多线程与多进程中的数据共享问题
2019/07/28 Python
pytorch ImageFolder的覆写实例
2020/02/20 Python
Python中常用的高阶函数实例详解
2020/02/21 Python
Django多数据库配置及逆向生成model教程
2020/03/28 Python
python多进程使用函数封装实例
2020/05/02 Python
基于DOM+CSS3实现OrgChart组织结构图插件
2016/03/02 HTML / CSS
世界最大的票务市场:viagogo
2017/02/16 全球购物
如何高效率的查找一个月以内的数据
2012/04/15 面试题
党校培训自我鉴定
2014/02/01 职场文书
毕业实习感受与体会
2015/05/26 职场文书
python 网络编程要点总结
2021/06/18 Python