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 相关文章推荐
用window.location.href实现刷新另个框架页面
Mar 07 Javascript
Javascript 数组排序详解
Oct 22 Javascript
使用javascript实现简单的选项卡切换
Jan 09 Javascript
javascript中if和switch,==和===详解
Jul 30 Javascript
JS实现的5级联动Select下拉选择框实例
Aug 17 Javascript
老生常谈onBlur事件与onfocus事件(js)
Jul 09 Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
Jan 23 Javascript
javascript九宫格图片随机打乱位置的实现方法
Mar 15 Javascript
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
Nov 14 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
Aug 07 Javascript
vue-cli4使用全局less文件中的变量配置操作
Oct 21 Javascript
element-ui中el-upload多文件一次性上传的实现
Dec 02 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
深入理解:XML与对象的序列化与反序列化
2013/06/08 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
2017/02/23 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
input 输入框获得/失去焦点时隐藏/显示文字(jquery版)
2013/04/02 Javascript
JS 屏蔽键盘不可用与鼠标右键不可用的方法
2013/11/18 Javascript
javascript中使用正则表达式清理table样式的代码
2020/04/01 Javascript
关于原生js中bind函数的简单实现
2016/08/10 Javascript
JS异步文件分片断点上传的实现思路
2016/12/25 Javascript
JS日程管理插件FullCalendar简单实例
2017/02/07 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
使用vue实现grid-layout功能实例代码
2018/01/05 Javascript
vuex的使用及持久化state的方式详解
2018/01/23 Javascript
JS中判断字符串存在和非空的方法
2018/09/12 Javascript
详解vue中使用微信jssdk
2019/04/19 Javascript
layui lay-verify form表单自定义验证规则详解
2019/09/18 Javascript
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
解析Python中的二进制位运算符
2015/05/13 Python
Python获取央视节目单的实现代码
2015/07/25 Python
python中abs&map&reduce简介
2018/02/20 Python
Python 高效编程技巧分享
2020/09/10 Python
matplotlib绘制正余弦曲线图的实现
2021/02/22 Python
美国正宗奢华复古手袋、珠宝及配饰网站:What Goes Around Comes Around
2018/07/21 全球购物
Linux操作面试题
2012/05/16 面试题
数控加工专业毕业生自荐信
2013/09/27 职场文书
自动化系在校本科生求职信
2013/10/23 职场文书
培训主管的岗位职责
2013/11/23 职场文书
小班秋游活动方案
2014/02/22 职场文书
三八妇女节活动主持词
2014/03/17 职场文书
国际会计专业求职信
2014/08/04 职场文书
乡镇领导干部个人对照检查材料思想汇报
2014/09/23 职场文书
党的群众路线教育实践活动党员个人整改措施
2014/10/27 职场文书
养成教育主题班会
2015/08/13 职场文书
导游词之千岛湖
2019/09/23 职场文书
CSS3 制作的彩虹按钮样式
2021/04/11 HTML / CSS
使用python+pygame开发消消乐游戏附完整源码
2021/06/10 Python
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android