微信小程序用戶登錄顯示"微信用戶"的問題——解決分析


問題產生原因:是由微信官方對接口進行升級引起的。

在之前我們在小程序獲取用戶信息是如下方式:

<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接口 ,觸發的方式要改為事件:

<van-button  
        bind:click="getUserProfile"
        plain
        round
        block
        size="{{ fullPage?'large':'small' }}"
        type="primary"
      >
        點擊這里登錄
      </van-button>

 

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)
      })
      
    }
上面的代碼在一次請求中以promise方式調了兩個微信口 wx.getUserProfile 和 wx.login ,
但這在小程序中是不允許的,所以需要以Promise.all的方式去調用 ,Promise.all可以接受一個promise數組作為參數,
當所有的子Promise都完成,該Promise完成,返回值是全部值的數組。如果有任何一個失敗,該Promise失敗。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM