本文介绍在 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
})
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。