前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微信小程序开发-用户授权

微信小程序开发-用户授权

作者头像
code2roc
发布2023-07-19 14:31:49
5330
发布2023-07-19 14:31:49
举报

微信小程序用户的授权分为几种方式,一种是对不同scope的授权,比如userInfo,需要用户手动点击允许才能获取,另一种是通过wx.login静默方式获取code,在与后台服务器交互,访问微信的api来得到会话sessionkey,我这里是两者进行结合,用户授权信息可以获取到微信用户的基本信息,但是用户的openid是存放于userinfo的encryptedData加密数据对象中,还是需要进行后台请求sessionkey进行解密,所以后台请求交互直接通过微信api的code2Session进行一次Get请求获取到openid,下面来进行具体步骤的讲解

1.判断用户是否对个人信息授权,通过wx.getSetting函数调用,查看scope域中是否包含userinfo

代码语言:javascript
复制
 wx.getSetting({
          success(res) {
            if (res.authSetting['scope.userInfo']) {
            
            }
          }
        })

 如果用户没有授权,这时候我们就需要引导用户进行授权,但是微信小程序2018.4.1更新说明,不再提供可以直接弹出用户信息授权的窗口,必须要通过<button open-type="getUserInfo"/>按钮的方式,让用户进行交互操作,所以我们需要在用户未授权时,弹出一个全窗口的模态窗口,让用户进行点击,类似于一个欢迎使用的界面,点击开始使用按钮则弹出用户授权,只有授权后才能显示主页面,需要注意的是,在欢迎使用页面需要通过wx.hideTabBar({})函数将tabbar隐藏,防止用户可以操作其他界面

2.用户同意授权后,调用wx.login方法,获取登陆code,与后台交互,初始化管理平台用户到数据库与微信用户的openid进行绑定,然后回写到本地缓存数据中,这里我封装了一个方法大家可以参考一下

代码语言:javascript
复制
var network = require('network.js');
function initWXAccount(url,page){
  wx.getSetting({
    success(res) {
      if (res.authSetting['scope.userInfo']) {
        wx.getUserInfo({
          success(res) {
            const userInfo = res.userInfo
            wx.login({
              success(res) {
                if (res.code) {
                  userInfo["code"] = res.code;
                  //请求后端初始化后台系统的微信账号
                  network.postRequestLoading(url, userInfo, function success(res) {
                    if (res.isSuccess) {
                      var openid = res.result;
                      //存入本地缓存
                      wx.setStorage({
                        key: 'openid',
                        data: openid
                      })
                      console.log("初始化openid到lcoalstorage成功")
                      //写入全局变量
                      page.globalData.openid = openid
                      console.log("初始化openid到globalData成功")
                      wx.showTabBar({
                        
                      })
                    }
                  }, function fail(res) {
                    console.log(res)
                  })
                } else {
                  console.log('登录失败!' + res.errMsg)
                }
              }
            })
          }
        })
      }
    }
  })
}

module.exports = {
  initWXAccount: initWXAccount
}

这里需要注意以下,如果用户拒绝授权,我可已通过按钮绑定事件中的e.detail.rawData来判断,授权失败,则该对象为undefined

3.需要注意的是,本地缓存可能会被人为清除或者缓存存储量达到上限被自动清楚,所以我们需要在小程序启动时,进行判断,如果缓存不存在且用户已经授权,就需要与后台再次交互,获取到openid写入到本地

代码语言:javascript
复制
onLaunch: function() {
    //查找用户的本地openid
    var app = this;
    var wxuseriniturl = app.globalData.rooturl + "/wx//user/initAccount";
    wx.getStorage({
      key: 'openid',
      success(res) {
        //写入global
        var openid = res.data
        app.globalData.openid = openid;
        console.log("读取到本地openid:" + openid);
      },
      fail(res) {
        //未找到openid,有两种情况
        //1.用户未授权,不用管,用户授权后会自动初始化
        //2.用户授权额,但是微信本地缓存被清了,需要重新请求写入
        wx.getSetting({
          success(res) {
            if (res.authSetting['scope.userInfo']) {
              console.log("未读取到本地openid,用户已授权,进行重新初始化到本地");
              wxauth.initWXAccount(wxuseriniturl, app);
            }
          }
        })
      }
    })

  }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-12-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档