yangyin
2024-08-29 2c41dc4162446120feae6a09ecf1d07118850f88
utils/api.js
@@ -1,101 +1,121 @@
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") ==""){
let ACCESS_TOKEN_KEY = 'AccessToken'
let API = (params) => {
  let tokenInfo = wx.getStorageSync(ACCESS_TOKEN_KEY)
  let currentDateTime = new Date().getTime()
  if (!tokenInfo) {
    wx.reLaunch({
      url: '/login/login/index',
    })
    return
  }
  // 获取账户信息
  let accountInfo = JSON.parse(wx.getStorageSync("AccountInfo"))
  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是否都失效,都失效则跳转登录
  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'
    },
    success: function () {},
    fail: function () {},
    complete: function () {}
  }
  let requestParam = Object.assign(defaultParams, params)
  // 判断是否要添加token
  if (tokenInfo.isNeedToken == true) {
    requestParam.header.Authorization = 'Bearer ' + tokenInfo.Token
  }
  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) {
  // console.log(accountInfo,60)
              }
              if (res.confirm) {
              }
            }
          })
        } else {
          wx.showToast({
            title: result.Message,
            icon: 'error',
            duration: 1500
          })
          RefreshToken()
          return
        }
      }
      requestParam.success(res)
    },
    fail: err => {
      requestParam.fail(err)
    },
    complete: () => {
      requestParam.complete()
    }
  })
}
const RefreshToken = () => {
  // 获取账户信息
  let accountInfo = wx.getStorageSync("AccountInfo")
  // 获取登录的用户信息
  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
  let data = {
    LoginName: accountInfo.phone,
    LoginPwd: accountInfo.password,
    Software: Constant.Software
  }
  // console.log(JSON.stringify(data),110)
  wx.request({
    url: Constant.BASE_SERVER_URL + "User/UserLogin/FromCorpWechatApplet@V1.0",
    url: Constant.BASE_AUTH_URL + "Auth/User/Login/LoginSoftwareStandardBySystemAccount@V1.0",
    method: 'POST',
    data: data,
    header: {
@@ -109,44 +129,52 @@
      });
    },
    success: function (res) {
      console.log(res,"新的token信息")
      // console.log(res, "新的token信息")
      var result = res.data;
      // console.log(result);
      if (result.Code != 0) {
        wx.showToast({
          title: 'token获取失败,请重新登录',
          icon:"none",
          duration:2000
          icon: "none",
          duration: 2000
        })
        return;
      }
      var return_data = result.Data;
      if (return_data.Status != 0) {
        wx.showToast({
          title: 'token获取失败,请重新登录',
          icon:"none",
          duration:2000
          icon: "none",
          duration: 2000
        })
        return;
      }
      let Token = return_data.Token
      let Token = return_data.AccessToken
      let RefreshToken = return_data.RefreshToken
      let isNeedToken = false //是否需要Token 当Token失效的时候 判断是否跳转登录
      if(Token){
      if (Token) {
        isNeedToken = true
      }
      let ExpreTime = new Date().getTime() //获取当前时间戳
      wx.setStorageSync('AccessToken', {
        Token:Token,
        ExpreTime:ExpreTime,
        isNeedToken:isNeedToken
      })
      wx.setStorageSync( "AccountInfo",JSON.stringify(data))
      // 获取新的token后重新调用接口
       apiCb(params)
        Token: Token,
        RefreshToken: RefreshToken,
        ExpreTime: ExpreTime,
        isNeedToken: isNeedToken,
      })
    }
  });
  })
}
//解密 JWT token 的信息
function decryptJWT(token) {
  token = weappJwt(token)
  return token
}
//将 JWT 时间戳转换成 Date
function getJWTDate(timestamp) {
  return new Date(timestamp * 1000);
}
export default API