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 相关文章推荐
JQuery Ajax 跨域访问的解决方案
Mar 12 Javascript
js动态添加删除,后台取数据(示例代码)
Nov 25 Javascript
jquery使用$(element).is()来判断获取的tagName
Aug 24 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
Sep 09 Javascript
jquery trigger实现联动的方法
Feb 29 Javascript
Node.js Streams文件读写操作详解
Jul 04 Javascript
jQuery插件扩展实例【添加回调函数】
Nov 26 Javascript
微信小程序实现点击文字页面跳转功能【附源码下载】
Dec 12 Javascript
javascript中UMD规范的代码推演
Aug 29 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
Nov 05 Javascript
在Vue中使用Echarts实例图的方法实例
Oct 10 Javascript
vue3获取当前路由地址
Feb 18 Vue.js
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一次性删除前台checkbox多选内容的方法
2013/09/22 PHP
PHP Curl多线程原理实例详解
2013/11/06 PHP
PHP连接sql server 2005环境配置及问题解决
2014/08/08 PHP
php 中的信号处理操作实例详解
2020/03/04 PHP
CL vs ForZe BO5 第四场 2.13
2021/03/10 DOTA
javascript URL锚点取值方法
2009/02/25 Javascript
基于jQuery的合并表格中相同文本的相邻单元格的代码
2011/04/06 Javascript
JavaScript高级程序设计 读书笔记之八 Function类及闭包
2012/02/27 Javascript
JQuery弹出层示例可自定义
2014/05/19 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
Angular的事件和表单详解
2016/12/26 Javascript
vue实现表单录入小案例
2019/09/27 Javascript
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
[01:10:58]KG vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python实现一个简单的MySQL类
2015/01/07 Python
在Python中使用PIL模块对图片进行高斯模糊处理的教程
2015/05/05 Python
Python的time模块中的常用方法整理
2015/06/18 Python
使用Filter过滤python中的日志输出的实现方法
2019/07/17 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
Django实现后台上传并显示图片功能
2020/05/29 Python
Python爬虫入门有哪些基础知识点
2020/06/02 Python
分享29个基于Bootstrap的HTML5响应式网页设计模板
2015/11/19 HTML / CSS
size?法国官网:英国伦敦的球鞋精品店
2020/03/15 全球购物
自主招生自荐信格式
2013/12/03 职场文书
学校七一活动方案
2014/01/19 职场文书
写求职信要注意什么问题
2014/04/12 职场文书
幼儿园教师的考核评语
2014/04/18 职场文书
乡镇领导班子四风整顿行动工作汇报
2014/10/25 职场文书
档案接收函格式
2015/01/30 职场文书
国庆庆典邀请函
2015/02/02 职场文书
情侣之间的道歉短信
2015/05/12 职场文书
《成长的天空》读后感3篇
2019/12/06 职场文书
详解vue身份认证管理和租户管理
2021/05/25 Vue.js
制作能在nginx和IIS中使用的ssl证书
2021/06/21 Servers
为什么MySQL分页用limit会越来越慢
2021/07/25 MySQL
SQL Server删除表中的重复数据
2022/05/25 SQL Server