绿满眶商城微信小程序-uniapp
xiangpei
6 天以前 6057475ee0c3e9db5732ebba069b5e6adea2741c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
import {
    refreshTokenFn
} from "@/api/login.js";
import api from "@/config/api.js";
import Request from "@/lib/request/index.js";
import Foundation from "@/utils/Foundation.js";
import {
    md5
} from "@/utils/md5.js";
import storage from "@/utils/storage.js";
 
import jwt from '@/js_sdk/t-jwt/jwt.js';
import uuid from "@/utils/uuid.modified.js";
import store from "../store";
 
 
let isNavigateTo = false
 
function cleanStorage() {
    uni.showToast({
        title: "你的登录状态已过期,请重新登录",
        icon: "none",
        duration: 1500,
    });
    if (uni.showLoading()) {
        uni.hideLoading();
    }
 
    storage.setHasLogin(false);
    storage.setAccessToken("");
    storage.setRefreshToken("");
    console.log("清空token");
    storage.setUuid("");
    storage.setUserInfo({});
 
 
    if (!isNavigateTo) {
        isNavigateTo = true
        // 防抖处理跳转
        // #ifdef MP-WEIXIN
        uni.navigateTo({
            url: "/pages/passport/wechatMPLogin",
        });
        // #endif
        // #ifndef MP-WEIXIN
        uni.navigateTo({
            url: "/pages/passport/login",
        });
        //  #endif
    }
}
 
let http = new Request();
 
 
/**
 * 创建uuid方法
 */
const createUuid = () => {
    if (!storage.getUuid()) {
        storage.setUuid(uuid.v1());
        console.log("uuid", storage.getUuid());
    }
}
 
 
http.setConfig((config) => {
    createUuid();
    /* 设置全局配置 */
    config.baseURL = api.buyer;
    config.header = {
        ...config.header,
        'Content-Type': 'application/json',
    };
    config.validateStatus = (statusCode) => {
        // 不论什么状态,统一在正确中处理
        return true;
    };
    return config;
});
 
http.interceptors.request.use(
    (config) => {
        /* 请求之前拦截器。可以使用async await 做异步操作 */
        let accessToken = storage.getAccessToken();
        if (accessToken) {
            /**
             * 使用JWT解析
             * 小于当前时间将当前token清除
             */
            const decodeJwt = jwt(accessToken);
            const timing = new Date().getTime() / 1000
            if (decodeJwt.exp <= timing) {
                accessToken = ""
                storage.setAccessToken('')
            }
            const nonce = Foundation.randomString(6);
            const timestamp = parseInt(new Date().getTime() / 1000);
            const sign = md5(nonce + timestamp + accessToken);
            const _params = {
                nonce,
                timestamp,
                sign,
            };
            let params = config.params || {};
            params = {
                ...params,
                ..._params
            };
 
            config.params = params;
            config.header.accessToken = accessToken;
 
 
        }
        createUuid();
        config.header = {
            ...config.header,
            uuid: storage.getUuid()
        };
        return config;
    },
    (config) => {
        return Promise.reject(config);
    }
);
 
 
// 是否正在刷新的标记
let isRefreshing = false;
//重试队列
let requests = [];
// 必须使用异步函数,注意
http.interceptors.response.use(
    async (response) => {
        isNavigateTo = false
        /* 请求之后拦截器。可以使用async await 做异步操作  */
        // token存在并且token过期
        // if (isRefreshing && response.statusCode === 403) {
        //   cleanStorage();
        //   isRefreshing = false;
        // }
        uni.showLoading() ? uni.hideLoading() : ''
        let token = storage.getAccessToken();
        if (
            (token && response.statusCode === 403) ||
            response.data.status === 403
        ) {
            if (!isRefreshing) {
                console.log('旧token', token)
                isRefreshing = true;
                storage.setAccessToken('')
                let oldRefreshToken = storage.getRefreshToken();
                //调用刷新token的接口
                return refreshTokenFn(oldRefreshToken)
                    .then((res) => {
                        let {
                            accessToken,
                            refreshToken
                        } = res.data.result;
                        storage.setAccessToken(accessToken);
                        storage.setRefreshToken(refreshToken);
 
                        response.header.accessToken = `${accessToken}`;
                        // token 刷新后将数组的方法重新执行
                        console.log('接口队列', requests, '新token', accessToken)
                        requests.forEach((cb) => cb(accessToken));
                        requests = []; // 重新请求完清空
                        return http.request(response.config);
                    })
                    .catch((err) => {
                        console.log('刷新token报错' + oldRefreshToken, err)
                        cleanStorage();
                        return Promise.reject(err);
                    })
                    .finally(() => {
                        isRefreshing = false;
                    });
            } else {
                // 返回未执行 resolve 的 Promise
                return new Promise((resolve) => {
                    // 用函数形式将 resolve 存入,等待刷新后再执行
                    requests.push((token) => {
                        response.header.accessToken = `${token}`;
                        resolve(http.request(response.config));
                    });
                });
            }
 
            // 如果当前返回没登录
        } else if (
            (!token && !storage.getRefreshToken() && response.statusCode === 403) ||
            response.data.code === 403
        ) {
            console.log('没有token 以及刷新token 内容', token, storage.getRefreshToken())
            cleanStorage();
 
            // 如果当前状态码为正常但是success为不正常时
        } else if (
            (response.statusCode == 200 && !response.data.success) ||
            response.statusCode == 400
        ) {
            if (response.data.message) {
                uni.showToast({
                    title: response.data.message,
                    icon: "none",
                    duration: 1500,
                    success: function () {
                        store.state.isShowToast = true;
                    },
                    fail: function () {
                        store.state.isShowToast = false;
                    },
                    complete: function () {
                        store.state.isShowToast = false;
                    }
                });
            }
        }
        return response;
    },
    (error) => {
        return error;
    }
);
 
export {
    http
};
 
export const Method = {
    GET: "GET",
    POST: "POST",
    PUT: "PUT",
    DELETE: "DELETE",
};