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 调试利器 Firebug使用详解六
Jul 05 Javascript
各浏览器对click方法的支持差异小结
Jul 31 Javascript
关于JavaScript的面向对象和继承有利新手学习
Jan 11 Javascript
分享一则javascript 调试技巧
Jan 02 Javascript
javascript实现获取浏览器版本、操作系统类型
Jan 29 Javascript
基于Jquery实现万圣节快乐特效
Nov 01 Javascript
JavaScript中利用各种循环进行遍历的方式总结
Nov 10 Javascript
javascript实现动态统计图开发实例
Nov 21 Javascript
javascript基于prototype实现类似OOP继承的方法
Dec 16 Javascript
vue props对象validator自定义函数实例
Nov 13 Javascript
JavaScript实现图片伪异步上传过程解析
Apr 10 Javascript
vue el-upload上传文件的示例代码
Dec 21 Vue.js
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适配器模式(Adapter)
2014/11/25 PHP
PHP使用gmdate实现将一个UNIX 时间格式化成GMT文本的方法
2015/03/19 PHP
php显示指定目录下子目录的方法
2015/03/20 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
用jquery来定位
2007/02/20 Javascript
用JavaScript 处理 URL 的两个函数代码
2007/08/13 Javascript
javascript add event remove event
2008/04/07 Javascript
用Greasemonkey 脚本收藏网站会员信息到本地
2009/10/26 Javascript
40款非常棒的jQuery 插件和制作教程(系列二)
2011/11/02 Javascript
实现只能输入数字的input不用replace方法
2013/09/12 Javascript
express的中间件basicAuth详解
2014/12/04 Javascript
深入理解JavaScript系列(42):设计模式之原型模式详解
2015/03/04 Javascript
jquery实现select选择框内容左右移动代码分享
2015/11/21 Javascript
解决JavaScript数字精度丢失问题的方法
2015/12/03 Javascript
javascript合并表格单元格实例代码
2016/01/03 Javascript
javascript截图 jQuery插件imgAreaSelect使用详解
2016/05/04 Javascript
基于vue.js实现侧边菜单栏
2017/03/20 Javascript
vue使用ElementUI时导航栏默认展开功能的实现
2018/07/04 Javascript
vue工程全局设置ajax的等待动效的方法
2019/02/22 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
利用Vue的v-for和v-bind实现列表颜色切换
2020/07/17 Javascript
python3.6+django2.0开发一套学员管理系统
2018/03/03 Python
python3实现SMTP发送邮件详细教程
2018/06/19 Python
Atom的python插件和常用插件说明
2018/07/08 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
2019/10/28 Python
django框架auth模块用法实例详解
2019/12/10 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
python中random模块详解
2021/03/01 Python
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
高中自我评价分享
2013/12/05 职场文书
产品销售员岗位职责
2013/12/18 职场文书
班主任工作实习计划
2015/01/16 职场文书
商场营业员岗位职责
2015/04/14 职场文书
php中pcntl_fork详解
2021/04/01 PHP
关于mysql中时间日期类型和字符串类型的选择
2021/11/27 MySQL
动漫APP软件排行榜前十名,半次元上榜,第一款由腾讯公司推出
2022/03/18 杂记