微信小程序,登录会话token检查 及失效处理

一. 客户端app.js代码

App({
  onShow: function () {},

  onLaunch: function () {
    this.loadToken();
    this.checkToken()
  },

  globalData: {
    token: null,
    host: 'https://www.test.com',
  },

  loadToken: function (e) {
    var token = wx.getStorageSync('token');
    if (token) {
      this.globalData.token = token
    } else {
      this.login();
    }
  },

  login: function (callback) { // 定义 login 函数
    // 尝试自动登录
    wx.login({
      success: function (res) {
        if (res.code) {
          // 获取用户信息
          wx.getUserInfo({
            success: function (userRes) {
              var encryptedData = userRes.encryptedData;
              //console.log("res.code=" + res.code + ",--------app.js(login),返回用户信息json------=" + JSON.stringify(userRes));
              var iv = userRes.iv;
              // 将code、encryptedData和iv发送到后台服务器进行验证和解密
              wx.request({
                url: getApp().globalData['host'] + '/login',
                method: 'POST',
                data: {
                  code: res.code,
                  encryptedData: encryptedData,
                  iv: iv
                },
                success: function (response) {
                  //console.log(response.statusCode); // 打印服务器响应的状态码
                  //console.log(response.data); // 打印服务器返回的响应数据
                  if (response.statusCode === 200) {
                    //console.log('自动登录成功' + JSON.stringify(response.data.userInfo));
                    // 将用户信息保存到全局App实例中
                    //console.log("token=" + response.data.token); // 打印服务器返回的响应数据
                    getApp().globalData.token = response.data.token;
                    getApp().globalData.userInfo = response.data.userInfo;
                    wx.setStorage({
                      key: 'token',
                      data: response.data.token,
                      success: function () {
                        console.log('--- 保存token到storage 成功');
                      }
                    });
                    // 进行其他初始化操作
                    // 调用其他初始化函数或跳转到其他页面等
                  } else {
                    console.error('自动登录失败');
                    // 处理自动登录失败的情况
                  }
                },
                fail: function (error) {
                  console.error('自动登录失败', error);
                }
              });
            },
            fail: function (userRes) {
              console.error('获取用户信息失败', userRes);
              // 处理获取用户信息失败的情况
            }
          });
        } else {
          console.error('获取用户登录态失败', res.errMsg);
          return; // 处理获取用户登录态失败的情况
        }
      },
      fail: function (error) {
        console.error('wx.login()调用失败', error);
        return; // 处理wx.login()调用失败的情况
      }
    });
  },

  checkToken: function () {
    var token = this.globalData.token;
    console.log('--------------------token=' + token);

    if (token) {
      // 发送请求验证 token
      return new Promise((resolve, reject) => {
        wx.request({
          url: this.globalData.host + '/checkToken',
          method: 'POST',
          data: {
            token: token
          },
          success: function (response) {
            if (response.statusCode === 200) {
              if (response.data.success) {
                console.log('Token 有效');
                return;
              } else {
                console.error('Token 无效ABC');
                return getApp().login() // Token 无效,调用 login 函数获取新的 token
              }
            }
          },
          fail: function (error) {
            console.error('Token 验证失败', error);
            return getApp().login() // Token 验证失败,调用 login 函数获取新的 token
          }
        });
        setTimeout(() => {
          console.log("异步函数执行完毕");
          resolve();
        }, 500);
      });
    } else {
      console.error('Token 不存在'); // 不存在,调用 login 函数获取的 token
      return new Promise((resolve, reject) => {
        this.login()
        setTimeout(() => {
          console.log("异步函数执行完毕");
          resolve();
        }, 500);
      });
    }
  },

});

二. 客户端调用代码

      console.log('---A- token=' + app.globalData.token);
      app.checkToken().then(() => {      // 使用Promise确保在异步函数执行完毕后执行下一个语句
        console.log("异步函数执行后继续");
        this.call_Func_Need_Valid_Token()  #继续执行需要合法token的函数
      });

三. 服务端代码思路

1)在初始客户端登录时,在服务端新生成一个token字符串和user_openId对应存入到数据库redis或者mysql,然后下发token。

2)客户端每次调用时,都要checkToken(),将小程序里传过来的token,在服务器里针对此token生成的微信user_openid,取出来,保存处理相关业务逻辑数据。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值