import weappJwt from './weapp-jwt.js'; const utils = require('../utils/util.js') let Constant = require('../utils/constant.js') let app = getApp() 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 } 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' }, 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) { } 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("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, }) } }) } //解密 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