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 相关文章推荐
浏览器脚本兼容 文本框中,回车键触发事件的兼容
Jun 21 Javascript
js关于字符长度限制的问题示例探讨
Jan 24 Javascript
深入解读JavaScript中的Iterator和for-of循环
Jul 28 Javascript
使用CDN和AJAX加速WordPress中jQuery的加载
Dec 05 Javascript
简单易懂的天气插件(代码分享)
Feb 04 Javascript
js实现产品缩略图效果
Mar 10 Javascript
深入理解node.js之path模块
May 03 Javascript
在一般处理程序(ashx)中弹出js提示语
Aug 16 Javascript
详解vue2.0 不同屏幕适配及px与rem转换问题
Feb 23 Javascript
Angular中的ng-template及angular 使用ngTemplateOutlet 指令的方法
Aug 08 Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
Jan 31 Javascript
vue使用echarts实现水平柱形图实例
Sep 09 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
php5中date()得出的时间为什么不是当前时间的解决方法
2008/06/30 PHP
PHP遍历并打印指定目录下所有文件实例
2014/02/10 PHP
PHP与JavaScript针对Cookie的读写、交互操作方法详解
2017/08/07 PHP
laravel 实现划分admin和home 模块分组
2019/10/15 PHP
帮助避免错误的Javascript陷阱清单
2009/05/31 Javascript
克隆javascript对象的三个方法小结
2011/01/12 Javascript
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
解析ScrollPic在ie8下只滚动一遍,然后变为空白 ie6,ie7,chrome,firefox正常
2013/06/26 Javascript
jQuery学习笔记之jQuery原型属性和方法
2014/06/09 Javascript
浅谈javascript的调试
2015/01/28 Javascript
Javascript中实现String.startsWith和endsWith方法
2015/06/10 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
2015/12/25 Javascript
JavaScript中常用的验证reg
2016/10/13 Javascript
Vue.js实现价格计算器功能
2020/03/30 Javascript
React 高阶组件入门介绍
2018/01/11 Javascript
react-router4 配合webpack require.ensure 实现异步加载的示例
2018/01/18 Javascript
mpvue全局引入sass文件的方法步骤
2019/03/06 Javascript
通过说明与示例了解js五种设计模式
2019/06/17 Javascript
如何利用JavaScript编写更好的条件语句详解
2020/08/10 Javascript
解决Ant Design Modal内嵌Form表单initialValue值不动态更新问题
2020/10/29 Javascript
Python中使用PIL库实现图片高斯模糊实例
2015/02/08 Python
Python中用sleep()方法操作时间的教程
2015/05/22 Python
Python模块结构与布局操作方法实例分析
2017/07/24 Python
使用DataFrame删除行和列的实例讲解
2018/04/08 Python
python3监控CentOS磁盘空间脚本
2018/06/21 Python
Python timer定时器两种常用方法解析
2020/01/20 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
2020/04/08 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
2021/02/03 Python
大学生毕业自我鉴定
2013/11/06 职场文书
中学教师管理制度
2014/01/14 职场文书
市场营销大学生职业规划书
2014/02/25 职场文书
教师节标语大全
2014/10/07 职场文书
劳资员岗位职责
2015/02/13 职场文书
活着观后感
2015/06/03 职场文书
教学反思怎么写
2016/02/24 职场文书
八年级作文之我的母亲
2019/12/10 职场文书