微信小程序 无感刷新token并重新请求接口

3,952 阅读1分钟

1、wx.login刷新session_key、token的封装

requestUtil.js

//微信登录————code
function loginCode () {
  wx.showLoading();
  return new Promise((resolve, reject) => {
    wx.login({
      success: res1 => {
        // 发送 res.code 到后台换取 openId, sessionKey, unionId
        wx.request({
          url: "url",
          data: { code: res1.code },
          method: "GET",
          header: { 'Content-Type': 'application/json' },
          success: function (res) {
            switch (res.statusCode) {//(根据实际情况判断)
              case 200:
                wx.setStorageSync('access_token', res.data.result);//把token存储在本地
                resolve({ status: 200 });
                break;
              default:
                resolve({ status: res.statusCode });
            }
          },
          fail: function (err) {
            wx.showToast({ title: "系统繁忙!", icon: 'error' });
            reject();
          }
        })
      },
      fail: function (err) {
        wx.showToast({ title: "系统繁忙!", icon: 'error' });
        reject();
      }
    })
  });
}
module.exports = {
  loginCode: loginCode,
}

2、wx.request的封装

request.js

import { loginCode } from './requestUtil'

const app = getApp();
let requestArr = [], isRefreshing = false;//请求队列,是否正在刷新token

// 401 刷新token
function refreshToken (obj, method, content_type, resolve) {
  requestArr.push(() => { resolve(httpRequest(obj, method, content_type)) });//缓存请求到队列中
  if (!isRefreshing) {
    isRefreshing = true;
    loginCode().then(res => {
      switch (res.status) {//(根据实际情况判断)
        case 200:
          // 重新请求队列
          requestArr.map(MT => { MT(); });
          requestArr = [];//清空队列
          break;
        default:
          wx.showToast({ title: "系统繁忙!", icon: 'error' });
      }
    }).finally(() => {
      //解除正在刷新
      isRefreshing = false;
      wx.hideLoading();
    });
  }
}

function httpRequest (obj, method, content_type = 'application/json') {
  return new Promise((resolve, reject) => {
    let token = wx.getStorageSync('access_token');//获取本地的token
    wx.request({
      url: obj.url,
      data: obj.data,
      method: method,
      header: { 'content-Type': content_type, 'token': token, },
      success: (res) => {
        switch (res.statusCode) {//(根据实际情况判断)
          case 200:
            resolve(res.data);
            break;
          case 401://token过期,刷新token(根据实际情况判断)
            refreshToken(obj, method, content_type, resolve);
            break;
          default:
            wx.showToast({ title: "系统繁忙!", icon: 'error' });
            reject();
        }
      },
      fail: function (err) {
        wx.showToast({ title: "系统繁忙!", icon: 'error' });
        reject(err);
      }
    });
  })
}

function _get (obj) {
  return httpRequest(obj, 'GET', 'application/json');
}

function _post (obj) {
  return httpRequest(obj, 'POST', 'application/json');
}

function _put (obj) {
  return httpRequest(obj, 'PUT', 'application/json');
}

function _delete (obj) {
  return httpRequest(obj, 'DELETE', 'application/json');
}

module.exports = {
  getAction: _get,
  postAction: _post,
  putAction: _put,
  deleteAction: _delete,
}