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入门——用one()方法绑定事件处理函数(仅触发一次)
Feb 05 Javascript
浅析js封装和作用域
Jul 09 Javascript
event对象获取方法总结在google浏览器下测试
Nov 03 Javascript
基于jQuery实现最基本的淡入淡出效果实例
Feb 02 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
Jul 17 Javascript
Angular.JS通过指令操作DOM的方法
May 10 Javascript
jquery实现图片放大点击切换
Jun 06 jQuery
详解为生产环境编译Angular2应用的方法
Dec 10 Javascript
js/jquery遍历对象和数组的方法分析【forEach,map与each方法】
Feb 27 jQuery
详解一个基于套接字实现长连接的express
Mar 28 Javascript
node 文件上传接口的转发的实现
Sep 23 Javascript
如何阻止移动端浏览器点击图片浏览
Aug 29 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实现文件上传二法
2006/10/09 PHP
php XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
laravel安装和配置教程
2014/10/29 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
jquery里的each使用方法详解
2010/12/22 Javascript
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
2014/02/07 Javascript
javascript自动生成包含数字与字符的随机字符串
2015/02/09 Javascript
Js与Jq 获取页面元素值的方法和差异对比
2015/04/30 Javascript
Bootstrap轮播图学习使用
2017/02/10 Javascript
js获取当前页的URL与window.location.href简单方法
2017/02/13 Javascript
js正则表达式验证表单【完整版】
2017/03/06 Javascript
vue.js 嵌套循环、if判断、动态删除的实例
2018/03/07 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
Vue2实时监听表单变化的示例讲解
2018/08/30 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
JavaScript DOM常用操作代码汇总
2020/07/03 Javascript
Element PageHeader页头的使用方法
2020/07/26 Javascript
[00:57]辉夜杯战队访谈宣传片—VG
2015/12/25 DOTA
python实现探测socket和web服务示例
2014/03/28 Python
python中实现定制类的特殊方法总结
2014/09/28 Python
八大排序算法的Python实现
2021/01/28 Python
使用Python写一个小游戏
2018/04/02 Python
Python中生成一个指定长度的随机字符串实现示例
2019/11/06 Python
python绘制彩虹图
2019/12/16 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
2020/06/08 Python
Pycharm无法打开双击没反应的问题及解决方案
2020/08/17 Python
关于.NET, HTML的五个问题
2012/08/29 面试题
大学本科毕业生的自我鉴定范文
2013/11/19 职场文书
2014自荐信的写作技巧
2014/01/28 职场文书
个人作风剖析材料
2014/02/02 职场文书
2014年药品销售工作总结
2014/12/16 职场文书
2015年小学开学寄语
2015/02/27 职场文书
辩论会主持词
2015/07/03 职场文书
MySQL中VARCHAR与CHAR格式数据的区别
2021/05/26 MySQL
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android