微信小程序 node.js 实现accessToken获取 并判断是否在有效期内
程序员文章站
2022-05-19 12:04:16
...
写在前面的话:后台使用了微信官方提供的 基于Wafer 2 的框架。knex.js操作数据库, koa2实现同步异步请求
准备工作:1)获取自己小程序的appId;2)获取自己小程序的App Secret;
const { mysql } = require('../qcloud')
async function getAccessToken (ctx) {
let url = 'https://api.weixin.qq.com/cgi-bin/token?' +
'grant_type=client_credential&appid="你的addid"&secret=你的appsecret'
let eventuallySccessToken = ''
let accessToken = ''
// wx_accessToken为存储accessToken的表
const sqlAccessToken = await mysql('wx_accessToken').select('*').first()
// 数据库中是否有存储过accessToken记录
if (sqlAccessToken !== undefined) {
// 判断是否过期
let oldTime = sqlAccessToken.creat_time
oldTime = new Date(oldTime).getTime()
let newTime = (new Date()).getTime()
let resutl = parseInt((newTime - oldTime) / 1000 / 60 / 60)
if (resutl > 1) {
// 从新获取access_token值
accessToken = await getHttpOption(url)
// 存储后台
if (accessToken) {
// 存储后台
await mysql('wx_accessToken').update({access_token: accessToken.access_token}).where('id', sqlAccessToken.id)
eventuallySccessToken = accessToken.access_token
} else {
ctx.state.data = {
code: -1,
msg: '获取失败!'
}
return
}
} else {
// 没有过期 继续使用数据库中的access_token值
eventuallySccessToken = sqlAccessToken.access_token
}
} else {
// 从新请求并存储
accessToken = await getHttpOption(url)
// 插入数据库
if (accessToken) {
// 存储后台
await mysql('wx_accessToken').insert({access_token: accessToken.access_token})
eventuallySccessToken = accessToken.access_token
} else {
ctx.state.data = {
code: -1,
msg: '获取失败!'
}
return
}
}
ctx.state.data = {
eventuallySccessToken,
msg: '获取成功!'
}
}
// 自己封装的同步请求函数
function getHttpOption (url) {
return new Promise((resolve, reject) => {
https.get(url, res => {
let urlDate = ''
res.on('data', data => {
urlDate += data
})
res.on('end', data => {
const accessToken = JSON.parse(urlDate)
if (accessToken) {
resolve(accessToken)
}
reject(accessToken)
})
})
})
}