微信小程序授權登錄以(yǐ)及用戶信息相關接口調整導緻授權框不(bù)彈出(chū) ... - 新聞資訊 - 雲南小程序開發|雲南軟件開發|雲南網站建設-昆明融晨信息技術有限公司

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不(bù)管是(shì)網站,軟件還是(shì)小程序,都要(yào / yāo)直接或間接能爲(wéi / wèi)您産生價值,我們在(zài)追求其視覺表現的(de)同時(shí),更側重于(yú)功能的(de)便捷,營銷的(de)便利,運營的(de)高效,讓網站成爲(wéi / wèi)營銷工具,讓軟件能切實提升企業内部管理水平和(hé / huò)效率。優秀的(de)程序爲(wéi / wèi)後期升級提供便捷的(de)支持!

您當前位置>首頁 » 新聞資訊 » 小程序相關 >

微信小程序授權登錄以(yǐ)及用戶信息相關接口調整導緻授權框不(bù)彈出(chū) ...

發表時(shí)間:2021-4-22

發布人(rén):融晨科技

浏覽次數:164


前言:4月8号升級了(le/liǎo)小程序業務後提交了(le/liǎo)版本并上(shàng)線。突然一個(gè)同事說(shuō)體驗版的(de)點擊“登錄”按鈕無效。當時(shí)覺得應該不(bù)會呀,這(zhè)幾天一直用手機調試,每天也(yě)在(zài)不(bù)停的(de)登錄授權,彈框一直有的(de)呀。然後爲(wéi / wèi)了(le/liǎo)驗證同事的(de)效果,速将PC版的(de)緩存全部清除,然後一臉懵逼,果然怎麽點“登錄”都無效果,然後繼續用手機測試,也(yě)無效果了(le/liǎo)。然後在(zài)微信裏看正式版的(de)小程序,發現暫無異常。幾個(gè)同事都第一反應:肯定是(shì)微信官方又改了(le/liǎo)啥。要(yào / yāo)不(bù)然代碼一直沒動,咋突然這(zhè)樣呢。果然,唉。

官方已發部了(le/liǎo)調整說(shuō)明文檔,大(dà)家可以(yǐ)參考 微信官方說(shuō)明文檔

沒辦法,人(rén)家是(shì)騰訊,我們隻能一個(gè)字:改!

在(zài)沒看官方文檔之(zhī)前,自己在(zài)尋找授權不(bù)彈框原因,在(zài)調試的(de)過程中,發現wx.getSetting()返回值有變,代碼如下:

 1  wx.getSetting({
 2       success: function (res) {
 3         if (res.authSetting['scope.userInfo']) {
 4           // 已經授權,可以(yǐ)直接調用 getUserInfo 獲取頭像昵稱
 5           wx.getUserInfo({
 6             success: function (res) {}
 7           })
 8         }
 9       }
10     })

發現wx.getSetting的(de)success返回結果如下,發現返回值中無“res.authSetting['scope.userInfo']”,網上(shàng)查了(le/liǎo),2018年有說(shuō)廢棄了(le/liǎo),但又說(shuō)又能用,很懵。既然這(zhè)樣,那我先跳過這(zhè)一步,直接彈出(chū)授權,獲取用戶信息吧。

獲取用戶信息接口返回值如下:用戶頭像昵稱都是(shì)默認頭像和(hé / huò)默認昵稱

然後根據官方的(de)說(shuō)明文檔,簡單的(de)以(yǐ)demo形式展示一下

方法一:直接用最新獲取用戶接口,就(jiù)可以(yǐ)彈出(chū)授權,但開發者工具要(yào / yāo)升級,官方說(shuō) 1.052103022版本(若不(bù)是(shì),可點此下載 )才支持,我的(de)版本是(shì)1.05.2102010也(yě)是(shì)支持的(de)

注意一點:開發者工具的(de)調試基礎庫一定要(yào / yāo)選2.16.0,否則還是(shì)調試不(bù)了(le/liǎo),截圖如下:

整理的(de)簡單代碼如下:

<view class="userinfo">
    <block wx:if="{{!hasUserInfo}}">
      <button bindtap="getUserProfile"> 獲取頭像昵稱 </button>
    </block>
    <block wx:else>
      <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
      <text class="userinfo-nickname">{{userInfo.nickName}}</text>
    </block>
  </view>
Page({
  data: {
    userInfo: {},
    hasUserInfo: false,
    canIUseGetUserProfile: false,
  },
    getUserProfile(e) {
    // 推薦使用wx.getUserProfile獲取用戶信息,開發者每次通過該接口獲取用戶個(gè)人(rén)信息均需用戶确認
    // 開發者妥善保管用戶快速填寫的(de)頭像昵稱,避免重複彈窗
    wx.getUserProfile({
      //desc是(shì)必須要(yào / yāo)有的(de)
      desc: '用于(yú)完善會員資料', // 聲明獲取用戶個(gè)人(rén)信息後的(de)用途,後續會展示在(zài)彈窗中,請謹慎填寫
      success: (res) => {
        this.setData({
          userInfo: res.userInfo,
          hasUserInfo: true
        })
      }
    })
  },
 })

以(yǐ)上(shàng)要(yào / yāo)注意的(de)就(jiù)是(shì)wx.getUserProfile中的(de)desc是(shì)必須要(yào / yāo)有的(de)

2.如果Pc微信沒有升級不(bù)支持wx.getUserProfile,可以(yǐ)進行代碼兼容,這(zhè)樣在(zài)手機端調試或者體驗版中能看到(dào)效果的(de)。但是(shì)微信官方也(yě)明确說(shuō)了(le/liǎo):“預計自2021年4月13日起,getUserInfo将不(bù)再彈出(chū)彈窗,并直接返回匿名的(de)用戶個(gè)人(rén)信息”,官方也(yě)提供了(le/liǎo) 參考示例

不(bù)想去官方看的(de),直接看這(zhè)裏:

<view class="container">
  <view class="userinfo">
    <block wx:if="{{!hasUserInfo}}">
      <button wx:if="{{canIUseGetUserProfile}}" bindtap="getUserProfile"> 獲取頭像昵稱 </button>
      <button wx:else open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 獲取頭像昵稱 </button>
    </block>
    <block wx:else>
      <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
      <text class="userinfo-nickname">{{userInfo.nickName}}</text>
    </block>
  </view>
</view>
Page({
  data: {
    userInfo: {},
    hasUserInfo: false,
    canIUseGetUserProfile: false,
  },
  onLoad() {
    if (wx.getUserProfile) {
      this.setData({
        canIUseGetUserProfile: true
      })
    }
  },
  getUserProfile(e) {
    // 推薦使用wx.getUserProfile獲取用戶信息,開發者每次通過該接口獲取用戶個(gè)人(rén)信息均需用戶确認
    // 開發者妥善保管用戶快速填寫的(de)頭像昵稱,避免重複彈窗
    wx.getUserProfile({
      desc: '用于(yú)完善會員資料', // 聲明獲取用戶個(gè)人(rén)信息後的(de)用途,後續會展示在(zài)彈窗中,請謹慎填寫
      success: (res) => {
        this.setData({
          userInfo: res.userInfo,
          hasUserInfo: true
        })
      }
    })
  },
  getUserInfo(e) {
    // 不(bù)推薦使用getUserInfo獲取用戶信息,預計自2021年4月13日起,getUserInfo将不(bù)再彈出(chū)彈窗,并直接返回匿名的(de)用戶個(gè)人(rén)信息
    this.setData({
      userInfo: e.detail.userInfo,
      hasUserInfo: true
    })
  },
})

3.以(yǐ)上(shàng)簡單的(de)彈出(chū)用戶授權信息,但我們的(de)業務中一般就(jiù)不(bù)是(shì)這(zhè)樣的(de)簡單的(de)了(le/liǎo)。上(shàng)面的(de)方法登錄後,隻要(yào / yāo)頁面切換或者刷新,又要(yào / yāo)重新讓用戶授權,這(zhè)種體驗肯定是(shì)極不(bù)好的(de)。下面以(yǐ)我們的(de)業務需求整理一我們的(de)demo發下來(lái)。我們的(de)業務需求是(shì):新用戶進小程序後,點擊“登錄”即彈出(chū)授權用戶信息,然後直接記錄用戶的(de)相關信息,這(zhè)樣無論是(shì)切換頁面或者下次進來(lái)小程序,都不(bù)會讓用戶繼續登錄,而(ér)且根據不(bù)同的(de)用戶展示不(bù)同的(de)功能權限。簡單整理代碼如下:

我這(zhè)邊是(shì)pc微信版已升級,所以(yǐ)直接廢棄了(le/liǎo)getUserInfo接口了(le/liǎo),直接使用getUserProfile接口了(le/liǎo)

<view class="userinfo">
    <block wx:if="{{!hasUserInfo}}">
      <button bindtap="getUserProfile"> 獲取頭像昵稱 </button>
    </block>
    <block wx:else>
      <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
      <text class="userinfo-nickname">{{userInfo.nickName}}</text>
    </block>
  </view>
page({
    data:{ 
      userInfo: {}, 
      hasUserInfo: true
    },
    onLoad: function () {
      var openId = wx.getStorageSync('openId');//根據openid判斷用戶有沒有授權登錄過。如果登錄過,直接查用戶的(de)信息以(yǐ)及相關功能。如果未登錄過。将顯示“登錄”按鈕,讓用戶登錄。
      if(openId){ }//執行已登錄過後的(de)操作
      else { } //沒有登錄的(de)操作
    },
    bindGetUserInfo:function(event){
      wx.showLoading({
        title: '加載中',
      })
      var that = this;
      wx.getSetting({
        success: res => {  
          wx.getUserProfile({
            desc: '用于(yú)完善會員信息', // 聲明獲取用戶個(gè)人(rén)信息後的(de)用途,後續會展示在(zài)彈窗中,請謹慎填寫
            success: (result) => {            
              wx.login({
                success:function(loginRes) {
                  var code=loginRes.code; //登錄憑證,根據務需求,如果你的(de)業務中不(bù)需要(yào / yāo),可以(yǐ)不(bù)用調用wx.login()方法
                  if(code){
                    wx.request({
                      url: decodeUserInfo,//自己的(de)服務接口地(dì / de)址,用來(lái)解密數據
                      method: 'GET',
                      header: {'Accept': 'application/json', },
                      data: { encryptedData: result.encryptedData, iv: result.iv, code: code},
                      success: function (data) {
                        //4.解密成功後 獲取自己服務器返回的(de)結果
                        if (data.data.status == 1) {                                           
                          that.setData({
                            userInfo: data.data.userInfo, //自己的(de)接口返回的(de)用戶信息(昵稱、頭像等)
                            hasUserInfo: true
                          });                                                                      
                          var openId = userInfo.openId; //返回openid                   
                          wx.setStorageSync('openId', openId); //緩存openid以(yǐ)便下次進來(lái)用此調用存于(yú)自己服務器上(shàng)的(de)用戶信息
                          that.setData({ openId: openId});                                               
                        } else { } 
                        wx.hideLoading();
                      },
                      fail: function () {
                        console.log('解密失敗')
                        wx.hideLoading();
                      }
                    })
                  }else{
                    wx.showToast({
                      title: '獲取code失敗',
                    })
                  }
                }
              })
            }
          })
        }
      })
    },
})

以(yǐ)上(shàng)就(jiù)是(shì)這(zhè)次微信官方調整小程序登錄、用戶信息接口後,遇到(dào)的(de)問題以(yǐ)及處理方法,我所寫的(de)是(shì)我所理解的(de)。技術類的(de)文章寫的(de)很差,組織語言和(hé / huò)表達能力也(yě)不(bù)行,見諒!

相關案例查看更多