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 相关文章推荐
jquery定时滑出可最小化的底部提示层特效代码
Oct 02 Javascript
JavaScript省市联动实现代码
Feb 15 Javascript
关于javascript模块加载技术的一些思考
Nov 28 Javascript
javascript中mouseover、mouseout使用详解
Jul 19 Javascript
浅析函数声明和函数表达式——函数声明的声明提前
May 03 Javascript
基于jquery实现的鼠标悬停提示案例
Dec 11 Javascript
Html中 IFrame的用法及注意点
Dec 22 Javascript
angular十大常见问题
Mar 07 Javascript
JS 中LocalStorage和SessionStorage的使用
Aug 17 Javascript
JS获取一个表单字段中多条数据并转化为json格式
Oct 17 Javascript
JavaScript实现为事件句柄绑定监听函数的方法分析
Nov 14 Javascript
javaScript手机号码校验工具类PhoneUtils详解
Dec 08 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上传文件并存储到mysql数据库的方法
2015/03/16 PHP
PHP中PDO连接数据库中各种DNS设置方法小结
2016/05/13 PHP
php ZipArchive实现多文件打包下载实例
2019/10/31 PHP
Laravel中GraphQL接口请求频率实战记录
2020/09/01 PHP
javaScript checkbox 全选/反选及批量删除
2010/04/28 Javascript
JavaScript中的字符串操作详解
2013/11/12 Javascript
window.location不跳转的问题解决方法
2014/04/17 Javascript
js全选实现和判断是否有复选框选中的方法
2015/02/17 Javascript
JavaScript将字符串转换成字符编码列表的方法
2015/03/19 Javascript
Javascript实现颜色rgb与16进制转换的方法
2015/04/18 Javascript
NodeJs中的VM模块详解
2015/05/06 NodeJs
js仿苹果iwatch外观的计时器代码分享
2015/08/26 Javascript
js将json格式的对象拼接成复杂的url参数方法
2016/05/25 Javascript
浅谈Angular的$q, defer, promise
2016/12/20 Javascript
基于react框架使用的一些细节要点的思考
2017/05/31 Javascript
BootStrap Select清除选中的状态恢复默认状态
2017/06/20 Javascript
vue中使用cropperjs的方法
2018/03/01 Javascript
使用Angular 6创建各种动画效果的方法
2018/10/10 Javascript
微信小程序实现签到功能
2018/10/31 Javascript
微信小程序实现原生步骤条
2019/07/25 Javascript
Node.JS枚举统计当前文件夹和子目录下所有代码文件行数
2019/08/23 Javascript
JavaScript实现网页下拉菜单效果
2020/11/20 Javascript
[01:57]DOTA2上海特锦赛小组赛解说单车采访花絮
2016/02/27 DOTA
[01:06:18]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第二场 1月26日
2021/03/11 DOTA
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
Python键盘输入转换为列表的实例
2018/06/23 Python
详解Python下Flask-ApScheduler快速指南
2018/11/04 Python
使用k8s部署Django项目的方法步骤
2019/01/14 Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
2020/04/19 Python
如何基于Python实现word文档重新排版
2020/09/29 Python
CSS3制作3D立方体loading特效
2020/11/09 HTML / CSS
和平主题的演讲稿
2014/01/12 职场文书
自主招生推荐信范文
2014/05/10 职场文书
欢迎横幅标语
2014/06/17 职场文书
国际经济与贸易专业求职信
2014/07/10 职场文书
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang