项目场景:
调用uni.chooseAddress() api获取收货人的信息
问题描述
在PC的微信开发者工具调试 uni.chooseAddress() 接口没发现报错,操作流程正常
但是真机调试 uni.chooseAddress() 接口调用失败,err 报错,这里需要注意的是这个“张三”的信息是微信提供的默认地址
errMsg: "chooseAddress:fail the api need to be declared in …e requiredPrivateInfos field in app.json/ext.json"}errMsg: "chooseAddress:fail the api need to be declared in the requiredPrivateInfos field in app.json/ext.json"__proto__: Object
// 选择收货地址
async chooseAddress() {
// 调用小程序提供的 chooseAddress() 方法,即可使用选择收货地址的功能
// 返回值是一个数组:第 1 项为错误对象;第 2 项为成功之后的收货地址对象
const [err, succ] = await uni.chooseAddress().catch(err => err)
if(err !==null){
uni.$showMsg('接口调用失败')
}
// 用户成功的选择了收货地址
if (err === null && succ.errMsg === 'chooseAddress:ok') {
// 为 data 里面的收货地址对象赋值
// this.address = succ
// 调用 Store 中提供的 updateAddress 方法,将 address 保存到 Store 里面
this.updateAddress(succ)
}
// 用户没有授权 -- 如果在选择收货地址的时候,用户点击了取消授权,则需要进行特殊的处理,否则用户将无法再次选择收货地址!
if (err && (err.errMsg === 'chooseAddress:fail auth deny' || err.errMsg ===
'chooseAddress:fail authorize no response')) {
this.reAuth()
}
},
原因分析:
wx.chooseAddress(Object object)
功能描述
获取用户收货地址。调起用户编辑收货地址原生界面,并在编辑完成后返回用户选择的地址。
使用方法
自 2022 年 7 月 14 日后发布的小程序,若使用该接口,需要在 app.json 中进行声明,否则将无法正常使用该接口,2022年7月14日前发布的小程序不受影响。具体规则见公告
申请开通
暂只针对具备与地理位置强相关的使用场景的小程序开放,在小程序管理后台,「开发」-「开发管理」-「接口设置」中自助开通该接口权限。 接口权限申请入口将于2022年3月11日开始内测,于3月31日全量上线。并从4月18日开始,在代码审核环节将检测该接口是否已完成开通,如未开通,将在代码提审环节进行拦截。
解决方案:
1.在小程序管理后台,「开发」-「开发管理」-「接口设置」中自助开通wx.chooseAddress(Object object)接口权限
2.如果是使用原生的微信小程序写的则需要在 app.json 中进行声明
我是用uniapp写的,所以打开 manifest.json 文件
在 mp-weixin 里面添加
最后保存编译运行就可以了
收货地址功能核心代码:
// 选择收货地址
async chooseAddress() {
// 调用小程序提供的 chooseAddress() 方法,即可使用选择收货地址的功能
// 返回值是一个数组:第 1 项为错误对象;第 2 项为成功之后的收货地址对象
const [err, succ] = await uni.chooseAddress().catch(err => err)
// const [err, succ] = await wx.chooseAddress().catch(err => err)
if(err !==null){
uni.$showMsg('接口调用失败')
}
// 用户成功的选择了收货地址
if (err === null && succ.errMsg === 'chooseAddress:ok') {
// 为 data 里面的收货地址对象赋值
// this.address = succ
// 调用 Store 中提供的 updateAddress 方法,将 address 保存到 Store 里面
this.updateAddress(succ)
}
// 用户没有授权 -- 如果在选择收货地址的时候,用户点击了取消授权,则需要进行特殊的处理,否则用户将无法再次选择收货地址!
if (err && (err.errMsg === 'chooseAddress:fail auth deny' || err.errMsg ===
'chooseAddress:fail authorize no response')) {
this.reAuth()
}
},
// 调用此方法,重新发起收货地址的授权
async reAuth() {
// 3.1 提示用户对地址进行授权
const [err2, confirmResult] = await uni.showModal({
content: '检测到您没打开地址权限,是否去设置打开?',
confirmText: "确认",
cancelText: "取消",
})
// 3.2 如果弹框异常,则直接退出
if (err2) return
// 3.3 如果用户点击了 “取消” 按钮,则提示用户 “您取消了地址授权!”
if (confirmResult.cancel) return uni.$showMsg('您取消了地址授权!')
// 3.4 如果用户点击了 “确认” 按钮,则调用 uni.openSetting() 方法进入授权页面,让用户重新进行授权
if (confirmResult.confirm) return uni.openSetting({
// 3.4.1 授权结束,需要对授权的结果做进一步判断
success: (settingResult) => {
// 3.4.2 地址授权的值等于 true,提示用户 “授权成功”
if (settingResult.authSetting['scope.address']) return uni.$showMsg('授权成功!请选择地址')
// 3.4.3 地址授权的值等于 false,提示用户 “您取消了地址授权”
if (!settingResult.authSetting['scope.address']) return uni.$showMsg('您取消了地址授权!')
}
})
},