yangyin
2024-11-21 f9ac580238527a3e9f5a13b2c7ea49d02a7a1a83
utils/api.js
@@ -3,168 +3,113 @@
let Constant = require('../utils/constant.js')
let app = getApp()
let ACCESS_TOKEN_KEY = 'AccessToken'
const expiredDateOffset = -1000 * 60 * 5;
let API = (params) => {
  let tokenInfo = wx.getStorageSync(ACCESS_TOKEN_KEY)
  let currentDateTime = new Date().getTime()
  if (!tokenInfo) {
    wx.reLaunch({
      url: '/login/login/index',
    })
    return
  }
  const token = tokenInfo.Token;
  const refresh_token = tokenInfo.RefreshToken
  if (!refresh_token) {
    wx.reLaunch({
      url: '/login/login/index',
    })
    return
  }
  //解析token
  const jwt_token = decryptJWT(token);
  // 获取token失效时间
  const exp_token = getJWTDate(jwt_token.exp).getTime()
  // token失效状态
  const isExpireByToken = currentDateTime >= exp_token
  //解析refreshtoken
  const jwt_refresh_token = decryptJWT(refresh_token);
  // 获取refreshToken失效时间
  const exp_refresh_token = getJWTDate(jwt_refresh_token.exp).getTime();
  // refreshToken失效状态
  const isExpireByRefreshToken = currentDateTime >= exp_refresh_token
  // 判断 token和refreshToken是否都失效,都失效则重新刷新页面Token
  if ((isExpireByToken && isExpireByRefreshToken) && tokenInfo.isNeedToken) {
    RefreshToken()
  }
  // 判断 token 失效但refreshToken没失效
  if ((!isExpireByToken && isExpireByRefreshToken) && tokenInfo.isNeedToken) {
    tokenInfo.Token = refresh_token
    wx.setStorageSync(ACCESS_TOKEN_KEY, tokenInfo)
  }
  let defaultParams = {
    url: '',
    method: "GET",
    data: "",
    header: {
      'content-type': 'application/json'
        'content-type': 'application/json'
    },
    success: function () {},
    fail: function () {},
    complete: function () {}
};
let requestParam = Object.assign(defaultParams, params);
let tokenInfo = wx.getStorageSync(ACCESS_TOKEN_KEY)
let accessToken= tokenInfo.Token
if (accessToken) {
  // 将 token 添加到请求报文头中
  requestParam.header.Authorization = `Bearer ${accessToken}`;
  // 判断 accessToken 是否过期
  const isExpired = checkTokenExpired(accessToken, expiredDateOffset);
  // token 已经过期
  if (isExpired) {
    // 获取刷新 token
    const tokenInfo2 = wx.getStorageSync(ACCESS_TOKEN_KEY);
     let refreshAccessToken=tokenInfo2.RefreshToken
    if (refreshAccessToken) {
      const refreshIsExpired = checkTokenExpired(refreshAccessToken);
      if (refreshIsExpired) {
        wx.reLaunch({
        url: '/login/login/index',
      })
      return
      } else {
        requestParam.header.Authorization = `Bearer ${refreshAccessToken}`;
      }
    }
  }
  let requestParam = Object.assign(defaultParams, params)
  // 判断是否要添加token
  if (tokenInfo.isNeedToken == true) {
    requestParam.header.Authorization = 'Bearer ' + tokenInfo.Token
  }
  wx.request({
}
wx.request({
    url: requestParam.url,
    method: requestParam.method,
    data: requestParam.data,
    header: requestParam.header,
    success: res => {
      let result = res.data
      if (result.Data != undefined && result.Data == 401) {
        RefreshToken()
        return
      }
      if (result.Code && result.Code != 0) {
        if (result.Code == -3) {
          wx.showModal({
            title: result.Message,
            complete: (res) => {
              if (res.cancel) {
// 只能叫 access-token,不能跟 accessTokenKey 一样
const accessToken = res.header['access-token'];
// 只能叫 x-access-token',不能跟 refreshAccessTokenKey 一样
const refreshAccessToken = res.header['x-access-token'];
              }
              if (res.confirm) {
              }
            }
// 判断是否是无效 token
if (accessToken === 'invalid_token') {
  wx.reLaunch({
    url: '/login/login/index'
  })
  return
}
// 判断是否存在刷新 token,如果存在则存储在本地
else if (refreshAccessToken && accessToken && accessToken !== 'invalid_token') {
  wx.setStorageSync(ACCESS_TOKEN_KEY, {
    Token: accessToken,
    RefreshToken: refreshAccessToken,
});
}
        let result = res.data;
        if (result.Data!= undefined && result.Data == 401) {
          // 刷新成功后重新发起请求
          wx.reLaunch({
            url: '/login/login/index'
          })
        } else {
          wx.showToast({
            title: result.Message,
            icon: 'error',
            duration: 1500
          })
          RefreshToken()
          return
            return;
        }
      }
      requestParam.success(res)
        if (result.Code && result.Code!= 0) {
            if (result.Code == -1&& result.Error === 'A099') {
              wx.reLaunch({
                url: '/login/login/index'
              })
                return;
            }
        }
        requestParam.success(res);
    },
    fail: err => {
      requestParam.fail(err)
        requestParam.fail(err);
    },
    complete: () => {
      requestParam.complete()
        requestParam.complete();
    }
  })
});
}
const RefreshToken = () => {
  // 获取账户信息
  let accountInfo = wx.getStorageSync("LoginUserInfo")
  // 获取登录的用户信息
  let data = {
    LoginName: accountInfo.phone,
    LoginPwd: accountInfo.password,
    Software: Constant.Software
  }
  // console.log(JSON.stringify(data),110)
  wx.request({
    url: Constant.BASE_AUTH_URL + "Auth/User/Login/LoginSoftwareStandardBySystemAccount@V1.0",
    method: 'POST',
    data: data,
    header: {
      'content-type': 'application/json'
    },
    fail: function (err) { //请求失败
      wx.showModal({
        content: '网络信号不好',
        showCancel: false,
        confirmColor: "#39b5de"
      });
    },
    success: function (res) {
      // console.log(res, "新的token信息")
      var result = res.data;
      // console.log(result);
      if (result.Code != 0) {
        wx.showToast({
          title: result.Message,
          icon: "none",
          duration: 2000
        })
        return;
      }
      var return_data = result.Data;
      if (return_data.Status != 0) {
        wx.showToast({
          title: result.Message,
          icon: "none",
          duration: 2000
        })
        return;
      }
      let Token = return_data.AccessToken
      let RefreshToken = return_data.RefreshToken
      let isNeedToken = false //是否需要Token 当Token失效的时候 判断是否跳转登录
      if (Token) {
        isNeedToken = true
      }
      let ExpreTime = new Date().getTime() //获取当前时间戳
      wx.setStorageSync('AccessToken', {
        Token: Token,
        RefreshToken: RefreshToken,
        ExpreTime: ExpreTime,
        isNeedToken: isNeedToken,
      })
    }
  })
}
const checkTokenExpired = (token, expiredOffset = 0) => {
   const jwt = decryptJWT(token);
   const date = getJWTDate(jwt.exp)
   const exp = date.getTime() + expiredOffset;
   const currentTime = new Date().getTime();
   const isExpired = currentTime > exp;
   return isExpired;
};
/**
 * 刷新令牌的函数
 * @returns {Promise} - 刷新令牌的异步操作的 Promise 对象
 */
//解密 JWT token 的信息
function decryptJWT(token) {