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

本文主要是介绍uniapp开发微信小程序:用户手机号授权获取全流程详解与实战示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

随着多端小程序研发工具的日益普及,诸如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和openidconst { 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获取加密手机号,后端则负责解密处理。整个流程需遵守微信小程序平台的隐私政策和规定,确保用户数据的安全与合规,为用户提供透明、可控的授权体验。

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

在这里插入图片描述

这篇关于uniapp开发微信小程序:用户手机号授权获取全流程详解与实战示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1013356

相关文章

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[职场] 护理专业简历怎么写 #经验分享#微信

护理专业简历怎么写   很多想成为一名护理方面的从业者,但是又不知道应该怎么制作一份简历,现在这里分享了一份护理方面的简历模板供大家参考。   蓝山山   年龄:24   号码:12345678910   地址:上海市 邮箱:jianli@jianli.com   教育背景   时间:2011-09到2015-06   学校:蓝山大学   专业:护理学   学历:本科

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

十四、观察者模式与访问者模式详解

21.观察者模式 21.1.课程目标 1、 掌握观察者模式和访问者模式的应用场景。 2、 掌握观察者模式在具体业务场景中的应用。 3、 了解访问者模式的双分派。 4、 观察者模式和访问者模式的优、缺点。 21.2.内容定位 1、 有 Swing开发经验的人群更容易理解观察者模式。 2、 访问者模式被称为最复杂的设计模式。 21.3.观察者模式 观 察 者 模 式 ( Obser

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

工作流Activiti初体验—流程撤回【二】

已经玩工作流了,打算还是研究一下撤回的功能。但是流程图里面并不带撤回的组件,所以需要自己动态改造一下,还是延续上一个流程继续试验撤回功能。《工作流Activiti初体验【一】》 完整流程图 我们研究一下分发任务撤回到发起任务,其他环节的撤回类似 撤回的原理大概如下: 将分发任务后面的方向清空,把发起任务拼接到原来的判断网关,然后结束分发任务,这样流程就到发起任务了 此时的流程如上图,

ROS话题通信流程自定义数据格式

ROS话题通信流程自定义数据格式 需求流程实现步骤定义msg文件编辑配置文件编译 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如:

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码+详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 (2)通过传入width属性, 可以自定义下拉选项的宽度 (3)通过传入classN