欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

微信小程序 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)
            })
        })
    })
}