小程序中弹起的授权框用户点了拒绝授权如何处理

本文介绍在小程序中如何处理用户授权,特别是当用户拒绝授权后如何重新请求授权的方法。通过使用wx.getSetting和wx.openSetting,可以实现对已拒绝授权项的再次确认。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     小程序中一些信息需要用户确认授权后我们才能获取到,如位置,用户信息等等,有些授权框用户点击拒绝授权后一段时间内不会再弹出,但我们又必须需要获取相应信息,这种状况如何解决呢?

    在调起授权弹窗方法的失败回调函数里使用 wx.getSetting()=>在其成功回调里获取到授权的状态=>再调用wx.openSetting()方法会打开调起过的授权项 取消的授权可以再次选确认授权(不一定非要完全和这个不走一样,可以按自己需求进行删减或增加)

下面以获取用户当前地理位置为例,贴上代码及效果。

wx.getLocation({
      type: 'wgs84',
      success(res) {
        that.userlatitude = res.latitude;
        that.userlongitude = res.longitude;
        wx.request({
          url: Url,
          data: {
            lat: that.userlatitude,
            lon: that.userlongitude
          },
          header: {
            'content-type': 'application/json' // 默认值
          },
          success(res) {
            that.addressInfo = res.data.address_info;
            that.distance = res.data.distance;
            wx.setStorage({
              key: 'distance',
              data: that.distance
            });
            that.$apply();
            console.log(res);
          },
          fail() {
          }
        });
      },
      fail() {
        //客户拒绝授权时
        wx.getSetting({
          success(res) {
            var statu = res.authSetting;
            if (!statu['scope.userLocation']) {
              wx.showModal({
                title: '是否授权当前位置',
                content: '需要获取您的地理位置,请确认授权,否则配送服务将无法正常使用',
                success(tip) {
                  if (tip.confirm) {
                    wx.openSetting({
                      success(data) {
                        if (data.authSetting["scope.userLocation"] === true) {
                          wx.showToast({
                            title: '授权成功',
                            icon: 'success',
                            duration: 1000
                          })
                          //授权成功之后,再调用wx.getLocation获取地址信息
                          wx.getLocation({
                            type: 'wgs84',
                            success(res) {
                              that.userlatitude = res.latitude;
                              that.userlongitude = res.longitude;
                              wx.request({
                                url: Url,
                                data: {
                                  lat: that.userlatitude,
                                  lon: that.userlongitude
                                },
                                header: {
                                  'content-type': 'application/json' // 默认值
                                },
                                success(res) {
                                  that.addressInfo = res.data.address_info;
                                  that.distance = res.data.distance;
                                  wx.setStorage({
                                    key: 'distance',
                                    data: that.distance
                                  });
                                  that.$apply();
                                }
                              });
                            }
                          })
                        }
                      }
                    })
                  }
                }
              })
            }
          }
        });
      }
    });

效果如下:(这是我调获取用户位置授权 用户点了取消后的, 由于我前面还获取了用户信息,所以会有两项)

### 微信小程序用户手机号授权实现方法 在微信小程序中,通过 `open-type="getPhoneNumber"` 属性可以触发用户的手机号授权操作。以下是具体的实现方式以及需要注意的关键。 #### 前端部分 (UniApp/Vue3) 在 UniApp 中可以通过如下代码片段来实现按钮点击事件并获取用户手机号: ```html <view class="padding bg-white text-center" @click="getModels"> <button class="cu-btn bg-white lg solids" open-type="getPhoneNumber" @getphonenumber="getPhoneNumber" style="border:1px solid #000000;width: 320px;" > 获取相关通知 </button> </view> ``` 上述代码中的核心属性为 `open-type="getPhoneNumber"` 和绑定的回调函数 `@getphonenumber`。当用户点击此按钮时会弹出授权窗口提示用户同意或拒绝提供手机号[^3]。 #### 后端处理逻辑 (Java/Spring Boot) 从前端传递过来的数据需要经过解密才能获得真实的用户手机号。具体流程如下: 1. **接收加密数据** 当用户完成授权后,前端会向服务器发送一个包含加密数据的对象 `{ encryptedData, iv }`。 2. **解密过程** 使用微信官方提供的 API 进行解密。以下是一个 Java 示例代码展示如何解密这些数据: ```java import com.alibaba.fastjson.JSONObject; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public String decryptData(String sessionKey, String encryptedData, String iv) throws Exception { SecretKeySpec key = new SecretKeySpec(sessionKey.getBytes("UTF-8"), "AES"); IvParameterSpec ivParam = new IvParameterSpec(iv.getBytes("UTF-8")); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); cipher.init(Cipher.DECRYPT_MODE, key, ivParam); byte[] resultBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData)); String decryptedData = new String(resultBytes, "UTF-8"); JSONObject jsonObject = JSONObject.parseObject(decryptedData); return jsonObject.getString("phoneNumber"); // 返回手机号码 } ``` 这段代码实现了基于 AES 加密算法对传入的 `encryptedData` 数据进行解密,并最终提取到用户的手机号码[^1]。 #### 费用说明 值得注意的是,自2023年8月28日起,微信对于手机号快速验证组件引入了收费机制。每个小程序账户拥有1000次免费体验额度,超出之后每次成功调用将收取0.03元费用。因此,在实际项目开发过程中需合理规划测试次数以免造成不必要的经济负担[^2]。 --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值