From f9ac580238527a3e9f5a13b2c7ea49d02a7a1a83 Mon Sep 17 00:00:00 2001
From: yangyin <1850366751@qq.com>
Date: 星期四, 21 十一月 2024 20:44:59 +0800
Subject: [PATCH] 提交代码

---
 utils/api.js |  263 +++++++++++++++++++++++----------------------------
 1 files changed, 119 insertions(+), 144 deletions(-)

diff --git a/utils/api.js b/utils/api.js
index 8104c23..1eb7fd1 100644
--- a/utils/api.js
+++ b/utils/api.js
@@ -1,152 +1,127 @@
+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 //鏄惁闇�瑕乀oken 褰揟oken澶辨晥鐨勬椂鍊� 鍒ゆ柇鏄惁璺宠浆鐧诲綍
-      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 瀵硅薄
+ */
+
+//瑙e瘑 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
\ No newline at end of file

--
Gitblit v1.9.3