uniapp开发微信小程序:用户手机号授权获取全流程详解与实战示例

news2024/11/15 14:03:50

在这里插入图片描述

随着多端小程序研发工具的日益普及,诸如uniapp、Taro、Flutter等跨平台解决方案使得开发者能够高效地构建同时适配多个主流小程序平台(如微信、支付宝、百度、字节跳动等)的应用。尽管各平台间存在一定的差异性,但在获取用户手机号码这一核心需求上,大体遵循相似的流程和规范。

在开发微信小程序时,获取用户手机号码同样需要前端与后端协同工作。

一、前置条件

1、微信开发者资质认证

  • 确保您的小程序已通过微信平台的开发者资质认证,具备获取用户手机号的权限。

2、基础库版本要求

  • 使用支持获取手机号功能的微信小程序基础库版本。

3、用户授权

  • 用户必须主动同意授权小程序获取其手机号码。

二、前端实现步骤

每个小程序平台对于用户隐私保护和数据获取都有自己的规定和接口。在实施手机号获取功能时,首先要确保对目标平台的开发文档有深入了解,明确其获取手机号的接口调用方式、用户授权流程、数据传输格式等细节。例如,微信小程序使用getPhoneNumber接口,支付宝小程序则可能使用my.getPhoneNumber等类似方法。

在多端小程序研发工具中,通常会提供一套抽象层来适配不同平台的特性和API。利用这些抽象层,开发者可以编写一次代码,让其在各个平台上都能正确调用相应的获取手机号接口。

例如,uniapp提供了<button open-type="getPhoneNumber">这样的组件和事件。

1. 配置按钮组件

在需要获取手机号的页面中,添加一个<button>组件,设置其open-type属性为getPhoneNumber,并绑定@getphonenumber事件处理回调:

<template>
  <view>
    <!-- 其他界面元素 -->
    <button open-type="getPhoneNumber" @getphonenumber="onGetPhoneNumber">授权并获取手机号</button>
  </view>
</template>

2. 处理@getphonenumber事件

在对应的Vue单文件组件(.vue文件)中,编写onGetPhoneNumber方法处理回调信息:

<script>
export default {
  methods: {
    async onGetPhoneNumber(e) {
      const { detail: { encryptedData, iv, code } } = e;

      try {
        // 发送code、encryptedData、iv到后端
        const response = await this.$http.post('/api/getPhoneNumber', {
          code,
          encryptedData,
          iv,
        });

        if (response.status === 200 && response.data.success) {
          // 后端成功解密并返回手机号,此处假设响应数据结构为 { phone: '1234567890' }
          const phoneNumber = response.data.phone;
          this.savePhoneNumber(phoneNumber);
        } else {
          console.error('后端解密失败或返回异常:', response.data.message);
        }
      } catch (error) {
        console.error('请求后端接口失败:', error);
      }
    },

    savePhoneNumber(phoneNumber) {
      // 在此处处理获得的手机号码,如保存到本地存储或更新用户状态
    },
  },
};
</script>

这里假设使用了axios或类似的HTTP库封装在this.$http中。实际项目中请替换为你的实际请求方式。

3. 用户授权提示

无论使用哪个小程序平台,获取用户手机号都需要用户明确授权。在设计交互时,应确保授权提示清晰、易于理解,并尊重用户体验。通常,这包括在请求授权前展示说明文字、弹窗提示用户授权的目的和影响,以及在授权失败时提供适当的错误提示和重试机制。

可以在按钮附近添加提示文案,告知用户点击后将请求获取手机号授权。可以使用默认的授权弹窗提示,也可以自定义授权弹窗提示。

三、后端实现步骤

尽管前端调用方式可能因平台而异,但各平台返回的手机号数据通常都是加密的,需要后端通过特定的解密算法和平台提供的密钥(如session_key)进行解密。因此,后端处理这部分逻辑时可以保持一致性,只需关注如何根据不同的平台标识正确地获取和使用密钥。解密后的手机号数据处理(如存储、验证、关联用户账户等)也是跨平台通用的。

1. 接收前端数据

后端创建一个API接口(如/api/getPhoneNumber),用于接收前端发送的codeencryptedDataiv

// 以Express为例
app.post('/api/getPhoneNumber', async (req, res) => {
  const { code, encryptedData, iv } = req.body;

  try {
    // 使用code换取session_key和openid
    const { session_key, openid } = await exchangeCodeForSessionKey(code);

    // 使用session_key解密手机号
    const phoneNumber = await decryptPhoneNumber(session_key, encryptedData, iv);

    // 根据openid关联用户并保存手机号
    await updateUserPhoneNumber(openid, phoneNumber);

    res.json({ success: true, message: '手机号码获取成功' });
  } catch (error) {
    console.error('获取手机号码过程中出现错误:', error);
    res.status(500).json({ success: false, message: '服务器内部错误' });
  }
});

2. 使用code换取session_keyopenid

调用微信官方接口sns/jscode2session,使用code换取session_keyopenid

async function exchangeCodeForSessionKey(code) {
  const url = `https://api.weixin.qq.com/sns/jscode2session?appid=${APP_ID}&secret=${APP_SECRET}&js_code=${code}&grant_type=authorization_code`;
  const response = await fetch(url);
  const data = await response.json();

  if (!data.session_key || !data.openid) {
    throw new Error('Failed to exchange code for session_key and openid');
  }

  return {
    session_key: data.session_key,
    openid: data.openid,
  };
}

3. 解密手机号

使用session_key和接收到的encryptedDataiv解密手机号:

const WXBizDataCrypt = require('./WXBizDataCrypt'); // 引入微信官方提供的解密类

async function decryptPhoneNumber(session_key, encryptedData, iv) {
  const pc = new WXBizDataCrypt(APP_ID, session_key);
  const data = {};

  const errCode = pc.decryptData(encryptedData, iv, data);
  if (errCode !== 0) {
    throw new Error(`Failed to decrypt phoneNumber: ${errCode}`);
  }

  return data.phoneNumber;
}

这里假设已经引入了微信官方提供的解密工具类WXBizDataCrypt,并实现了相应的解密逻辑。

4. 更新用户信息

根据解密得到的手机号和openid,更新或关联用户信息:

async function updateUserPhoneNumber(openid, phoneNumber) {
  // 实现根据openid查找用户并更新其手机号的逻辑
}

注意事项

  • 安全传输:前后端通信应使用HTTPS确保数据安全。
  • 合规使用:获取用户手机号后,严格遵守隐私政策,仅在用户同意范围内使用,并不得泄露给第三方。
  • 错误处理:全面考虑各种可能的错误情况,如网络异常、解密失败、用户拒绝授权等,并提供合理的用户反馈。

在使用多端小程序研发工具如uniapp开发微信小程序获取用户手机号码时,需确保已在小程序后台配置相关权限作为前置条件。前端通过调用API获取加密手机号,后端则负责解密处理。整个流程需遵守微信小程序平台的隐私政策和规定,确保用户数据的安全与合规,为用户提供透明、可控的授权体验。

在实际开发中,请始终参考最新的官方文档和示例进行编程。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1711868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

helm离线安装

目录 概述实践 概述 centos 7.x 离线安装 helm 3.14.4 版本 实践 离线包资源下载地址 github [roothadoop01 ~]# tar -xvf helm-v3.14.4-linux-amd64.tar.gz linux-amd64/ linux-amd64/README.md linux-amd64/LICENSE linux-amd64/helm [roothadoop01 ~]# mv ./linux-amd…

【云原生 | 59】Docker中通过docker-compose部署ELK

目录 1、组件介绍 2 、项目环境 2.1 各个环境版本 2.2 Docker-Compose变量配置 2.3 Docker-Compose服务配置 3、在Services中声明了四个服务 3.1 ElasticSearch服务 3.2 Logstash服务 3.3 Kibana服务 3.4 Filebeat服务 4、使用方法 4.1 方法一 4.2 方法二 5、启动…

WebPack插件实现:打包之后自动混淆加密JS文件

在WebPack中调用JShaman&#xff0c;实现对编译打包生成的JS文件混淆加密 一、插件实现 1、插件JShamanObfuscatorPlugin.js&#xff0c;代码&#xff1a; class JShamanObfuscatorPlugin { apply(compiler) { compiler.hooks.emit.tapAsync(JShamanObfuscatorPlugin, (comp…

深度神经网络——什么是迁移学习?

1.概述 在练习机器学习时&#xff0c;训练模型可能需要很长时间。从头开始创建模型架构、训练模型&#xff0c;然后调整模型需要大量的时间和精力。训练机器学习模型的一种更有效的方法是使用已经定义的架构&#xff0c;可能具有已经计算出的权重。这是背后的主要思想 迁移学习…

嵌入式进阶——OLED显示器(SPI)

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 SPI协议原理图字库芯片中文显示屏原理API的使用 SPI协议 SPI&#xff08;Serial Peripheral Interface&#xff09;是一种同步串行…

使用Django实现WebSocket

文章目录 安装依赖编写Consumer配置路由在模板中使用WebSocket运行应用 WebSocket是一种在单个TCP连接上进行全双工通信的协议&#xff0c;在Web开发中被广泛应用于实时通信和数据推送。本文将介绍如何在Django中使用WebSocket来实现实时通信功能。 安装依赖 首先&#xff0…

VMware vSphere 8.0 Update 2c 下载 - 企业级工作负载平台

VMware vSphere 8.0 Update 2c 下载 - 企业级工作负载平台 ESXi 8.0U2 & vCenter Server 8.0U2 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vsphere-8-u2/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org …

《最新出炉》系列入门篇-Python+Playwright自动化测试-46-鼠标滚轮操作

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 有些网站为了节省流量和资源&#xff0c;提高加载效率&#xff0c;采用的是动态加载&#xff08;懒加载&#xff09;的&#xff0c;也就是当拖动页面右侧滚动条后会自动加载网…

IDM究竟有哪些优势:全面解析高速下载与管理利器!

一、引言 Internet Download Manager&#xff08;简称IDM&#xff09;是一款功能强大的文件下载工具&#xff0c;它具备许多优势&#xff0c;使得用户在下载文件时能够获得更快的速度和更好的体验。本文将详细介绍IDM的优势。 二、IDM简介 IDM是一款流行的下载管理软件&#…

绘唐app官方版绘唐3AI工具

绘唐app官方版绘唐3AI工具 激活授权方式&#xff1a;https://qvfbz6lhqnd.feishu.cn/wiki/CcaewIWnSiAFgokOwLycwi0Encf 绘唐app是一款基于人工智能和摄影技术的应用程序&#xff0c;旨在帮助用户将照片转化为唐朝画风的艺术作品。 该应用程序使用先进的图像处理算法&#xf…

Epic Pen Pro v3 解锁版安装教程 (屏幕实时标记注释工具)

前言 Epic Pen是一款功能强大的屏幕标记工具&#xff0c;允许您在屏幕上绘图或书写&#xff0c;而无需在后台与软件交互。这意味着您几乎可以注释任何东西&#xff01;使用我们流行的屏幕标记和Windows数字白板工具Epic Pen编写、绘制和突出显示&#xff0c;包括演示文稿软件&…

深入解析绘图范式:面向对象与直接操作的较量

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 第一节&#xff1a;面向对象绘图的魅力 第二节&#xff1a;直接操作绘图模块的便捷性 第三…

Linux查看设备信息命令

dmidecode | grep Product Name 查看grub版本号&#xff1a;rpm -qa | grep -i "grub" 客户端操作系统版本&#xff1a; cat /etc/issue cat /etc/redhat-release 处理器品牌及型号&#xff1a; less /proc/cpuinfo |grep model

基于BP神经网络的64QAM解调算法matlab性能仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 ....................................................... % 第一部分&#xff1a;加载并可视…

触觉训练技巧:盲人感知世界的第二双“眼”

在当今科技日新月异的时代&#xff0c;辅助技术正逐步成为残障人士融入社会的重要桥梁。其中&#xff0c;一款名为““蝙蝠避障””的创新软件&#xff0c;凭借其实时避障和拍照识别功能&#xff0c;为盲人朋友的日常生活带来了前所未有的便捷与安全。然而&#xff0c;技术的辅…

社区电商系统业务架构:打造线上线下融合的智慧生活圈

在数字化时代&#xff0c;社区电商系统已成为连接线上线下的重要纽带&#xff0c;为居民提供便捷的购物体验和多样化的生活服务。本文将深入探讨社区电商系统的业务架构&#xff0c;揭示其在构建智慧生活圈中的关键作用。 ### 1. 概述 社区电商系统是基于互联网技术构建的一种…

【iOS】UI学习(一)

UI学习&#xff08;一&#xff09; UILabelUIButtonUIButton事件 UIViewUIView对象的隐藏UIView的层级关系 UIWindowUIViewController定时器与视图对象 UISwitch UILabel UILabel是一种可以显示在屏幕上&#xff0c;显示文字的一种UI。 下面使用代码来演示UILabel的功能&#…

数据分析中的列与行交换技巧

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;数据交换的重要性 二、列交换的基本原理 三、列交换的代码实现 1. 使…

[docker] docker 安全知识 - docker api, 权限提升 资源管理

[docker] docker 安全知识 - docker api, 权限提升 & 资源管理 这是 docker 安全的最后一篇 暴露 docker api 在 [docker] docker 安全知识 - docker 系统性简介 中曾经提到&#xff0c;docker cli 使用 restful api 与客户端和 docker daemon 之间交流。默认情况下&…

优化效率,简化流程:探索工资结算系统的重要性与实施方法

在现代企业中&#xff0c;工资结算是一项重要而复杂的任务。为了更好地管理和处理员工的工资事务&#xff0c;许多企业采用工资结算系统。本文将探讨工资结算系统的重要性&#xff0c;并介绍一些实施该系统的方法。 ### 1. 概述 工资结算系统是一种自动化的软件系统&#xff0…