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 相关文章推荐
分享别人写的一个小型js框架
Aug 13 Javascript
JS中的构造函数详细解析
Mar 10 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
Aug 03 Javascript
jQuery实现的背景动态变化导航菜单效果
Aug 24 Javascript
JavaScript的设计模式经典之建造者模式
Feb 24 Javascript
jQuery学习心得总结(必看篇)
Jun 10 Javascript
javascript数组常用方法汇总
Sep 10 Javascript
js实现table添加行tr、删除行tr、清空行tr的简单实例
Oct 15 Javascript
JavaScript事件发布/订阅模式原理与用法分析
Aug 21 Javascript
Vuex的基本概念、项目搭建以及入坑点
Nov 04 Javascript
详解实现一个通用的“划词高亮”在线笔记功能
Apr 23 Javascript
JS前后端实现身份证号验证代码解析
Jul 23 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+mysqli使用预处理技术进行数据库查询的方法
2015/01/28 PHP
php实现留言板功能
2017/03/05 PHP
PHP PDOStatement::errorInfo讲解
2019/01/31 PHP
php面试中关于面向对象的相关问题
2019/02/13 PHP
PHP中的异常处理机制深入讲解
2020/11/10 PHP
Ext面向对象开发实践(续)
2008/11/18 Javascript
Javascript 学习书 推荐
2009/06/13 Javascript
IE6、IE7中获取Button元素的值的bug说明
2011/08/28 Javascript
关于删除时的提示处理(确定删除吗)
2013/11/03 Javascript
各浏览器对document.getElementById等方法的实现差异解析
2013/12/05 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
2016/01/14 Javascript
JS验证逗号隔开可以是中文字母数字
2016/04/22 Javascript
nodejs根据ip数组在百度地图中进行定位
2017/03/06 NodeJs
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
Jquery Datatables的使用详解
2020/01/30 jQuery
node脚手架搭建服务器实现token验证的方法
2021/01/20 Javascript
[49:08]Secret vs VP 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python实现上传样本到virustotal并查询扫描信息的方法
2014/10/05 Python
Python中用Decorator来简化元编程的教程
2015/04/13 Python
python实现树形打印目录结构
2018/03/29 Python
Python生成器的使用方法和示例代码
2019/03/04 Python
Python小白必备的8个最常用的内置函数(推荐)
2019/04/03 Python
Anaconda配置pytorch-gpu虚拟环境的图文教程
2020/04/16 Python
史上最详细的Python打包成exe文件教程
2021/01/17 Python
HTML5 Canvas标签使用收录
2009/07/07 HTML / CSS
世界上最大的糖果店:Dylan’s Candy Bar
2017/11/07 全球购物
丽笙酒店官方网站:Radisson Hotels
2019/05/07 全球购物
市场营销调查计划书
2014/05/02 职场文书
2014年教师节演讲稿范文
2014/09/10 职场文书
网络营销计划
2015/01/17 职场文书
幼儿园中秋节活动总结
2015/03/23 职场文书
大学生暑假实习总结
2015/07/13 职场文书
2015-2016年小学教导工作总结
2015/07/21 职场文书
2016中秋节月饼促销广告语
2016/01/28 职场文书
MySQL分库分表详情
2021/09/25 MySQL
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang