uni-app vue3下 微信小程序手机号授权返回参数和文档不符

发布于 1周前 作者 htzhanglong 来自 Uni-App

uni-app vue3下 微信小程序手机号授权返回参数和文档不符

类别 信息
产品分类 uniapp/小程序/微信
PC开发环境 Windows
操作系统版本 win10
HBuilderX类型 正式
HBuilderX版本 3.99
项目创建方式 HBuilderX

示例代码:

<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">使用手机号码登录</button>
getPhoneNumber: function(e) {
console.log(e)
}

操作步骤:

  • 复制代码 获取手机号

预期结果:

getPhoneNumber (e) {
console.log(e.detail.code)  // 动态令牌
console.log(e.detail.errMsg) // 回调信息(成功失败都会返回)
console.log(e.detail.errno)  // 错误码(失败时返回)
}

实际结果:

getPhoneNumber (e) {
console.log(e.code)  // 动态令牌
console.log(e.errMsg) // 回调信息(成功失败都会返回)
console.log(e.errno)  // 错误码(失败时返回)
}  

bug描述: vue3版本开发,遇到小程序获取手机号时 按照微信开放文档 应当返回的是

getPhoneNumber (e) {
console.log(e.detail.code)  // 动态令牌
console.log(e.detail.errMsg) // 回调信息(成功失败都会返回)
console.log(e.detail.errno)  // 错误码(失败时返回)
}

但是实际返回的时候是

getPhoneNumber (e) {
console.log(e.code)  // 动态令牌
console.log(e.errMsg) // 回调信息(成功失败都会返回)
console.log(e.errno)  // 错误码(失败时返回)
}  

之前用vue2版本开发的小程序没有发生问题,新开发的换的vue3模式开发的,遇到的问题


5 回复

好奇怪 我这边v3版本编译到小程序 是e.detail.code


你切换hbx版本试试呢?

我也是e.detail.code

我这里测试正常,请提供下测试工程吧。

在使用 uni-app 开发微信小程序时,如果你在 Vue3 环境下进行手机号授权,并且发现返回的参数与官方文档不符,可能是以下几个原因导致的:

1. 检查 uni.loginuni.getUserInfo 的使用

微信小程序的手机号授权通常需要结合 uni.loginuni.getUserInfo 来实现。确保你正确使用了这两个 API。

uni.login({
  provider: 'weixin',
  success: function (loginRes) {
    // 获取登录凭证
    const code = loginRes.code;

    // 获取用户信息
    uni.getUserInfo({
      provider: 'weixin',
      success: function (userInfoRes) {
        // 获取用户信息
        const userInfo = userInfoRes.userInfo;

        // 获取手机号
        uni.getPhoneNumber({
          success: function (phoneRes) {
            // 获取加密数据
            const encryptedData = phoneRes.encryptedData;
            const iv = phoneRes.iv;

            // 解密手机号
            // 需要将 encryptedData 和 iv 发送到服务器进行解密
          },
          fail: function (err) {
            console.error('获取手机号失败', err);
          }
        });
      },
      fail: function (err) {
        console.error('获取用户信息失败', err);
      }
    });
  },
  fail: function (err) {
    console.error('登录失败', err);
  }
});

2. 检查 uni.getPhoneNumber 的返回参数

uni.getPhoneNumber 的返回参数通常包括 encryptedDataiv,这两个参数需要发送到服务器进行解密,才能获取到用户的手机号。

{
  "encryptedData": "xxxxxx",
  "iv": "xxxxxx"
}

如果你发现返回的参数与文档不符,可能是以下原因:

  • 微信小程序版本问题:确保你使用的微信小程序基础库版本是最新的,或者至少是支持 getPhoneNumber 的版本。
  • uni-app 版本问题:确保你使用的 uni-app 版本是最新的,或者至少是支持 Vue3 的版本。

3. 检查服务器端解密逻辑

获取到 encryptedDataiv 后,需要在服务器端进行解密。确保服务器端的解密逻辑正确,并且使用了正确的 session_key

const crypto = require('crypto');
const WXBizDataCrypt = require('./WXBizDataCrypt');

const appId = 'your-app-id';
const sessionKey = 'user-session-key';
const encryptedData = 'encrypted-data-from-client';
const iv = 'iv-from-client';

const pc = new WXBizDataCrypt(appId, sessionKey);
const data = pc.decryptData(encryptedData, iv);

console.log('解密后的数据: ', data);
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!