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中Ajax的get、post等方法详解
Jan 20 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
Jul 21 Javascript
JavaScript中的Number数字类型学习笔记
May 26 Javascript
mvc 、bootstrap 结合分布式图简单实现分页
Oct 10 Javascript
Vue.js实现简单动态数据处理
Feb 13 Javascript
jQuery+ajax实现修改密码验证功能实例详解
Jul 06 jQuery
jquery select插件异步实时搜索实例代码
Oct 20 jQuery
详解vue2.0+axios+mock+axios-mock+adapter实现登陆
Jul 19 Javascript
vue 本地服务不能被外部IP访问的完美解决方法
Oct 29 Javascript
tsconfig.json配置详解
May 17 Javascript
详解JavaScript 中的批处理和缓存
Nov 19 Javascript
JavaScript设计模式之原型模式详情
Jun 21 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
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
使用PHP导出Redis数据到另一个Redis中的代码
2014/03/12 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
php 流程控制switch的简单实例
2016/06/07 PHP
PHP微信支付实例解析
2016/07/22 PHP
php数组遍历类与用法示例
2019/05/24 PHP
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
js如何实现点击标签文字,文字在文本框出现
2015/08/05 Javascript
深入理解bootstrap框架之入门准备
2016/10/09 Javascript
微信小程序 用户数据解密详细介绍
2017/01/09 Javascript
js遍历json的key和value的实例
2017/01/22 Javascript
js移动端图片压缩上传功能
2020/08/18 Javascript
vue 组件 全局注册和局部注册的实现
2018/02/28 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
JS实现放大镜效果
2020/09/21 Javascript
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
详解Python安装tesserocr遇到的各种问题及解决办法
2019/03/07 Python
Django rstful登陆认证并检查session是否过期代码实例
2019/08/13 Python
CSS3混合模式mix-blend-mode/background-blend-mode简介
2018/03/15 HTML / CSS
Hunkemöller西班牙:欧洲最大的内衣连锁店
2018/08/15 全球购物
莫斯科制造商的廉价皮大衣:Fursk
2020/06/09 全球购物
销售文员的岗位职责
2013/11/20 职场文书
金融专业大学生职业生涯规划范文
2014/01/16 职场文书
解除劳动合同协议书
2014/04/14 职场文书
小学生作文评语
2014/04/18 职场文书
银行先进个人事迹材料
2014/05/11 职场文书
主题团日活动总结
2014/06/25 职场文书
农村党支部书记四风问题个人对照检查材料
2014/09/21 职场文书
分居协议书范本
2014/11/03 职场文书
2014年安全管理工作总结
2014/12/01 职场文书
2015年化验员工作总结
2015/04/10 职场文书
2016年教师节贺卡寄语
2015/12/04 职场文书
会计专业自荐信范文
2019/05/22 职场文书
Python如何配置环境变量详解
2021/05/18 Python
Python采集爬取京东商品信息和评论并存入MySQL
2022/04/12 Python