HBuilderX(uniapp)实现微信小程序获取用户头像、昵称、授权登录、获取用户手机号

news2025/1/12 7:49:56

前言:微信文档写的零零散散的,网上搜的教程,23年的教程还在教22年改版之前的东西,导致踩坑无数,所以自己写一下文档记录一下,帮助后来者,记录于2024.11.14

一.获取用户头像和昵称

首先阅读微信小程序官方文档,wx.getUserInfo接口开放接口 / 用户信息 / wx.getUserInfo (qq.com)

发现自2022年之后,开发的版本逐渐对用户信息接口更改,wx.getUserInfo接口已经基本弃用,之前老版本还能够使用,但是新版小程序调用此接口只能获取到一堆默认信息如下









​​​​​​
​   小程序登录、用户信息相关接口调整说明 | 微信开放社区 (qq.com)

所以要实现获取用户头像,不能像之前一样一键获取了,有的文档说会调起一个授权弹窗,然后用户手动授权之后就可以获取,亲测这个方法已经过时,即下图这个方法并不会弹出个人信息确认弹窗

目前唯一可行的方法就是:头像昵称填写能力

开放能力 / 用户信息 / 获取头像昵称 (qq.com)

需要将 button 组件 open-type 的值设置为 chooseAvatar,当用户选择需要使用的头像之后,可以通过 bindchooseavatar 事件回调获取到头像信息的临时路径。

需要将 input 组件 type 的值设置为 nickname,当用户在此input进行输入时,键盘上方会展示微信昵称。

其中有两个需要注意的点:

1.选择的微信头像是暂存到本地的路径,随时可能会失效,或者出现307重定向等一系列bug,所以要把头像上传的自己本地的服务器,或者本地的接口保存,就是把onChooseAvatar方法修改成如下

onChooseAvatar: function(e) {
				const {
					avatarUrl
				} = e.detail
				let _this = this
				wx.uploadFile({
					url: '',   // 你自己本地上传图片的 完整 路径
					filePath: avatarUrl,
					name: 'file', // 文件对应的 key,开发者在服务端可以通过这个 key 获取文件的二进制内容
					success(res) {
						console.log("data===>",res.data)
						_this.setData({
							avatarUrl:'' // 你自己的完整图片路径
						})
					}
				})
			},

2.微信昵称选择的时候,输入框有值,并且绑定了v-model,并不会被监听到,即使修改了,值也还是空的,必须要用户手动再修改才会被v-model发现修改,这是一个bug吧,所以要手动用watch监听一下输入框绑定的值

获取头像昵称示例代码如下:

<button class="avatar-wrapper" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar">
  <image class="avatar" src="{{avatarUrl}}"></image>
</button> 
<input type="nickname" class="weui-input" placeholder="请输入昵称"/>

const defaultAvatarUrl = 'https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0'

export default{
    data(){
        avatarUrl: defaultAvatarUrl, // 可以自行修改
    },
    methods:{
        
    }
}
 
  onChooseAvatar(e) {    // 将这个方法修改为上面那个,注意变量名更改
    const { avatarUrl } = e.detail 
    this.setData({
      avatarUrl,
    })
  }
})

二.微信授权登录

主要用到的接口就是wx.login接口,其功能如下:

调用接口获取登录凭证(code)。通过凭证进而换取用户登录态信息,包括用户在当前小程序的唯一标识(openid)、微信开放平台账号下的唯一标识(unionid,若当前小程序已绑定到微信开放平台账号)及本次登录的会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成。

很抽象,通俗来讲,就是调用wx.login接口,微信会给你返回一个code,通过这个code传给后端,后端会通过系列操作(这个系列操作后面会讲)返回给你一个openid,unionid和session_key,作用我都会一一介绍。然后上文说的解密通讯是交给后端完成的。

openid作用是用户在本小程序的唯一作用标识。

unionid是多个小程序之间,同一用户,不用重新授权即可直接登录的标识,此unionid需要注册微信开放平台认证才可获得,如果只是开发一个小程序则不需要这个id。

session_key:五分钟一次刷新,用来判断登录是否过期。

首先我们来阅读官方文档开放接口 / 登录 / wx.login (qq.com)

下图是从别的博客借鉴来的,三列,第一列是前端要做的,第二列是后端要做的

首先,在登录界面的onLoad函数中调用wx.login

onLoad: function(options) {
			let that = this;
			wx.login({
				success: res => {
					that.code = res.code
				}
			})
		},

把这个code保存下来。然后通过自己的wxLogin把这个code传给后端,后端阅读这个文档

小程序登录 / 小程序登录 (qq.com)

调用微信的服务

GET https://api.weixin.qq.com/sns/jscode2session

后端直接配置下面四个参数然后调用

appid和secret在微信小程序的平台内可以查看到,js_code就是前端传入的code,下一个参数直接填写authorization_code即可、然后微信服务器会返回openid等参数,然后把这个openid返回给前端,同时在这个login接口里面注册用户保存到数据库,把userId和openid一起返回给前端,到此登录流程就结束了。

三.获取用户手机号

阅读官方文档开放能力 / 用户信息 / 手机号快速验证组件 (qq.com)

<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">微信授权登录</button>

注意,现在手机号快速验证需要收费了,如果你是个人appid,则需要完成微信小程序认证,300一年,如果不想认证还想用这个功能,就要用测试号,把appid和secret都换成测试号的。

而且现在这个获取用户手机号,不用wx.login也可以登录

使用方法

步骤1:需要将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,通过 bindgetphonenumber 事件获取回调信息;

步骤2:将 bindgetphonenumber 事件回调中的动态令牌code传到开发者后台,并在开发者后台调用微信后台提供的 phonenumber.getPhoneNumber 接口,消费code来换取用户手机号。每个code有效期为5分钟,且只能消费一次。

注:getPhoneNumber 返回的 code 与 wx.login 返回的 code 作用是不一样的,不能混用。这句话很重要!!在和授权登录一起写的时候很容易弄混。

我是直接全都在前端调用了,效果如下

!!!今天上线体验版的时候发现,https://api.weixin.qq.com这个域名不能配置为合法域名,微信直接把这个禁用了,即这一段代码全都必须只能放在后端运行,即后端写一个接口,接受code参数,然后把下面代码中的e.detail.code这个参数传给后端,下面的一系列post微信服务的接口都由后端来完成,直接返回电话号码即可、

文档:获取手机号 | 微信开放文档

后端操作:
先调用https://api.weixin.qq.com/cgi-bin/stable_token,post方法,传参grant_type: 'client_credential', appid: config.appid, secret: config.secret


获取到token,这个token是获取手机号的token,不是登录的token


然后调用url: `https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=` + token,post方法,传参code,返回的数据就是包含手机号的数据
 

getPhoneNumber(e) {
				console.log("e=>", e) // 这里会返回encryptedData和iv,用来加密和解密
				if (e.detail.errMsg === 'getPhoneNumber:ok') {
					// this.encryptedData = e.detail.encryptedData
					// this.iv = e.detail.iv
					const code = e.detail.code;
					let promise = new Promise((resolve, reject)=> {
					  var params = {
					  	url: '/login',
					  	data: {
					  		principal: this.code,
					  	},
					  	callBack: res => {
					  		http.loginSuccess(res)  // 这是我自己外部文件保存登录token等信息
					  	}
					  }
					  http.request(params)
					  resolve();
					});
					promise.then((res)=>{
						uni.request({
							url: `https://api.weixin.qq.com/cgi-bin/stable_token`,
							method: "POST",
							data: {
								grant_type: 'client_credential',
								appid: config.appid,
								secret: config.secret
							},
							success: res => {
                                // 此token和code不是login的token和code,这一步可以放到后端写
								this.getPhone(res.data.access_token, code);
							},
							fail: err => {
								console.error("调用失败=>", err);
							}
						});
					})
				} else {
					console.error('用户未授权手机号');
					uni.showToast({
						title: '用户未授权手机号',
						icon: 'none'
					});
				}
			},
            getPhone(token, code) {
				// 获取手机号
				uni.request({
					url: `https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=` + token,
					method: "POST",
					data: {
						code: code
					},
					success: res => {
						console.log("获取到的用户手机号全部信息:", res);
						// 获取到手机号
						this.phoneNumber = res.data.phone_info.purePhoneNumber;
						console.log("流程结束!!")
					},
					fail: err => {
						console.error("获取手机号失败", err);
						uni.showToast({
							title: '获取手机号失败',
							icon: 'none'
						});
					}
				});
			},

手动删减的,有的地方花括号可能会有报错,请见谅,但大体流程就是上面那样,最后res.data.phone_info.purePhoneNumber就是最终的用户手机号。

获取手机号和微信授权登录可以写到同一个按钮里面,具体逻辑可以自己操作

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

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

相关文章

RabbitMQ基础(简单易懂)

什么是RabbitMQ&#xff1f; 它基于AMQP协议&#xff08;Advanced Message Queuing Protocol&#xff09;&#xff0c;一种为应用构建消息队列的标准协议。过程中&#xff0c;它提供了一些重要模块&#xff1a;为消息发送的Producer&#xff08;生产者&#xff09;&#xff0c…

【web靶场】之upload-labs专项训练(基于BUUCTF平台)

前言 该靶场&#xff0c;是通过平台BUUCTF在线评测中的靶场进行的&#xff0c;基于linux搭建的 当然若是想要该靶场&#xff0c;可以采用github上的醒目&#xff0c;点击后面文字即可访问c0ny1/upload-labs: 一个想帮你总结所有类型的上传漏洞的靶场 或者本人分享在网盘中&a…

美摄科技为企业打造专属PC端视频编辑私有化部署方案

美摄科技&#xff0c;作为视频编辑技术的先行者&#xff0c;凭借其在多媒体处理领域的深厚积累&#xff0c;为企业量身打造了PC端视频编辑私有化部署解决方案&#xff0c;旨在帮助企业构建高效、安全、定制化的视频创作平台&#xff0c;赋能企业内容创新&#xff0c;提升品牌影…

Vue3(elementPlus) el-table替换/隐藏行箭头,点击整行展开

element文档链接&#xff1a; https://element-plus.org/zh-CN/component/form.html 一、el-table表格行展开关闭箭头替换成加减号 注&#xff1a;Vue3在样式中修改箭头图标无效&#xff0c;可能我设置不对&#xff0c;欢迎各位来交流指导 转变思路&#xff1a;隐藏箭头&…

【C++入门】详解(中)

目录 &#x1f495;1.函数的重载 &#x1f495;2.引用的定义 &#x1f495;3.引用的一些常见问题 &#x1f495;4.引用——权限的放大/缩小/平移 &#x1f495;5. 不存在的空引用 &#x1f495;6.引用作为函数参数的速度之快&#xff08;代码体现&#xff09; &#x1f4…

【题解】—— LeetCode一周小结53

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结52 30.二叉树中的链表 题目链接&#xff1a;1367. 二叉树中的链…

Vue方法、计算机属性及侦听器

数组变化侦测 假设我们写了一个数组&#xff0c;现在想让该数组中新增一条数据,那么如何去实现呢&#xff1f; <template><h3>数组变化侦听</h3><button click"addListHandler">添加数据</button><ul><li v-for"(item…

TIOBE编程语言排行靠前的编程语言的吉祥物

Python的吉祥物&#xff1a;小蟒蛇 Python语言的吉祥物是一只名叫"Pythonidae"&#xff08;或简称"Py"&#xff09;的小蟒蛇。这个吉祥物由Tobias Kohn设计于2005年&#xff0c;它的形象借鉴了真实的蟒蛇&#xff0c;但加入了一些可爱和友善的特点。小蟒蛇…

Linux (CentOS) 安装 Docker 和 Docker Compose

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 欢迎点赞 &#x1f44d; 收藏 ⭐评论 …

Unity热更新 之 Addressables(2) 本地/远端打包 流程测试

基础篇&#xff1a;Unity热更新 之 Addressables(1) 资源基础加载-CSDN博客 基础方法来源于唐老狮,我也是初学热更这一块&#xff0c;所有不保证步骤完全正确&#xff0c;如有不足还请斧正 目录 0.前提 1.本地打包 1.1.资源放入包 1.2.简化路径名称给出标签(如有需要的话) …

Openstack持久存储-Swift,Cinder,Manila三者之间的区别

总结不易&#xff0c;给个三连吧&#xff01;&#xff01;&#xff01; 补充&#xff1a; 文件共享存储服务Manila 在OpenStack生态系统中&#xff0c;Cinder和Manila分别提供了两种不同类型的存储服务&#xff0c;类似于传统的SAN&#xff08;存储区域网络&#xff09;和NAS&…

【TI毫米波雷达】DCA1000不使用mmWave Studio的数据采集方法,以及自动化实时数据采集

【TI毫米波雷达】DCA1000不使用mmWave Studio的数据采集方法&#xff0c;以及自动化实时数据采集 mmWave Studio提供的功能完全够用了 不用去纠结用DCA1000低延迟、无GUI传数据 速度最快又保证算力无非就是就是Linux板自己写驱动做串口和UDP 做雷达产品应用也不会采用DCA1000的…

JavaEE之线程池

前面我们了解了多个任务可以通过创建多个线程去处理&#xff0c;达到节约时间的效果&#xff0c;但是每一次的线程创建和销毁也是会消耗计算机资源的&#xff0c;那么我们是否可以将线程进阶一下&#xff0c;让消耗计算机的资源尽可能缩小呢&#xff1f;线程池可以达到此效果&a…

J-LangChain - 复杂智能链流式执行

系列文章索引 J-LangChain 入门 介绍 j-langchain是一个Java版的LangChain开发框架&#xff0c;具有灵活编排和流式执行能力&#xff0c;旨在简化和加速各类大模型应用在Java平台的落地开发。它提供了一组实用的工具和类&#xff0c;使得开发人员能够更轻松地构建类似于LangC…

《HeadFirst设计模式》笔记(上)

设计模式的目录&#xff1a; 1 设计模式介绍 要不断去学习如何利用其它开发人员的智慧与经验。学习前人的正统思想。 我们认为《Head First》的读者是一位学习者。 一些Head First的学习原则&#xff1a; 使其可视化将文字放在相关图形内部或附近&#xff0c;而不是放在底部…

springboot整合h2

在 Spring Boot 中整合 H2 数据库非常简单。H2 是一个轻量级的嵌入式数据库&#xff0c;非常适合开发和测试环境。以下是整合 H2 数据库的步骤&#xff1a; 1. 添加依赖 首先&#xff0c;在你的 pom.xml 文件中添加 H2 数据库的依赖&#xff1a; <dependency><grou…

安装rocketmq dashboard

1、访问如下地址&#xff1a; GitHub - apache/rocketmq-dashboard: The state-of-the-art Dashboard of Apache RoccketMQ provides excellent monitoring capability. Various graphs and statistics of events, performance and system information of clients and applica…

mysql中创建计算字段

目录 1、计算字段 2、拼接字段 3、去除空格和使用别名 &#xff08;1&#xff09;去除空格 &#xff08;2&#xff09;使用别名&#xff1a;AS 4、执行算术计算 5、小结 1、计算字段 存储在数据库表中的数据一般不是应用程序所需要的格式&#xff0c;下面举几个例子。 …

【批量拆分PDF】批量按页码范围拆分PDF并按页码重命名:技术难题与总结

按照页码范围拆分PDF项目实战参考&#xff1a; 【批量个性化拆分PDF】批量拆分PDF只取PDF的首页&#xff0c;批量按照文件大小来拆分PDF&#xff0c;PDF按照目录页码范围批量计算拆分分割文件PDF个性化拆分&#xff08;单个拆分&#xff0c;取首页拆分&#xff0c;按页码计算拆…

MySQL表的增删改查(基础)-上篇

目录 CRUD 新增 查询 (1)全列查询 (2)指定列查询 (3)查询时指定表达式 (4)别名 (5)去重查询 (6)排序查询 (7)条件查询 (8)分页查询 CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写 新增 也可插入中文字符串 查询 (1)全列查…