• 微信小程序用户登录显示"微信用户"的问题——解决分析


    问题产生原因:是由微信官方对接口进行升级引起的。

    在之前我们在小程序获取用户信息是如下方式:

    <van-button  
            bind:getuserinfo="getUserInfo"
            open-type="getUserInfo"
            plain
            round
            block
            size="small"
            type="primary"
          >
            点击这里登录
     </van-button>

    注:bind:getuserinfo="getUserInfo" 中的getUserInfo是个响应事件,当然事件名可以随便取的,不一定非是 getUserInfo 这个名字

    open-type="getUserInfo" 则是微信小程序的一个开放能力,在按钮上设置此属性则会触发 getuserinfo 事件。
    下面则是事件的响应函数
    async getUserInfo(e) {
          // 微信授权
          let that = this
          let userInfo = e.detail.userInfo
          if (userInfo) {
            let login = () => {
              return new Promise(resolve => {
                wx.login({
                  success(res) {
                    resolve(res)
                  },
                  fail() {
                    resolve()
                  }
                })
              })
            }
            let getUserInfo = () => {
              return new Promise(resolve => {
                wx.getUserInfo({
                  success(res) {
                    resolve(res)
                  },
                  fail() {
                    resolve()
                  }
                })
              })
            }
            let res = await login()
            let res2 = await getUserInfo()
    
            showLoading('加载中')
            if (res && res.code && res2) {
              let { encryptedData, iv, rawData, signature } = res2
              await that.userLoginFunc(
                res.code,
                encryptedData,
                iv,
                rawData,
                signature
              )
              hideLoading()
            }
          }
        }

    根据官方文档

    调整后,开发者如需获取用户身份标识符只需要调用wx.login接口即可。
    开发者若需要在界面中展示用户的头像昵称信息,可以通过<open-data>组件进行渲染,该组件无需用户确认,可以在界面中直接展示。
    在部分场景(如社交类小程序)中,开发者需要在获取用户的头像昵称信息,可调用wx.getUserProfile接口,开发者每次通过该接口均需用户确认,请开发者妥善处理调用接口的时机,避免过度弹出弹窗骚扰用户。

    解决过程分析:

          主要就是变化一点,无需再用 open-type="getUserInfo" 了,wx.getUserInfo接口也不用了,改为调用 wx.getUserProfile接口 

    async getUserProfile(e){
          let that = this
          let getuserinfo = new Promise((resolve, reject) => {
             
                wx.getUserProfile({
                  desc: '用于完善会员资料',  
                  success(res) {
                    resolve(res)
                  },
                  fail() {
                    resolve()
                  }
                })
          })
    
          let login = new Promise((resolve, reject) => {
              wx.login( {
                  success(res) {
                    resolve(res)
                  },
                  fail() {
                    resolve()
                  }
                })
             }
          )
    
          
          //console.log("params=" + params )
          let flag = true
          Promise.all([login, getuserinfo]).then(res=>{
            console.log('所有操作完成---',res)
            let code = ""
            //let params = { encryptedData:'', iv:'', rawData:'', signature:'' }
            if(res[0] && res[0].code )
            {
              code = res[0].code 
            }else{
              falg = false
            }
            if(res[1]){
              console.log( "-----oooo----------")
              
              //console.log("signature:" + params.signature)
            }else{
              falg = false
            }
    
            showLoading('加载中')
            //console.log("")
            if (flag) {
              
             let { encryptedData, iv, rawData, signature } = res[1]
            
              //调用后端接口
              that.userLoginFunc(
                code,
                encryptedData,
                iv,
                rawData,
                signature
              )
              hideLoading()
            }
          }).catch((error) => {
            console.log(error)
          })
          
        }

    具体细节后续再分析

  • 相关阅读:
    AC自动机+全概率+记忆化DP UVA 11468 Substring
    java POI技术之导出数据优化(15万条数据1分多钟)
    验证IP端与数据库Ip端是否重复!!!
    JAVA中IP和整数相互转化(含有掩码的计算)
    Nginx搭建反向代理服务器过程详解
    session原理及实现共享
    Linux部署多个tomcat
    linux下怎么修改mysql的字符集编码
    linux yum 安装mysql
    VM虚拟机下的Linux不能上网
  • 原文地址:https://www.cnblogs.com/hzhuxin/p/14960570.html
Copyright © 2020-2023  润新知