微信小程式不支援wx.getUserInfo授權的解決方法
阿新 • • 發佈:2019-01-10
微信小程式最近被吐槽最多的一個更改,就是使用者使用wx.getUserInfo(開發和體驗版)時不會彈出授權,正式版不受影響。現在授權方式是需要引導使用者點選一個授權按鈕,然後再彈出授權。我最近圍繞這個做了一些研究,來看看我是如何做好這個授權。·
1.使用者進來一個頁面時,按照微信小程式的生命週期,開始解析onLoad裡面的內容。
所以我們在第一步,就把程式碼放在這裡,看看全域性變數是否已經有值,
2.如果之前沒有授權,則檢視使用者是否有請求一個授權登入的按鈕,
3.最後查閱這個函式的授權結果,是成功返回還是失敗。程式碼如下:
onLoad: function () { if (app.globalData.userInfo) { console.log(1) this.setData({ userInfo: app.globalData.userInfo, hasUserInfo: true }) } else if (this.data.canIUse){ console.log(2) // 由於 getUserInfo 是網路請求,可能會在 Page.onLoad 之後才返回 // 所以此處加入 callback 以防止這種情況 app.userInfoReadyCallback= res => { console.log(12) app.globalData.userInfo = res.userInfo this.setData({ userInfo: res.userInfo, hasUserInfo: true }) } } else { console.log(3) // 在沒有 open-type=getUserInfo 版本的相容處理 wx.getUserInfo({ success: res => { app.globalData.userInfo = res.userInfo this.setData({ userInfo: res.userInfo, hasUserInfo: true }) }, fail:res=>{ console.log(4); this.setData({ getUserInfoFail:true }) } }) } },
第二步:通常我們這裡會進入第二步,允許使用按鈕提示使用者授權。在onLoad週期裡面我們沒獲取到使用者是否有成功授權,我們下一週期onShow,在這裡,我們就可以查閱授權的狀態,如果進入了fail操作,說明還沒有授權,在失敗的時候,我們賦值告知授權失敗,我們頁面根據這個狀態值,來顯示需要使用者點選授權。程式碼如下:
login: function () { console.log(111) var that = this // if (typeof success == "function") { // console.log(6); // console.log('success'); // this.data.getUserInfoSuccess = success // } wx.login({ success: function (res) { var code = res.code; console.log(code); wx.getUserInfo({ success: function (res) { console.log(7); app.globalData.userInfo = res.userInfo that.setData({ getUserInfoFail: false, userInfo: res.userInfo, hasUserInfo: true }) //平臺登入 }, fail: function (res) { console.log(8); console.log(res); that.setData({ getUserInfoFail: true }) } }) } }) },
頁面xml中根據這個getUserInfoFail來顯示按鈕。
<button wx:if="{{!hasUserInfo && canIUse && getUserInfoFail}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 獲取頭像暱稱 </button>
當用戶點選授權後,彈出一個彈窗,提示他授權,這個時候呼叫的是getUserInfo這個函式,程式碼如下:
getUserInfo: function(e) { console.log(5); console.log(e) if(e.detail.userInfo){ app.globalData.userInfo = e.detail.userInfo this.setData({ userInfo: e.detail.userInfo, hasUserInfo: true }) }else{ this.openSetting(); } },
如果我們可以獲取到detail.userInfo的值,說明引數正確,使用者點選了允許授權。如果使用者點選拒絕,這個時候我們就要呼叫openSetting這個函式。這個函式主要是開啟授權的地方,有相容性問題,低版本不支援。
openSetting: function () { var that = this if (wx.openSetting) { wx.openSetting({ success: function (res) { console.log(9); //嘗試再次登入 that.login() } }) } else { console.log(10); wx.showModal({ title: '授權提示', content: '小程式需要您的微信授權才能使用哦~ 錯過授權頁面的處理方法:刪除小程式->重新搜尋進入->點選授權按鈕' }) } }
如果使用者進入了授權頁後,點選允許我們獲取使用者資訊,返回成功時,我們執行login這個函式,這時,我們就可以進入getuserInfo() 裡面拿到授權的資訊了。那麼頭像、使用者資訊和其它一些個人的資料都可以查到了。
完整的index.js如下:
//index.js //獲取應用例項 const app = getApp() Page({ data: { motto: 'Hello World', userInfo: {}, hasUserInfo: false, getUserInfoFail:false, canIUse: wx.canIUse('button.open-type.getUserInfo') }, //事件處理函式 bindViewTap: function() { wx.navigateTo({ url: '../logs/logs' }) }, onShow:function(){ this.login(); }, onLoad: function () { if (app.globalData.userInfo) { console.log(1) this.setData({ userInfo: app.globalData.userInfo, hasUserInfo: true }) } else if (this.data.canIUse){ console.log(2) // 由於 getUserInfo 是網路請求,可能會在 Page.onLoad 之後才返回 // 所以此處加入 callback 以防止這種情況 app.userInfoReadyCallback = res => { console.log(12) app.globalData.userInfo = res.userInfo this.setData({ userInfo: res.userInfo, hasUserInfo: true }) } } else { console.log(3) // 在沒有 open-type=getUserInfo 版本的相容處理 wx.getUserInfo({ success: res => { app.globalData.userInfo = res.userInfo this.setData({ userInfo: res.userInfo, hasUserInfo: true }) }, fail:res=>{ console.log(4); this.setData({ getUserInfoFail:true }) } }) } }, getUserInfo: function(e) { console.log(5); console.log(e) if(e.detail.userInfo){ app.globalData.userInfo = e.detail.userInfo this.setData({ userInfo: e.detail.userInfo, hasUserInfo: true }) }else{ this.openSetting(); } }, login: function () { console.log(111) var that = this // if (typeof success == "function") { // console.log(6); // console.log('success'); // this.data.getUserInfoSuccess = success // } wx.login({ success: function (res) { var code = res.code; console.log(code); wx.getUserInfo({ success: function (res) { console.log(7); app.globalData.userInfo = res.userInfo that.setData({ getUserInfoFail: false, userInfo: res.userInfo, hasUserInfo: true }) //平臺登入 }, fail: function (res) { console.log(8); console.log(res); that.setData({ getUserInfoFail: true }) } }) } }) }, //跳轉設定頁面授權 openSetting: function () { var that = this if (wx.openSetting) { wx.openSetting({ success: function (res) { console.log(9); //嘗試再次登入 that.login() } }) } else { console.log(10); wx.showModal({ title: '授權提示', content: '小程式需要您的微信授權才能使用哦~ 錯過授權頁面的處理方法:刪除小程式->重新搜尋進入->點選授權按鈕' }) } } })
index.xml如下:
<!--index.wxml--> <view class="container"> <view class="userinfo"> <button wx:if="{{!hasUserInfo && canIUse && getUserInfoFail}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 獲取頭像暱稱 </button> <block wx:if="{{hasUserInfo}}"> <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" background-size="cover"></image> <text class="userinfo-nickname">{{userInfo.nickName}}</text> </block> </view> <view class="usermotto"> <text class="user-motto">{{motto}}</text> </view> </view>至此,我們就完成了使用者的流程了。