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 setTimeout opener的用法示例详解
Oct 23 Javascript
JavaScript中用toString()方法返回时间为字符串
Jun 12 Javascript
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
Nov 23 Javascript
理解JavaScript事件对象
Jan 25 Javascript
很棒的js选项卡切换效果
Jul 15 Javascript
js上传图片预览的实现方法
May 09 Javascript
详解Vue微信公众号开发踩坑全记录
Aug 21 Javascript
原生JS获取元素的位置与尺寸实现方法
Oct 18 Javascript
Vue中的methods、watch、computed的区别
Nov 26 Javascript
vue实现随机验证码功能的实例代码
Apr 30 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
May 09 Javascript
使用Vue实现简单计算器
Feb 25 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 Xdebug 调试扩展的安装与使用.
2010/03/13 PHP
PHP中几个常用的魔术常量
2012/02/23 PHP
php while循环得到循环次数
2013/10/26 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
2014/04/30 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
2015/04/17 PHP
php微信高级接口群发 多客服
2016/06/23 PHP
详解PHP的抽象类和抽象方法以及接口总结
2019/03/15 PHP
解决jquery .ajax 在IE下卡死问题的解决方法
2009/10/26 Javascript
javascript ready和load事件的区别示例介绍
2013/08/30 Javascript
使用非html5实现js板连连看游戏示例代码
2013/09/22 Javascript
js限制checkbox选中个数以限制六个为例
2014/07/15 Javascript
jQuery动画与特效详解
2015/02/01 Javascript
JQuery中attr方法和removeAttr方法用法实例
2015/05/18 Javascript
js实现不重复导入的方法
2016/03/02 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
微信+angularJS的SPA应用中用router进行页面跳转,jssdk校验失败问题解决
2016/09/09 Javascript
nodeJs爬虫的技术点总结
2018/05/13 NodeJs
在vue中使用echarts图表实例代码详解
2018/10/22 Javascript
微信小程序 scroll-view 实现锚点跳转功能
2019/12/12 Javascript
JS实现电脑虚拟键盘的操作
2020/06/24 Javascript
使用Python的web.py框架实现类似Django的ORM查询的教程
2015/05/02 Python
python线程中的同步问题及解决方法
2019/08/29 Python
python字符串格式化方式解析
2019/10/19 Python
解决tensorflow添加ptb库的问题
2020/02/10 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
2020/03/12 Python
keras中的卷积层&池化层的用法
2020/05/22 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
关于PySnooper 永远不要使用print进行调试的问题
2021/03/04 Python
计算机通信工程专业毕业生推荐信
2013/12/24 职场文书
优乐美广告词
2014/03/14 职场文书
社会实践活动总结报告
2014/04/29 职场文书
淘宝活动总结范文
2014/06/26 职场文书
党的群众路线教育实践活动个人对照检查材料(四风)
2014/11/05 职场文书
李强感恩观后感
2015/06/17 职场文书
MySQL EXPLAIN输出列的详细解释
2021/05/12 MySQL
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js