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与Prototype并存的冲突的解决方法
Aug 29 Javascript
jQuery语法总结和注意事项小结
Nov 11 Javascript
Jquery 跨域访问 Lightswitch OData Service的方法
Sep 11 Javascript
手机号码,密码正则验证
Sep 04 Javascript
jQuery实现邮箱下拉列表自动补全功能
Sep 08 Javascript
通过js动态创建标签,并设置属性方法
Feb 24 Javascript
JS实现的input选择图片本地预览功能示例
Aug 29 Javascript
JS中appendChild追加子节点无效的解决方法
Oct 14 Javascript
页面内锚点定位及跳转方法总结(推荐)
Apr 24 Javascript
vue elementui 实现搜索栏公共组件封装的实例代码
Jan 20 Javascript
js实现网页版贪吃蛇游戏
Feb 22 Javascript
解决VUE 在IE下出现ReferenceError: Promise未定义的问题
Nov 07 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代码
2011/11/27 PHP
php除数取整示例
2014/04/24 PHP
PHP读取mssql json数据中文乱码的解决办法
2016/04/11 PHP
CI框架的安全性分析
2016/05/18 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
非常漂亮的JS代码经典广告
2007/10/21 Javascript
javascript 可以拖动的DIV(二)
2009/06/26 Javascript
jquery ajax 局部无刷新更新数据的实现案例
2014/02/08 Javascript
JS图像无缝滚动脚本非常好用
2014/02/10 Javascript
基于javascript实现checkbox复选框实例代码
2016/01/28 Javascript
AngularJS指令详解及示例代码
2016/08/16 Javascript
AngularJS Ajax详解及示例代码
2016/08/17 Javascript
使用JS实现图片展示瀑布流效果(简单实例)
2016/09/06 Javascript
Vue实现路由跳转和嵌套
2017/06/20 Javascript
微信小程序实现打开内置地图功能【附源码下载】
2017/12/07 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
详解angularjs跨页面传参遇到的一些问题
2018/11/01 Javascript
JS闭包原理与应用经典示例
2018/12/20 Javascript
JS 图片压缩原理与实现方法详解
2020/04/29 Javascript
[54:08]LGD女子刀塔学院 DOTA2炼金术士教学
2014/01/09 DOTA
Python 可爱的大小写
2008/09/06 Python
Python获取脚本所在目录的正确方法
2014/04/15 Python
Python中zip()函数用法实例教程
2014/07/31 Python
python使用str & repr转换字符串
2016/10/13 Python
Django实现单用户登录的方法示例
2019/03/28 Python
python 实现屏幕录制示例
2019/12/23 Python
HTML5图片层叠的实现示例
2020/07/07 HTML / CSS
研究生自我鉴定范文
2013/10/30 职场文书
中专三年学习的个人自我评价
2013/12/12 职场文书
网上开商店的创业计划书
2014/01/19 职场文书
人才市场接收函
2015/01/30 职场文书
一篇文章带你搞懂Python类的相关知识
2021/05/20 Python
Go语言应该什么情况使用指针
2021/07/25 Golang
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server
使用CSS自定义属性实现骨架屏效果
2022/06/21 HTML / CSS