微信小程序-获取用户手机号

uniapp 提供了获取手机号的 button 组件:

<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">获取手机号</button>

uniapp 提供了新旧两种版本的接口:

接口类型前端返回参数后端解密方式适用场景
旧版接口encryptedDataiv使用 session_key 解密兼容低版本微信客户端
新版接口动态 code直接调用微信接口换取手机号仅需支持微信 7.0.0+ 版本

动态令牌 code 与登录 code 的区别:

  • 登录 code:通过 wx.login() 获取,用于换取 session_key
  • 动态令牌 code:通过 wx.getPhoneNumber() 返回(旧版接口返回 encryptedData,新版返回动态 code)。

下面我们来分别看一下👇

旧版接口

前端:调用 uni.getPhoneNumber 获取加密手机号数据(encryptedData 和 iv),并将 uni.login 生成的 code 发送给后端,以便后端生成 session_key 用来解密。

后端:使用 session_key、encryptedData 和 iv 解密获取真实手机号。

前端-核心代码:

getPhoneNumber(e) { // 底部弹起用户手机号授权弹窗
    if (e.detail.errMsg == 'getPhoneNumber:ok') {
      const encryptedData = e.detail.encryptedData;
      const iv = e.detail.iv;

      // 优先使用之前保存的code
      const code = this.data.code || '';
      
      // 如果没有有效的code,则重新调用login获取
      if (!code) {
        wx.login({
          success: (loginRes) => {
            // 调用后端手机号解密接口,将 encryptedData、iv、code 发送到后端解密获取手机号
            api.decryptPhone({ encryptedData, iv, code })
          }
        });
      } else {
        api.decryptPhone({ encryptedData, iv, code })
      }

      

    } else {
      // 用户拒绝授权
      console.log('用户拒绝授权获取手机号');
    }
}

新版接口


前端:点击按钮生成动态 code,传给后端;

后端:直接用此 code 调用微信接口 phonenumber.getPhoneNumber 换取手机号(无需 session_key 解密,微信服务器直接返回明文手机号)。

前端-核心代码:

    getPhoneNumber(e) {
        const code = e.detail.code;
        if (code) {
            // 调用后端获取手机号接口,传入动态code即可
            api.getPhone({ code });
        }
    }

    【附录】---------------------------------------

    (旧版)前端完整代码:

    // 1. 先检查session_key是否有效
    wx.checkSession({
      success() {
        // session_key有效,直接获取手机号
        getPhoneNumber();
      },
      fail() {
        // session_key已过期,重新登录获取code
        wx.login({
          success: function(res) {
            if (res.code) {
              // 保存新的code,后续用于获取session_key
              const code = res.code;
              getPhoneNumber(code);
            }
          }
        });
      }
    });
    
    // 2. 获取手机号的函数
    function getPhoneNumber(existCode) {
      wx.getUserProfile({
        desc: '用于完善会员资料',
        success: function(userRes) {
          // 显示获取手机号的按钮
          wx.showModal({
            title: '提示',
            content: '需要获取您的手机号以完成注册',
            success: function(modalRes) {
              if (modalRes.confirm) {
                // 点击确定,显示获取手机号按钮
                wx.navigateTo({
                  url: '/pages/bindPhone/bindPhone'
                });
              }
            }
          });
        }
      });
    }
    
    
    // 3. 在绑定手机号页面的js中
    onGetPhoneNumber: function(e) {
        if (e.detail.errMsg === 'getPhoneNumber:ok') {
          const encryptedData = e.detail.encryptedData;
          const iv = e.detail.iv;
          
          // 优先使用之前保存的code
          const code = this.data.code || '';
          
          // 如果没有有效的code,则重新调用login获取
          if (!code) {
            wx.login({
              success: (loginRes) => {
                this.sendPhoneData(loginRes.code, encryptedData, iv);
              }
            });
          } else {
            this.sendPhoneData(code, encryptedData, iv);
          }
        } else {
          wx.showToast({
            title: '授权失败',
            icon: 'none'
          });
        }
      },
      
      sendPhoneData: function(code, encryptedData, iv) {
        wx.request({
          url: 'https://your-server.com/api/decryptPhone',
          method: 'POST',
          data: {
            code: code,
            encryptedData: encryptedData,
            iv: iv
          },
          success: (res) => {
            if (res.data.success) {
              const phoneNumber = res.data.phoneNumber;
              // 处理手机号,如保存到本地或进行登录操作
              wx.setStorageSync('phoneNumber', phoneNumber);
              wx.showToast({
                title: '绑定成功',
                success: () => {
                  wx.navigateBack();
                }
              });
            } else {
              wx.showToast({
                title: res.data.message || '解密失败',
                icon: 'none'
              });
            }
          },
          fail: () => {
            wx.showToast({
              title: '网络错误',
              icon: 'none'
            });
          }
        });
      }   

    (新版)前端完整代码:

    onGetPhoneNumber(e) {
        if (e.detail.code) {
          // 获取到动态令牌code,发送到后端
          wx.request({
            url: 'https://your-server.com/api/getPhoneNumber',
            method: 'POST',
            data: {
              code: e.detail.code,
              // 可选:传递用户标识(如openid)
              openid: wx.getStorageSync('openid')
            },
            success: (res) => {
              if (res.data.success) {
                const phoneNumber = res.data.phoneNumber;
                wx.showToast({
                  title: `获取成功: ${phoneNumber}`,
                  icon: 'none'
                });
              } else {
                wx.showToast({
                  title: res.data.message || '获取失败',
                  icon: 'none'
                });
              }
            },
            fail: () => {
              wx.showToast({
                title: '网络错误',
                icon: 'none'
              });
            }
          });
        } else {
          wx.showToast({
            title: '用户拒绝授权',
            icon: 'none'
          });
        }
      }

    ### 回答1: Unity是一款跨平台的游戏开发引擎,通常用于开发各种类型的游戏应用程序。然而,Unity本身不提供直接获取手机号码的API。在Unity中,要获取手机号码,通常需要依赖于其他第三方库或平台提供的API。以下是一种可能的实现方式: 一种常见的方法是使用Unity与Android或iOS原生平台的交互能力来获取手机号码。在Unity中,可以通过使用C#调用Android或iOS的原生插件来获取手机号码。需要编写C#脚本,并在其中实现调用原生平台的API接口。 以Android平台为例,可以通过Unity与Android原生插件进行交互,使用Android TelephonyManager类的getLine1Number()方法获取设备的手机号码。首先,需要编写一个Android原生插件,实现获取手机号码的逻辑。然后,将该插件导入到Unity项目中,并在C#脚本中调用该插件的相关方法来获取手机号码。 对于iOS平台,可以使用Unity的iOS Native Plugin功能来实现类似的操作。首先,编写一个Objective-C类或Swift类,实现获取手机号码的逻辑。然后,将该类导入到Unity项目中,并通过Unity的iOS Native Plugin功能来调用该类的方法来获取手机号码。 需要注意的是,获取设备手机号码是涉及到用户隐私的操作,对于某些地区和国家可能会受到法律的限制。因此,在进行此类操作时,需要遵守相关的法律法规,并确保在获取用户手机号码时获得用户的明确授权。 综上所述,通过与Android或iOS原生平台的交互,可以在Unity中实现获取手机号码的功能。但需要注意合规性和法律要求,尊重用户隐私。 ### 回答2: Unity中获取手机号码的API并不是Unity自带的功能,因为Unity主要是用来开发游戏和应用程序的跨平台引擎,并不涉及直接获取手机号码的操作。但是在Unity开发过程中,可以通过调用第三方插件或者与手机端进行交互来获取手机号码。 一种常用的方法是使用Unity与Android或iOS设备进行交互,通过调用相关平台的API来获取手机号码。例如,在Android平台上,可以使用Unity的Android插件功能,通过Java代码调用Android的TelephonyManager类的相关方法来获取手机号码。而在iOS平台上,可以使用Unity的iOS插件功能,通过Objective-C或Swift代码调用iOS的CoreTelephony类的相关方法来获取手机号码。 另外一种方法是通过在Unity应用中使用短信验证的服务提供商的API来验证手机号码。这些服务提供商通常会提供相应的API文档和示例代码,可以根据文档来调用API以获取手机号码。这种方法通常需要在用户进行手机号码验证时才能获取手机号码。 总之,Unity本身并不直接提供获取手机号码的API,但可以通过与手机平台进行交互或使用短信验证服务来获取手机号码。具体的实现方式会根据所使用的平台和需求来选择合适的方法。 ### 回答3: 在使用Unity获取手机号码的API时,通常需要结合第三方平台或服务商来实现。下面是一种简单的方法来获取手机号码: 1. 首先,你需要选择一个合适的第三方服务商来提供手机号码验证的功能。目前市面上有很多提供短信验证码的平台,比如阿里云、腾讯云、互亿无线等。 2. 注册一个账号并获得API密钥,这个密钥将用于在Unity中调用API。 3. 在Unity中创建一个新的C#脚本,用来处理手机号码验证的逻辑。 4. 在脚本中使用Unity提供的网络请求功能来向服务商的API发送请求。 5. 使用服务商提供的API接口,将要验证的手机号码作为参数传递给API。 6. 接着,服务商将会返回一个短信验证码到指定的手机号码。 7. 在Unity中,你可以使用输入框等UI组件来让用户输入短信验证码。 8. 当用户输入了验证码后,将验证码和手机号码再次发送给服务商的API进行验证。 9. 服务商将验证结果返回给Unity,你可以根据结果来处理相应的逻辑。 需要注意的是,具体的实现细节和步骤可能会因为选择的服务商不同而有所差异。因此,在使用Unity获取手机号码的API时,最好可以参考所选服务商提供的文档和示例代码来进行开发。
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值