一、 wx.authorize(Object object)
提前向用戶發起授權請求。調用后會立刻彈窗詢問用戶是否同意授權小程序使用某項功能或獲取用戶的某些數據,但不會實際調用對應接口。如果用戶之前已經同意授權,則不會出現彈窗,直接返回成功。
- 用戶可以授權的
scope 包括:
scope | 對應接口 | 描述 |
---|---|---|
scope.userInfo | wx.getUserInfo | 用戶信息 |
scope.userLocation | wx.getLocation, wx.chooseLocation, wx.openLocation | 地理位置 |
scope.address | wx.chooseAddress | 通訊地址 |
scope.invoiceTitle | wx.chooseInvoiceTitle | 發票抬頭 |
scope.invoice | wx.chooseInvoice | 獲取發票 |
scope.werun | wx.getWeRunData | 微信運動步數 |
scope.record | wx.startRecord | 錄音功能 |
scope.writePhotosAlbum | wx.saveImageToPhotosAlbum, wx.saveVideoToPhotosAlbum | 保存到相冊 |
scope.camera |
|
攝像頭 |
注意:上述接口中,wx.authorize({scope: "scope.userInfo"}),無法彈出授權窗口,使用 button 組件,並將 open-type 指定為 getUserInfo 類型,獲取用戶基本信息。https://developers.weixin.qq.com/community/develop/doc/0000a26e1aca6012e896a517556c01
二、 wx.authorize 用法
- 首先, 可以通過 wx.getSetting 獲取當前用戶的設置,返回值中只會出現小程序已經向用戶請求過的權限。參考:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/setting/wx.getSetting.html
wx.getSetting({
success (res) {
console.log(res.authSetting)
}
})
如果用戶已經授權過 地理位置,上面代碼則會返回:"scope.userInfo": true
- 向用戶發起授權請求
// 可以通過 wx.getSetting 先查詢一下用戶是否授權了 "scope.record" 這個 scope
wx.getSetting({
success(res) {
if (!res.authSetting['scope.record']) {
wx.authorize({
scope: 'scope.record',
success () {
// 用戶已經同意小程序使用錄音功能,后續調用 wx.startRecord 接口不會彈窗詢問
wx.startRecord()
}
})
}
}
})
三、 注意
- 微信中使用 wx.getUserInfo 接口直接彈出授權框的開發方式將逐步不再支持。
- 所以在用戶未授權的情況下,在 onload 函數中使用 wx.getUserInfo 是默認失敗的, 如下:
onLoad: function (options) {
// 只有在用戶已經授權后,才能在 onload 函數中獲取到用戶信息
// 所以,下面通過 wx.getSetting 檢查用戶是否已經授權,
// 如果沒有授權,則停止執行
// 如果已經授權,則繼續執行success
wx.getSetting({
success (res){
if (res.authSetting['scope.userInfo']) {
// 已經授權,可以直接調用 getUserInfo 獲取頭像昵稱
wx.getUserInfo({
success: function(res) {
console.log(res.userInfo)
}
})
}
}
})
},
-
建議使用 button 組件,並將 open-type 指定為 getUserInfo 類型,通過點擊事件獲取用戶基本信息。
-
代碼如下:
wxml:
<button open-type="getUserInfo" bindgetuserinfo='getUser'>獲取用戶信息(授權登錄)</button>
js:
getUser(e) {
console.log(e)
wx.getUserInfo({
success: (res) => {
console.log(res)
this.setData({
userInfo: res.userInfo
});
}
})
}