为了账号安全,请及时绑定邮箱和手机立即绑定

微信小程序授权登录需要按钮触发的解决方案

标签:
WebApp

近期,微信官方修改了 getUserInfo、authorize等 接口,无法直接弹出授权窗口,这让我们以前一开始就获取用户信息完成登录的功能全部失效,新规定是第一次获取用户信息只能通过 button 去触发,那么有什么解决方案呢?

我的思路是一进入小程序的时候,立马去调用登录接口(wx.login,之前的代码不用变)并在回调中去调用获取用户信息接口(wx.getUserInfo),这时候就需要特别注意了,需要会wx.getUserInfo的获取失败钩子进行判断,如果失败,那么直接跳转去登录页面(登录页面中可以实现按钮登录);如果成功,继续后续逻辑代码。


具体代码如下(app.js):

const Request = require("/utils/request");        //引入封装的http拦截器

App({

  onLaunch: function(options) {

    this.authorize(options.query); // 直接授权登录(options.query 参数与分享配置有关,后续文章介绍

  },

  authorize: function(share) {

    let self = this;

    share = share || {};

    wx.login({

      success: function(res) {

        wx.getUserInfo({

          success: function(resp) {

            Request.post("/api/xcxWxLogin", {

              code: res.code,

              encryptedData: resp.encryptedData,

              iv: resp.iv

            }).then(({

              data: response

            }) => {

              if (response.code !== 0) {

                wx.showToast({

                  title: response.msg,

                  icon: "none"

                });

              } else {

                //  保存sessionid ,每次请求都会在拦截器中自动添加到header中

                wx.setStorageSync("UserSessionId", response.data.sessionId);

                self.globalData.sessionid = response.data.sessionId;

                //todo 后续逻辑代码

              }

            });

          },

          fail: function(err) {

            //重点,如果获取失败直接跳转

            let timer = setInterval(() => {

              let pages = getCurrentPages();

              if (pages.length > 0) {

                clearInterval(timer);

                let currentPage = pages[pages.length - 1];

                if (currentPage.route === "pages/user/userbind/userbind") {

                  return true;

                }

                try {

                  wx.setStorageSync("SYS_PREVIOUSPAGE", currentPage);

                  setTimeout(() => {

                    wx.redirectTo({

                      url: "/pages/login/login"

                    });

                  }, 300);

                } catch (e) {

                  wx.redirectTo({

                    url: "/pages/login/login"

                  });

                }

              }

            }, 200);

          }

        });

      }

    });

  }

})

获取用户信息成功的回调具体得看业务,获取失败的回调主要是加定时器去判断页面是否加载完成,加载完成后再保存当前页面路径(用于登录成功后跳转),最后跳转到一个带有登录按钮的页面(不在app.js中完成登录,而是在login.js中完成登录,第二次打开就静默授权了)


webp

login页面,点击按钮完成登录

下面介绍登录页面的逻辑代码(login.js):

const Request = require("../../utils/request");

Page({

  /**

   * 页面的初始数据

   */

  data: {

    route: "/pages/home/home"

  },

  /**

   * 生命周期函数--监听页面加载

   */

  onLoad: function(options) {

    let self = this;

    wx.getStorage({

      key: "SYS_PREVIOUSPAGE",

      success: function(res) {

        if (res.errMsg === "getStorage:ok") {

          self.setData({

            route: "/" + res.data.route,

            share: res.data.options

          });

        }

        wx.removeStorage({

          key: "SYS_PREVIOUSPAGE"

        });

      }

    });

  },

  bindgetuserinfo: function(e) {

    if (e.detail.errMsg.indexOf("fail") > -1) {

      wx.showModal({

        title: '温馨提示',

        content: '您未同意授权,系统无法检测您的身份,请允许授权',

      });

    } else {

      getApp().authorize(this.data.share);

      setTimeout(() => {

        if (["/pages/home/home", "/pages/course/courselist/courselist", "/pages/course/publiclist/publiclist", "/pages/consult/consultlist/consultlist", "/pages/usercenter/usercenter"].indexOf(this.data.route) > -1) {

          wx.switchTab({

            url: this.data.route

          });

        } else {

          wx.redirectTo({

            url: this.data.route

          });

        }

      }, 800);

    }

  }

})

login思路:一进入该页面,从缓存中把上一个页面拿出来(读取后需要清除该缓存),然后把登录按钮设置成获取用户信息类型,如

webp

设置登录按钮

点击登录按钮后触发bindgetuserinfo回调,在回调中判断是否授权,没有点击确定授权就提示要授权,有授权就直接调用app.js(也叫底层代码)的授权方法(用来保存用户信息),最后重定向到上一个页面(是重定向不是返回,而且需要注意是不是导航页面

webp

登录回调



作者:Msgyvcici
链接:https://www.jianshu.com/p/ef8793aa4130


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
205
获赞与收藏
1007

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消