Node.js 微信 access_token 与 jsapi_ticket 存取及刷新示例

作者:服务小站时间:2026-10-22 09:03:46浏览:488

本文介绍在 Node.js 环境中如何获取并管理微信普通 access_token 和 jsapi_ticket。通过结合 request 库发起 HTTP 请求,利用 guard_dog 模块实现数据的本地文件持久化与定时刷新机制,提供完整的代码示例及模块封装方法,帮助开发者简化 Token 管理流程。

微信 access_token 概述与请求接口

access_token

微信官方文档中定义了两种不同类型的 access_token:普通 access_token 与网页授权 access_token。两者在用途和权限范围上存在具体差异,详细对比可参考:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

本文后续内容中提及的 access_token 均指代普通 access_token。

首先,我们需要了解如何发起请求以获取 access_token。具体接口规范可查阅微信公众平台技术文档。

请求方式为 GET,目标 URL 为:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

若请求成功,服务器将返回如下 JSON 格式数据:{"access_token":"ACCESS_TOKEN","expires_in":7200}

若请求失败,服务器将返回错误信息,例如:{"errcode":40013,"errmsg":"invalid appid"}

基于上述接口规范,获取 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
  }
})

利用 guard_dog 实现数据持久化与刷新

接下来,介绍如何利用 guard_dog 模块实现数据的持久化存储以及 access_token 的定时刷新机制。

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 文件的存放目录,这个参数可以不传

将上述网络请求代码与 guard_dog 的持久化逻辑合并后,即可实现预期的自动管理效果。


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 多传个参数

在 guard_dog 完成对该 KEY 的初始化配置后,后续获取到的值均为有效数据。guard_dog 获取具体值的代码如下:


guard_dog.get('ACCESS_TOKEN', (data) => { // 上面初始化时用的键名为'ACCESS_TOKEN',所以这里取值也要用这个键名
 // 在这里拿到的 data 就是 access_token 了
})

为了提升开发便利性,可以直接将上述逻辑封装为一个独立的 Node.js 模块。

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

关于 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
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

作者最新文章