Node.js微信 access_token ( jsapi_ticket ) 存取与刷新的示例


Posted in Javascript onSeptember 30, 2017

access_token

微信文档里存在两种access_token:普通 access_token 和 网页授权 access_token。具体区别参考:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

以下提到的 access_token 均为普通的 access_token

1. 首先我们先去看看是如何请求 access_token 的? 微信公众平台技术文档

GET请求:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

正常返回:{"access_token":"ACCESS_TOKEN","expires_in":7200}

错误返回:{"errcode":40013,"errmsg":"invalid appid"}

2. 所以获取 access_token 的代码如下:

const request = require('request') // 请安装第三方包 request

request.get({
  uri: 'https://api.weixin.qq.com/cgi-bin/token',
  json: true,
  qs: {
   grant_type: 'client_credential',
   appid: APPID, // APPID请换成你的 appid
   secret: APPSECRET // APPSECRET请换成你的 appsecret
  }
 }, (err, res, body) => {
  if (err) {
   console.log(err)
   return
  }
  console.log(body)
  if (body.errcode) {
   // 返回错误时的处理
   return
  }
})

3. guard_dog 实现数据持久化和定时刷新

guard_dog 会生成 .dog 文件,每个文件对应一个KEY

const guard_dog = require('guard_dog') // 请安装第三方包 guard_dog

guard_dog.init(KEY, (handler) => { // KEY是guard_dog存取数据的键名
 // 拿到数据后调用 handler
 handler(DATA, EXPIREDS_IN) // DATA是要持久化的数据,EXPIREDS_IN是数据的有效时间,单位是秒
}, DIR) // DIR是 .dog 文件的存放目录,这个参数可以不传

4. 现在把以上两块代码合并起来就是我们要的效果

const request = require('request')
const guard_dog = require('guard_dog')

guard_dog.init('ACCESS_TOKEN', (handler) => {
 request.get({
  uri: 'https://api.weixin.qq.com/cgi-bin/token',
  json: true,
  qs: {
   grant_type: 'client_credential',
   appid: APPID, // APPID请换成你的 appid
   secret: APPSECRET // APPSECRET请换成你的 appsecret
  }
 }, (err, res, body) => {
  if (err) {
   console.log(err)
   return
  }
  console.log(body)
  if (body.errcode) {
   return
  }
  handler(body.access_token, body.expires_in)
 })
}) // 如有需要指定目录,可以再给 guard_dog.init 多传个参数

5. guard_dog 初始化这个 key 之后,获取到的都是有效的值了。guard_dog 获取值代码如下:

guard_dog.get('ACCESS_TOKEN', (data) => { // 上面初始化时用的键名为'ACCESS_TOKEN',所以这里取值也要用这个键名
 // 在这里拿到的 data 就是 access_token 了
})

6.如果想用着方便点,可以直接封装成一个模块

access_token.js

const request = require('request')
const guard_dog = require('guard_dog')
// 加载这个模块的时候给 ACCESS_TOKEN 这个键名初始化
guard_dog.init('ACCESS_TOKEN', (handler) => {
 request.get({
  uri: 'https://api.weixin.qq.com/cgi-bin/token',
  json: true,
  qs: {
   grant_type: 'client_credential',
   appid: APPID, // APPID请换成你的 appid
   secret: APPSECRET // APPSECRET请换成你的 appsecret
  }
 }, (err, res, body) => {
  if (err) {
   console.log(err)
   return
  }
  console.log(body)
  if (body.errcode) {
   return
  }
  handler(body.access_token, body.expires_in)
 })
}) 
// 只要向外暴露一个获取值的方法就可以了
module.exports = function (callback) {
 guard_dog.get('ACCESS_TOKEN', callback)
}

使用:

const access_token = require('./access_token') // 这里把这个模块与 access_token 模块当成在同一目录下来作为例子。
access_token((data) => {
 // 这个 data 就是 access_token
})

jsapi_ticket

jsapi_ticket 官方文档说明

上面关于 access_token 的例子已经说得很详细了,jsapi_ticket 处理起来也大同小异,所以下面直接贴代码了:

(需要注意一点:获取 jsapi_ticket 需要依赖 access_token,下面的代码直接依赖了上面所写的 access_token.js)

jsapi_ticket.js

const request = require('request')
const guard_dog = require('guard_dog')
const access_token = require('./access_token')

guard_dog.init('JSAPI_TICKET', (handler) => {
 access_token((access_token) => {
  request.get({
   uri: 'https://api.weixin.qq.com/cgi-bin/ticket/getticket',
   json: true,
   qs: {
    access_token: access_token,
    type: 'jsapi'
   }
  }, (err, res, body) => {
   if (err) {
    console.log(err)
    return
   }
   console.log(body)
   if (body.errcode) {
    return
   }
   handler(body.ticket, body.expires_in)
  })
 })
})

module.exports = function (callback) {
 guard_dog.get('JSAPI_TICKET', callback)
}

使用:

const jsapi_ticket = require('./jsapi_ticket')
jsapi_ticket((data) => {
 // 这个 data 就是 jsapi_ticket
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript下判断一个对象是否具有指定名称的属性的的代码
Jan 11 Javascript
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
Jun 27 Javascript
使用JS读秒使用示例
Sep 21 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
Feb 19 Javascript
js光标定位文本框回车表单提交问题的解决方法
May 11 Javascript
JavaScript 事件对内存和性能的影响
Jan 22 Javascript
js实现华丽的九九乘法表效果
Mar 29 Javascript
微信小程序录音与播放录音功能
Dec 25 Javascript
Vue单页面应用保证F5强刷不清空数据的解决方案
Jan 31 Javascript
javascript中UMD规范的代码推演
Aug 29 Javascript
vue 使用鼠标滚动加载数据的例子
Oct 31 Javascript
浅谈JavaScript中this的指向更改
Jul 28 Javascript
jqgrid实现简单的单行编辑功能
Sep 30 #Javascript
微信小程序富文本渲染引擎的详解
Sep 30 #Javascript
js实现数组和对象的深浅拷贝
Sep 30 #Javascript
node通过express搭建自己的服务器
Sep 30 #Javascript
react-native中ListView组件点击跳转的方法示例
Sep 30 #Javascript
详解在Vue中有条件地使用CSS类
Sep 30 #Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
Sep 30 #Javascript
You might like
php下一个阿拉伯数字转中文数字的函数
2007/07/16 PHP
简单的php中文转拼音的实现代码
2014/02/11 PHP
PHP获取音频文件的相关信息
2015/06/22 PHP
深入浅析php json 格式控制
2015/12/24 PHP
PHP实现多图上传(结合uploadify插件)思路分析
2016/11/30 PHP
ThinkPHP实现分页功能
2017/04/28 PHP
tp5(thinkPHP5框架)时间查询操作实例分析
2019/05/29 PHP
Jquery中request和request.form和request.querystring的区别
2015/11/26 Javascript
js实现tab选项卡切换功能
2017/01/13 Javascript
整理关于Bootstrap模态弹出框的慕课笔记
2017/03/29 Javascript
JS中实现隐藏部分姓名或者电话号码的代码
2018/07/17 Javascript
node.js之基础加密算法模块crypto详解
2018/09/11 Javascript
Vue 使用formData方式向后台发送数据的实现
2019/04/14 Javascript
vue使用axios上传文件(FormData)的方法
2019/04/14 Javascript
node.js实现带进度条的多文件上传
2020/03/27 Javascript
layer弹出层倒计时关闭的实现方法
2019/09/27 Javascript
JS实现贪吃蛇游戏
2019/11/15 Javascript
JS轮播图的实现方法2
2020/08/25 Javascript
python实现逆波兰计算表达式实例详解
2015/05/06 Python
python转换字符串为摩尔斯电码的方法
2015/07/06 Python
解决python3爬虫无法显示中文的问题
2018/04/12 Python
Python List列表对象内置方法实例详解
2019/10/22 Python
PYTHON如何读取和写入EXCEL里面的数据
2019/10/28 Python
将python文件打包exe独立运行程序方法详解
2020/02/12 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
2020/04/07 Python
python代码中怎么换行
2020/06/17 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
2020/07/28 Python
耐克中国官方商城:Nike中国
2018/10/18 全球购物
shallow copy和deep copy的区别
2016/05/09 面试题
项目专员岗位职责
2013/12/04 职场文书
移风易俗倡议书
2014/04/15 职场文书
运动会宣传口号
2014/06/09 职场文书
群众路线教育实践活动对照检查材料
2014/09/22 职场文书
公司年会开场白
2015/06/01 职场文书
学生病假条范文
2015/08/17 职场文书
详解thinkphp的Auth类认证
2021/05/28 PHP