美文网首页
接口调用凭证access_token的缓存与更新

接口调用凭证access_token的缓存与更新

作者: 泡杯感冒灵 | 来源:发表于2020-12-21 13:11 被阅读0次

    这里把获取到的access_token存在了项目里的JSON文件里,当然还有其他的存储方式。

    const axios = require('axios') 
    const APPID = 'wx13c4ba61e6605db3'
    const APPSECRET = 'e7318761870106efad750ad55c32ec40'
    const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APPID}&secret=${APPSECRET}`
    const fs = require('fs')
    const path = require('path')
    // 存储access_token的json文件的路径
    const fileName = path.resolve(__dirname, './access_token.json')
    
    // 更新access_token的方法(第一次是获取并保存)
    const updateAccessToken = async () => {
      const resStr = await axios.get(url)
      const access_token = resStr.data.access_token
      // 写文件
      if (access_token) {
        fs.writeFileSync(fileName, JSON.stringify({
          access_token,
          createTime:new Date()  // 存access_token的时候,配合createTime以方便计算过期时间
        }))
      } else {
        // 在access_token没有获取到的情况下,再次调用updateAccessToken去获取access_token
        await updateAccessToken()
      }
    }
    
    // 每两个小时更新一下access_token
    // 一般情况下,不是等到2个小时才更新,而是提前五分钟
    setInterval(async () => { 
      await updateAccessToken()
    },(7200 - 300) * 1000)
    
    // 取access_token的方法
    const getAccessToken = async () => {
      // 假如是第一次调用,access_token还没有生成,那么这个函数会报错,因为找不到access_token.json文件
      // 所以要放入 try catch进行异常捕获,在捕获到异常的时候,去更新一下access_token
      // 更新完成以后,再去读取access_token,所以需要再次调用一下getAccessToken
      try {
        //读取文件
        const readRes = fs.readFileSync(fileName, 'utf8')
        const readObj = JSON.parse(readRes)
        // 在我们获取access_token的时候,虽然每2个小时会更新一下access_token,但是因为更新的代码时放在服务器上的,假如服务器宕机了,
        // 超过了2个小时,那么当我们再去调用getAccessToken的时候,获取的就是过期的access_token,这明细是不行的。
        // 所以,我们在获取access_token的方法里,加入判断逻辑,判断JSON文件里存的access_token的createTime和当前调用获取方法的时间的间隔
        // 如果间隔超过2个小时,就更新access_token并重新获取
        const createTime = new Date(readObj.createTime).getTime()
        const nowTime = new Date().getTime()
        if ((nowTime - createTime)/1000/60/60 >= 2) {
          await updateAccessToken()
          await getAccessToken()
        }
        return readObj.access_token
      } catch (error) {
        await updateAccessToken()
        await getAccessToken()
      }
    }
    
    module.exports = getAccessToken
    

    相关文章

      网友评论

          本文标题:接口调用凭证access_token的缓存与更新

          本文链接:https://www.haomeiwen.com/subject/aqtzgktx.html