记录 - 收货地址的坑

项目场景:

调用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('您取消了地址授权!')
          }
        })
      },
      

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狗蛋的博客之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值