写在前面
- 小程序官方在2021年4月28日后修改了
wx.getUserInfo
函数,所以导致目前网上大部分的文章已经不适用于解决目前小程序授权和获取userInfo的问题,此问题也是困扰了我一整天,算是初步解决,但解决方式比较粗糙,日后知识完善了会进一步修改。
新的函数
- 我的授权是采用
wx.getUserProfile()
函数,此函数只能在用户操作时调用(重点),因此配合以按钮进行,下面是我采取的一种做法。
1 2 3 4 5 6 7 8 9 10 11 12
| <view wx:if="{{isShow}}"> <view wx:if="{{!hasUserInfo}}"> <view class='headView'> <view class='headImageView'> <image class='headImage' src='cloud://cloud-hwh.636c-cloud-hwh-1302901969/头像.png'></image> </view> <view class='titleText'>申请获取以下权限</view> <view class='contentText'>获得你的公开信息(昵称,头像,手机等)</view> <button wx:if="{{canIUseGetUserProfile}}" bindtap="getUserProfile"> 允许授权 </button> </view> </view> </view>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| getUserProfile(e) { wx.getUserProfile({ desc: '完善个人资料', success: (res) => { console.log(res.userInfo) this.setData({ userInfo: res.userInfo, hasUserInfo: true, isShow: false }) wx.setStorage({ key: "userInfo", data: res.userInfo }) app.getStorageUserInfo().then(function () { console.log(app.globalData.userInfo) if (app.globalData.userInfo) { that.setData({ userInfo: app.globalData.userInfo, hasUserInfo: true }) } else { console.log(wx.getUserProfile) if (wx.getUserProfile) { that.setData({ isShow: true, canIUseGetUserProfile: true }) } } }) } }) },
|
解决重复授权
- 为了让已授权的用户在使用时无需重复授权,在app.js中使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| getStorageUserInfo: function () { var that = this; return new Promise(function (resolve, reject) { wx.getSetting({ success(res) { if (res.authSetting['scope.userInfo']) { console.log('授权过信息'); let userInfo = wx.getStorageSync('userInfo'); console.log(userInfo) if (userInfo != "") { that.globalData.userInfo = userInfo } console.log(that.globalData.userInfo) } else { console.log('没有授权') } resolve("调用成功") } }) })
}, globalData: { userInfo: null }
|
无法使用wx.getUserInfo
或者wx.getUserProfile
获取userInfo
微信小程序中怎么存setStorage
- 酷爱。 - 博客园
执行顺序问题
小程序
ES6 Promise用法讲解_u012693479的博客-CSDN博客_小程序promise详解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| let that = this; app.getStorageUserInfo().then(function () { console.log(app.globalData.userInfo) if (app.globalData.userInfo) { that.setData({ userInfo: app.globalData.userInfo, hasUserInfo: true }) } else { console.log(wx.getUserProfile) if (wx.getUserProfile) { that.setData({ isShow: true, canIUseGetUserProfile: true }) } } })
|
app
是在全局添加var app = getApp()
而来的,这样使得在其他界面可以使用app.js中的全局变量和函数,即globalData
和getStorageUserInfo()
,使用方法可以参考这篇文章
微信小程序
如何使用globalData - 姜腾腾 - 博客园
- 对于上面的问题还有两种办法可以解决,可以参考下面的文章
小程序Page里的函数比app.js先执行的解决办法
- shipskunkun - 博客园