微信小程序 node.js 实现accessToken获取
阅读 147 作者 傻瓜

写在前面的话:后台使用了微信官方提供的 基于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)
            })
        })
    })
}
[编辑于 2019/05/12 09:00]