微信小程序token前端无感刷新

import axios from "axios";
import { appletLogin,pswLogin,sysLoginWx } from '../api/userInfo.js'

import { UniAdapter } from "uniapp-axios-adapter";

let wxToken='';
let type = uni.getStorageSync("loginType");//获取上次登录方式


const service = axios.create({
	
  baseURL: 'http://192.168.11.140:9092/dx-procure',//后端ip
  
  timeout: 35000,
  adapter: UniAdapter,//指定适配器
});

service.interceptors.request.use(
	  (config) => {
	  return config;
  
	// application/json: 表示请求或响应的主体是 JSON 格式的数据。
	// application/x-www-form-urlencoded: 通常用于 HTML 表单提交,数据被编码为键值对形式。
	// multipart/form-data: 用于发送表单数据,支持传输二进制数据和大文件。
	// text/plain: 纯文本格式。
	// application/xml 或 text/xml: XML 数据格式。
	// application/pdf: PDF 文件。
	// image/jpeg、image/png、image/svg+xml 等: 图像文件格式。
	// audio/mpeg、audio/wav、audio/ogg 等: 音频文件格式。
	// video/mp4、video/webm、video/quicktime 等: 视频文件格式
	
  },
  (error) => {
    return Promise.reject(error);
  }
);

service.interceptors.response.use(
  async (response) => {
    switch (response.data.status) {
        case 206:
            break;
        case 401:
            break;
        case 403:
            break;
        case 500:
            break;
        case 201://需要前端重新登录的状态码,以下是重点
            if (type) {//若上次登录过
                if (response.config.data) {
					let requestData = JSON.parse(response.config.data); // 将字符串数据转换为对象
					requestData.wxToken = await appLogin(); // 在对象中更新 wxToken

//重新设置好最新的token之后重新运行任务队列

					response.config.data = JSON.stringify(requestData);
                    return axios(response.config).then((res) => {
                        return res.data; // 返回后端的响应数据
                    });
                }
            } else {//从未登录过
                uni.showToast({
                    title: "请重新进入小程序",
                    icon: 'none',
                    duration: 1000
                });
                setTimeout(() => {
                    uni.redirectTo({
                        url: '/pages/userInfo/login'
                    });
                }, 1000);
            }
            break;
        default:
            return Promise.resolve(response.data);
    }
    if (response.data.status !== 201) return Promise.resolve(response.data);
  },
  (err) => {
      // 当状态码不是200时的错误处理
      return Promise.reject(err);
  }
);

//以下是获取token的方法后去重新登录的方法

async function appLogin() {
    let jsCode = await getAppCode();

    let data = {
        apiKey: 'admin',
        apiSecret: 'admin2024@123',
        params: {
            jsCode
        }
    }

    return new Promise((resolve, reject) => {
        appletLogin(data).then((res) => {
            if (res.status === 200) {
                wxToken = res.data.wxToken;
                if (type === 'wx') wxLogin();
                else accountLogin();
                resolve(wxToken);
            }
        });
    });
}

function getAppCode() {
    return new Promise((resolve, reject) => {
        uni.login({
            provider: 'weixin',
            success(res) {
                resolve(res.code);
            },
            fail(err) {}
        });
    });
}

function wxLogin() {
    let data = {
        apiKey: 'admin',
        apiSecret: 'admin2024@123',
        wxToken
    };

    sysLoginWx(data).then((res) => {
        if (res.status === 200) {
            uni.setStorageSync('sysToken', res.data.sysToken);
            uni.setStorageSync('wxToken', wxToken);
        }
    });
}

function accountLogin() {
    let data = {
        apiKey: 'admin',
        apiSecret: 'admin2024@123',
        wxToken,
        params: {
            accountPsw: uni.getStorageSync('accountPsw'),
            accountId: uni.getStorageSync('accountId')
        }
    };

    pswLogin(data).then((res) => {
        if (res.status === 200) {
            uni.setStorageSync('wxToken', wxToken);
            uni.setStorageSync('sysToken', res.data.personId);
        }
    });
}


export default service;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值