yangyin
2024-11-21 f9ac580238527a3e9f5a13b2c7ea49d02a7a1a83
utils/api.js
@@ -1,152 +1,127 @@
import weappJwt from './weapp-jwt.js';
const utils = require('../utils/util.js')
let Constant = require('../utils/constant.js')
let app = getApp()
let API = (params)=>{
    // console.log(params,2)
    let tokenInfo = wx.getStorageSync('AccessToken')
    //  console.log(tokenInfo,3)
    let currentDateTime = new Date().getTime()
    if(tokenInfo == undefined || tokenInfo == null){
      wx.reLaunch({
        url: '/login/login/index',
      })
      return
    }
    //设置登录时间为七天 判断token是否失效
    if(currentDateTime - tokenInfo.ExpreTime > 7 * 60 * 60 * 24 * 1000 && tokenInfo.isNeedToken){
      console.log("缓存时间超过七天-----Token失效")
      wx.reLaunch({
        url: '/login/login/index',
      })
      return
    }
    let defaultParams = {
      url: '',
      method:"GET",
      data:"",
      header:{'content-type': 'application/json'},
      success:function(){},
      fail:function(){},
      complete:function(){}
    }
    let requestParam = Object.assign(defaultParams, params)
    if(tokenInfo.isNeedToken == true){
      requestParam.header.Authorization = 'Bearer ' + tokenInfo.Token
      // console.log(tokenInfo.Token,37)
      // requestParam.header.Authorization = 'Bearer ' + token
    }
    // console.log(requestParam,26)
    // console.log(requestParam.header,29)
    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(params,API)
          return
        }
        requestParam.success(res)
      },
      fail:err=>{
        requestParam.fail(err)
      },
      complete:()=>{
        requestParam.complete()
      }
    })
}
const RefreshToken = (params,apiCb)=>{
  let that = this;
  if(wx.getStorageSync("AccountInfo") == null || wx.getStorageSync("AccountInfo") == undefined || wx.getStorageSync("AccountInfo") ==""){
    wx.reLaunch({
      url: '/login/login/index',
    })
    return
  }
  // 获取账户信息
  let accountInfo = JSON.parse(wx.getStorageSync("AccountInfo"))
  // console.log(accountInfo,60)
  // 获取登录的用户信息
  let userInfo = wx.getStorageSync("LoginUserInfo");
  let sysInfo = app.globalData.sysInfo;
  // console.log('打印userInfo', userInfo)
  let data={
    SoftType:Constant.SoftType,
    SoftTag:Constant.SoftTag,
    LoginName: accountInfo.LoginName,
    LoginPwd: accountInfo.LoginPwd,
    CorpID: Constant.CorpID,
    WxCode: accountInfo.WxCode,
    UJsCode: accountInfo.UJsCode, //是否就是jsCode有待确认
    UAvatarUrl: userInfo == null ? "" : userInfo.avatarUrl,
    UCity: userInfo == null ? "" : userInfo.city,
    UProvince: userInfo == null ? "" : userInfo.province,
    UNickName: userInfo == null ? "" : userInfo.nickName,
    UGender: userInfo == null ? "" : userInfo.gender + "",
    SBrand: sysInfo.brand,
    SModel: sysInfo.model,
    SPlatform: sysInfo.platform,
    SVersion: sysInfo.version
  }
  // console.log(JSON.stringify(data),110)
  wx.request({
    url: Constant.BASE_SERVER_URL + "User/UserLogin/FromCorpWechatApplet@V1.0",
    method: 'POST',
    data: data,
let ACCESS_TOKEN_KEY = 'AccessToken'
const expiredDateOffset = -1000 * 60 * 5;
let API = (params) => {
  let defaultParams = {
    url: '',
    method: "GET",
    data: "",
    header: {
      'content-type': 'application/json'
        '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: 'token获取失败,请重新登录',
          icon:"none",
          duration:2000
        })
        return;
      }
      var return_data = result.Data;
      if (return_data.Status != 0) {
        wx.showToast({
          title: 'token获取失败,请重新登录',
          icon:"none",
          duration:2000
        })
        return;
      }
      let Token = return_data.Token
      let isNeedToken = false //是否需要Token 当Token失效的时候 判断是否跳转登录
      if(Token){
        isNeedToken = true
      }
      let ExpreTime = new Date().getTime() //获取当前时间戳
      wx.setStorageSync('AccessToken', {
        Token:Token,
        ExpreTime:ExpreTime,
        isNeedToken:isNeedToken
    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',
      })
      wx.setStorageSync( "AccountInfo",JSON.stringify(data))
      // 获取新的token后重新调用接口
       apiCb(params)
      return
      } else {
        requestParam.header.Authorization = `Bearer ${refreshAccessToken}`;
      }
    }
  });
  }
}
wx.request({
    url: requestParam.url,
    method: requestParam.method,
    data: requestParam.data,
    header: requestParam.header,
    success: res => {
// 只能叫 access-token,不能跟 accessTokenKey 一样
const accessToken = res.header['access-token'];
// 只能叫 x-access-token',不能跟 refreshAccessTokenKey 一样
const refreshAccessToken = res.header['x-access-token'];
// 判断是否是无效 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'
          })
            return;
        }
        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);
    },
    complete: () => {
        requestParam.complete();
    }
});
}
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) {
  let jwt_token = defaultClone(token)
  return weappJwt(jwt_token)
}
function defaultClone (value){
  return JSON.parse(JSON.stringify(value))
}
//将 JWT 时间戳转换成 Date
function getJWTDate(timestamp) {
  return new Date(timestamp * 1000);
}
export default API