uni-app 手机一键登录 uniCloud.getPhoneNumber 部分机型和手机不能调取成功 云函数接收不到参数

uni-app 手机一键登录 uniCloud.getPhoneNumber 部分机型和手机不能调取成功 云函数接收不到参数

产品分类

  • uniapp/App

PC开发环境操作系统

  • Windows

PC开发环境操作系统版本号

  • win10企业版LTSC 1809

HBuilderX类型

  • 正式

HBuilderX版本号

  • 3.2.9

手机系统

  • Android

手机系统版本号

  • Android 9.0

手机厂商

  • 华为

手机机型

  • nova 2s

页面类型

  • vue

打包方式

  • 云端

项目创建方式

  • HBuilderX

示例代码

'use strict';  
// 云函数  
exports.main = async function (event){  
  const res = await uniCloud.getPhoneNumber({  
    appid: '__UNI__3D620F8', // 替换成自己开通一键登录的应用的DCloud appid  
      provider: 'univerify',  
      apiKey: '', // 在开发者中心开通服务并获取apiKey  
      apiSecret: '', // 在开发者中心开通服务并获取apiSecret  
      access_token: event.access_token,  
      openid: event.openid  
  })  
  // 执行入库等操作,正常情况下不要把完整手机号返回给前端  
  return res  
}
uni.login({  
    provider: 'univerify',  
    univerifyStyle: {  
        fullScreen: true,  
        icon: {  
            path: "static/img/sys/0409/192.png"  
        },  
        authButton: {  
            normalColor: "#005792",  
        },  
        otherLoginButton: {  
            visible: false  
        },  
        buttons: { // 自定义页面下方按钮仅全屏模式生效(3.1.14+ 版本支持)  
            iconWidth: "80px", // 图标宽度(高度等比例缩放) 默认值:45px  
            list: [{  
                provider: "other",  
                iconPath: "/static/img/other-login.png" // 图标路径仅支持本地图片  
            }, ]  
        }  
    },  
    success: (res) => {  
        let {  
            access_token,  
            openid  
        } = res.authResult  
        uniCloud.callFunction({  
            name: 'localPhoneNumber', // 你的云函数名称  
            data: {  
                access_token: access_token, // 客户端一键登录接口返回的access_token  
                openid: openid // 客户端一键登录接口返回的openid  
            }  
        }).then(result => {  
            this.login(result.result.phoneNumber)  
        }).catch(err => {  
            uni.closeAuthView()  
        })  
    },  
    fail: (fail) => {  
        if (fail.code == 30008 && fail.provider == 'other') {  
            uni.closeAuthView()  
        }  
    }  
})

操作步骤

  • 随机性

预期结果

  • 能正常获取参数和调用成功

实际结果

  • 部分机型 有时能云函数能获取参数 有时不能 调用失败

bug描述

  • 手机一键登录 uniCloud.getPhoneNumber 部分机型 和手机不能调取成功 云函数接收不到参数 导致一键登录失败


更多关于uni-app 手机一键登录 uniCloud.getPhoneNumber 部分机型和手机不能调取成功 云函数接收不到参数的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

失败的时候的错误信息错误码发一下

更多关于uni-app 手机一键登录 uniCloud.getPhoneNumber 部分机型和手机不能调取成功 云函数接收不到参数的实战教程也可以访问 https://www.itying.com/category-93-b0.html


就是那个一键登录的云函数,获取不到有时候获取不到传入的参数,偶发性的,国庆后我再去看下,发您。

真机调试 连接的云端函数 调用云函数报错 【连接本地调试服务失败,请检查客户端是否和主机在同一局域网下】

真机调试 连接的云端函数 调用云函数报错 【连接本地调试服务失败,请检查客户端是否和主机在同一局域网下】 【复现步骤】先取消移动数据连接 然后再开启 再调用一键登录 偶发报这个错误。

中间没有关闭无线?你用的HBuilderX版本多少?

回复 DCloud_uniCloud_WYQ: HBuilderX版本:3.2.9.20210927 中间没有关闭无线

回复 5***@qq.com: 我试试能不能复现

问题分析:

根据您提供的代码和描述,问题可能出现在以下几个方面:

  1. 参数传递问题:云函数 uniCloud.getPhoneNumber 需要 access_tokenopenid 参数,但部分机型或网络环境下,这些参数可能未正确传递到云函数。
  2. 网络延迟或超时:部分机型或网络环境较差时,可能导致云函数调用超时或参数丢失。
  3. 一键登录服务兼容性:不同机型对一键登录服务的支持可能存在差异,尤其是较老的机型(如华为 nova 2s,Android 9.0)。

解决方案:

  1. 检查参数传递

    • 在云函数中添加日志,确认 event.access_tokenevent.openid 是否正常接收。例如:
      console.log('event:', event); // 打印完整 event 对象
      
    • 在前端调用云函数时,确保 access_tokenopenid 已正确赋值:
      data: {
        access_token: access_token,
        openid: openid
      }
      
  2. 优化网络请求

    • 在云函数调用时增加超时处理,例如使用 Promise.race 设置超时限制。
    • 检查网络环境,确保设备网络稳定。
  3. 机型兼容性处理

    • 部分老旧机型可能对一键登录服务支持不完善,建议在调用前检查机型或系统版本,并给出降级方案(如切换为短信验证码登录)。
    • 更新 HBuilderX 到最新版本(当前为 3.2.9,可检查是否有新版本修复相关兼容性问题)。
  4. 云函数配置检查

    • 确认 apiKeyapiSecret 已正确配置(示例代码中为空,需替换为实际值)。
    • 检查一键登录服务是否已在 DCloud 开发者中心开通,并确保应用 AppID 正确。
  5. 错误处理增强

    • 在前端和云函数中添加更详细的错误捕获和日志记录,便于定位问题。例如:
      uniCloud.callFunction({
        name: 'localPhoneNumber',
        data: { access_token, openid }
      }).then(result => {
        // 处理成功
      }).catch(err => {
        console.error('云函数调用失败:', err);
        uni.closeAuthView();
      });
回到顶部