如何防止获取用户信息是session_key过期?
发布于 4 年前 作者 fanxia 2384 次浏览 来自 官方Issues

我写了个公共的请求api获取授权的类,因为session_key是没有失效时间的,服务端的token时间是有访问一直在累加的,所以通过getUserProfile获取encryptedData的时候发现session_key 已经解不了这串数据了,这时候服务端返回401触发api类重新获取session_key 再次请求发现也解不了,感觉可能是getUserProfile获取数据时的session_key在重新wx.login的时候已经变化了

import { Token } from 'token.js';

import { Config } from 'config.js';


class Base {

  constructor() {

    "use strict";

    this.baseRestUrl = Config.apiHost;

  }


  //http 请求类, 当noRefech为true时,不做未授权重试机制

  request(params, noRefetch) {

    var _self = this,

      url = this.baseRestUrl + params.url;

    if (!params.type{

      params.type = 'GET';

    }

    /*不需要再次组装地址*/

    if (params.setUpUrl == false{

      url = params.url;

    }

    return wx.request({

      url: url,

      data: params.data,

      method: params.type,

      header: {

        'content-type': 'application/json',

        'token': wx.getStorageSync('token')

      },

      enableHttp2: true,

      success: function (res) {

        // 判断以2(2xx)开头的状态码为正确

        // 异常不要返回到回调中,就在request中处理,记录日志并showToast一个统一的错误即可

        var code = res.statusCode.toString();

        var startChar = code.charAt(0);

        if (startChar == '2'{

          params.sCallback && params.sCallback(res.data);

        } else {

          //console.log('code' + code);

          if (code == '401'{

            if (!noRefetch{

              _self._refetch(params);

            }

          }

          if (!noRefetch{

            _self._processError(res);

            params.eCallback && params.eCallback(res.data);

          }

        }

      },

      fail: function (err) {

        //wx.hideNavigationBarLoading();

        _self._processError(err);

        // params.eCallback && params.eCallback(err);

      }

    });

  }


  _processError(err) {

    console.log(err);

  }


  needGetUserInfo(callback, eCallback) {

    var param = {

      url: '/mp/auth/needGetUserInfo',

      type: 'POST',

      data: {},

      sCallback: function (data) {

        callback && callback(data);

      },

      eCallback: eCallback

    }

    this.request(param);

  }


  upUserInfo(pdata, callback, eCallback) {

    var param = {

      url: '/mp/auth/UserProfile',

      type: 'POST',

      data: pdata,

      sCallback: function (data) {

        callback && callback(data);

      },

      eCallback: eCallback

    }

    this.request(param);

  }

  _refetch(param) {

    var token = new Token();

    token.getTokenFromServer((token) => {

      this.request(param, true);

    });

  }


  /*获得元素上的绑定的值*/

  getDataSet(event, key) {

    return event.currentTarget.dataset[key];

  };


};


export { Base };


3 回复

每个用户保存最近的session_key试试吧,最近一个加当前看能否解决。

另外需要补充一下, wx.checkSession返回结果不一定准确,尤其是在session_key临近失效的时间段

使用接口 wx.checkSession可以校验 session_key 是否有效,从而避免小程序反复执行登录流程,具体请参考:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html

回到顶部