| | |
| | | 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 |