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 相关文章推荐
getElementByIdx_x js自定义getElementById函数
Jan 24 Javascript
javascript检测页面是否缩放的小例子
May 16 Javascript
JS文本框追加多个下拉框的值的简单实例
Jul 12 Javascript
jQuery瀑布流插件Wookmark使用实例
Apr 02 Javascript
自己用jQuery写了一个图片的马赛克消失效果
May 04 Javascript
JS如何判断json是否为空
Jul 06 Javascript
vue实现可增删查改的成绩单
Oct 27 Javascript
jquery无法为动态生成的元素添加点击事件的解决方法(推荐)
Dec 26 Javascript
使用vue-infinite-scroll实现无限滚动效果
Jun 22 Javascript
原生JS实现轮播图效果
Oct 12 Javascript
使用JS判断页面是首次被加载还是刷新
May 26 Javascript
手机浏览器唤起微信分享(JS)
Oct 11 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
星际争霸任务指南——人族
2020/03/04 星际争霸
PHP MVC模式在网站架构中的实现分析
2010/03/04 PHP
通过php快速统计某个数据库中每张表的数据量
2012/09/04 PHP
php ZipArchive压缩函数详解实例
2013/11/06 PHP
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
2013/07/09 Javascript
深入理解Javascript动态方法调用与参数修改的问题
2013/12/10 Javascript
jquery 操作两个select实现值之间的互相传递
2014/03/07 Javascript
JS应用正则表达式转换大小写示例
2014/09/18 Javascript
Javascript中的getUTCDay()方法使用详解
2015/06/10 Javascript
再谈JavaScript异步编程
2016/01/27 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
2016/12/24 Javascript
jQuery实现6位数字密码输入框
2016/12/29 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
2017/03/11 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
2017/03/14 Javascript
Vue 2.0 服务端渲染入门介绍
2017/03/29 Javascript
旺旺在线客服代码 旺旺客服代码生成器
2018/01/09 Javascript
vue-router中的hash和history两种模式的区别
2018/07/17 Javascript
vue根据值给予不同class的实例
2018/09/29 Javascript
[00:20]TI9观赛名额抽取Ⅱ
2019/07/24 DOTA
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
python如何修改装饰器中参数
2018/03/20 Python
python多任务之协程的使用详解
2019/08/26 Python
Pytorch之卷积层的使用详解
2019/12/31 Python
详解python metaclass(元类)
2020/08/13 Python
欧洲最大的滑雪假期供应商之一:Sunweb Holidays
2018/01/06 全球购物
蔻驰英国官网:COACH英国
2020/07/19 全球购物
教师岗位职责
2013/11/17 职场文书
小学二年级学生评语
2014/04/21 职场文书
出差报告范文
2014/11/06 职场文书
教师工作总结范文2014
2014/11/10 职场文书
人事行政助理岗位职责
2015/04/11 职场文书
国庆节新闻稿
2015/07/17 职场文书
聘任书格式及范文
2015/09/21 职场文书
JavaScript中关于预编译、作用域链和闭包的理解
2021/03/31 Javascript
Win10 最新稳定版本 21H2开始推送
2022/04/19 数码科技