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 相关文章推荐
textarea 控制输入字符字节数(示例代码)
Dec 27 Javascript
ExtJs动态生成treepanel的Json格式
Jul 19 Javascript
JS与jQuery遍历Table所有单元格内容的方法
Dec 07 Javascript
漫谈JS引擎的运行机制 你应该知道什么
Jun 15 Javascript
基于JavaScript实现自定义滚动条
Jan 25 Javascript
快速使用node.js进行web开发详解
Apr 26 Javascript
node.js 发布订阅模式的实例
Sep 10 Javascript
基于vue中解决v-for使用报红并出现警告的问题
Mar 03 Javascript
纯JS实现的读取excel文件内容功能示例【支持所有浏览器】
Jun 23 Javascript
p5.js绘制旋转的正方形
Oct 23 Javascript
Vue如何获取数据列表展示
Dec 11 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
Dec 21 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
用libtemplate实现静态网页生成
2006/10/09 PHP
php修改指定文件后缀的方法
2014/09/11 PHP
mysql查找删除重复数据并只保留一条实例详解
2016/09/24 PHP
PHP数组生成XML格式数据的封装类实例
2016/11/10 PHP
PHP设置Cookie的HTTPONLY属性方法
2017/02/09 PHP
laravel实现前后台路由分离的方法
2019/10/13 PHP
文本加密解密
2006/06/23 Javascript
Prototype使用指南之form.js
2007/01/10 Javascript
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
2007/01/11 Javascript
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
js字符串转换成xml对象并使用技巧解读
2013/04/18 Javascript
jquery中filter方法用法实例分析
2015/02/06 Javascript
angularJS 中$scope方法使用指南
2015/02/09 Javascript
获取今天,昨天,本周,上周,本月,上月时间(实例分享)
2017/01/04 Javascript
thinkjs之页面跳转同步异步操作
2017/02/05 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
2018/10/10 jQuery
js实现简单掷骰子小游戏
2019/10/24 Javascript
vue中实现回车键登录功能
2020/02/19 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
js实现查询商品案例
2020/07/22 Javascript
[56:48]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
详解Python3.6安装psutil模块和功能简介
2018/05/30 Python
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
python超时重新请求解决方案
2019/10/21 Python
OpenCV 表盘指针自动读数的示例代码
2020/04/10 Python
如何基于Python爬取隐秘的角落评论
2020/07/02 Python
numba提升python运行速度的实例方法
2021/01/25 Python
HTML5移动端手机网站开发流程
2016/04/25 HTML / CSS
澳大利亚体育和露营装备在线/实体零售商:Find Sports
2020/06/03 全球购物
网站设计师的岗位职责
2013/11/21 职场文书
给朋友的道歉信
2014/01/09 职场文书
元旦红领巾广播稿
2014/02/19 职场文书
金融管理毕业生求职信
2014/03/03 职场文书
高三霸气励志标语
2014/06/24 职场文书
背起爸爸上学观后感
2015/06/08 职场文书
最美乡村教师观后感
2015/06/11 职场文书