Skip to content

怎么处理微信小程序里的静默授权异步问题?

Posted on:2024年9月3日 at 13:00

在微信小程序中,静默授权(wx.login)是异步的。假设我们系统是通过微信静默授权,拿到用户的 openid 作为唯一标志。

我们在页面 onLoad 里需要等授权完成,拿到openid才能继续后续接口调用。由于静默授权的异步性,我们怎么能保证,在全局能够知调用 wx.login 一次,而不会每个页面都去重复调用 wx.login


在微信小程序里,通常我们会在 app.js 里的 onLaunch 方法里,执行微信静默授权,即调用 wx.login 。但是,由于静默授权是异步的,我们不能保证,在页面的 onLoad 里,静默授权流程已经完成了。如果再次发起 wx.login,又会重复执行静默授权,增加页面渲染时间。

通常在这种情况下,我们都实现一个全局的授权方法,比如叫wxAuthSingleton(),内部维护一个唯一的静默授权 Promise 对象,当这个对象已经存在之后,直接返回这个 Promise,如果不存在,才生成一个 Promise。每个页面,都去调用这个全局授权方法wxAuthSingleton(),得到全局相同的授权 Promise

下面是简略代码:

const wxAuthSingleton = (function () {
  let promise = null;
  return async function wxAuthSingletonInner() {
    if (promise) {
      // 已经调用过了,可能正在执行中,或者已经执行结束
      return promise;
    }
    promise = new Promise((resolve, reject) => {
      try {
        wx.login({
          // 注意:这里只是伪代码,需要参考官方文档修改
          async success(res) {
            // 拿到code,调用后端接口
            // 这里加上异常处理
            await silentAuthLogin(res.code);
            resolve();
          },
          fail() {
            reject(new Error("静默授权失败"));
          },
        });
      } catch (err) {
        reject(err);
      }
    });
  };
})();
原文转自:https://fe.ecool.fun/topic/d4932c0d-8a08-4b1b-9e52-036572452c9f