场景描述:
用户在使用过程中可能存在token过期的问题,这个时候需要前端在不影响用户感知的情况下去刷新token
具体代码实现如下
import {
config
} from './config.js'
import {
Base64
} from './base64.js'
import {
Token
} from '../models/token.js'
class HTTP {
request({url, data = {}, method = 'GET'}) {
return new Promise((resolve, reject) => {
this._request(url, resolve, reject, data, method);
}).catch((e) => {
wx.showToast({
title: '抱歉,出现了一个错误',
icon:'none',
duration:2000
})
});
}
// 2小时
// token1 1小时59分59秒 超过2小时
// 退出
// 自动 无感知帮助他重新刷新令牌
// 退出 短时间 二次重发机制
_request(url, resolve, reject, data = {}, method = 'GET', noRefetch = false) {
let openId = wx.getStorageSync('openid');
wx.request({
url: config.api_base_api + url,
method: method,
data: data,
header: {
'content-type': 'application/json',
'openId': openId,
'uuid': config.uuid,
Authorization: this._encode()
},
success: (res) => {
const code = res.statusCode.toString();
if (code.startsWith('2')) {
resolve(res.data)
} else {
if (code == '403') {
if (!noRefetch) {
this._refetch(
url,
resolve,
reject,
data,
method
)
}
} else {
reject();
// 处理报错
}
}
},
fail: (err) => {
reject();
// 处理报错
}
})
}
_encode() {
const token = wx.getStorageSync('token')
const base64 = new Base64()
const result = base64.encode(token + ':')
return 'Basic ' + result
}
_refetch(...param) {
var token = new Token();
token.getTokenFromServer((token) => {
this._request(...param, true);
});
}
}
export {
HTTP
}
token.js代码如下
import {
config
} from '../utils/config'
class Token {
constructor() {
this.tokenUrl = config.api_base_api + 'system/token/wxLogin'
}
getTokenFromServer(callBack) {
var that = this;
wx.login({
success: function(res) {
wx.request({
url: that.tokenUrl,
header: {
'content-type': 'application/json'
},
method: 'POST',
data: {
code: res.code
},
success: (result)=>{
wx.setStorageSync('token', result.data.token);
wx.setStorageSync('openId', result.data.openId);
callBack && callBack(result.data);
}
});
}
})
}
}
export {
Token
}