uniapp的微信小程序授权头像昵称(最新版)

news2025/4/9 0:09:56

前面我出过两期博客关于小程序授权登录,利用php实现一个简单的小程序授权登录并存储授权用户信息到数据库的完整流程。无奈,小程序官方又整幺蛾子了。wx.getUserInfo接口收回,wx.getUserProfile接口也不让用。导致我的个人小程序:梦缘  的授权登录得改。所以,这篇博客专门针对授权登录中头像昵称的使用进行说明。内附源码

 1.问题定位

       lz的小程序:梦缘   技术栈是基于:php+uniapp+vant 写的,之前因为偷懒,没写后台管理,然后php用的也是tp5,没有走管理框架,导致后端代码不规范,后面就因为一些特殊原因,就重构了一下。然后也就理所当然的遇到了,授权登录头像昵称的问题

之前走的wx.getUserProfile,也能用,但是获取的头像都变成了灰色头像,昵称统一为微信用户。作为强迫症患者的我肯定是不允许的,所以,必须解决。但是之前的代码我又不想删,毕竟都是自己一行一行敲出来的,我更加偏向于加代码。

这是之前授权登录得代码,直接调用wx.getUserProfile即可。

2.解决思路

        前面提到过,之前的授权登录代码依旧是可以用的,只是头像和昵称统一是灰白色和微信用户。再结合前面官方说的,基础版本库的影响,基础版本库低于2.21.2,wx.getUserProfile返回的就是正常的头像昵称,高于2.21.2的话,就要使用昵称头像填写功能,把这两个值作为参数传递给后端。

 既然如此,我之前的代码就可以保留了,在传参时额外增加nicknameavatar参数即可。后端针对是否有这两个参数做针对性处理。而这两个参数就需要前端利用小程序昵称头像的填写来获取了。

3.源码解析

下面直接公布授权登录得代码:login.vue

这里通过动态的获取当前小程序基础库来决定是否调用微信的头像昵称填写功能。然后再统一调用授权登录接口。后端根据动态动态保存。

<template>
	<view>
	    <view>
	        <view class='header'>
	            <view class="userinfo-avatar">
	            	<open-data type="userAvatarUrl" lang="zh_CN" />
	            </view>
	        </view>
	
	        <view class='content'>
	            <view>申请获取以下权限</view>
	            <text>获得你的公开信息(昵称,头像等)</text>
	        </view>
	
	        <button class='bottom' type='primary' @click="login" v-if="ischeck" >
	            授权登录
	        </button>
			<button class='bottom' type='primary' @click="login_zheshow" v-else>
			    授权登录
			</button>
			<btnlogin :zheshow='zheshow' v-if="zheshow" />
	    </view>
	</view>
</template>

<script>
	import btnlogin from '@/components/butlogin/butlogin';
	const context = require("../../context/ggyzContext.js");
	export default {
		data() {
			return {
				code:'',
				ischeck:true,
				zheshow:false,
				nickname:"",
				avatar:"",
			}
		},
		components:{
			btnlogin
		},
		onShow() {
			var that=this;
			wx.login({
			  success(res) {
				console.log("code:",res.code);
			    if (res.code) {
					that.code=res.code;
			    } else {
			      console.log('登录失败!' + res.errMsg)
			    }
			  }
			})
			
			var {SDKVersion} = wx.getSystemInfoSync()
			// 判断是否支持getUserProfile()获取头像昵称
			var compareRes = this.compareVersion(SDKVersion, "2.21.2");
			// 不支持
			if (compareRes !== -1) {
			  console.log("不支持getUserProfile()获取头像")
			  this.ischeck = false;
			  return
			}
			// 支持
			console.log("支持getUserProfile()获取头像")
		},
		methods: {
			login_zheshow(){
				this.zheshow = true;
			},
			loset(Logon_Credentials){
				console.log(Logon_Credentials,'登录信息');
				this.avatar=Logon_Credentials.active;
				this.nickname=Logon_Credentials.nickname;
				this.login();
			},
			close(){
				this.zheshow=false;
			},
			/**
			 * 版本比较
			 * v1 >= v2 返回 0或1 否则 -1
			 * @param {String} v1
			 * @param {String} v2 
			 */
			compareVersion (v1, v2) {
			  v1 = v1.split('.')
			  v2 = v2.split('.')
			  const len = Math.max(v1.length, v2.length)
			 
			  while (v1.length < len) {
			    v1.push('0')
			  }
			  while (v2.length < len) {
			    v2.push('0')
			  }
			 
			  for (let i = 0; i < len; i++) {
			    const num1 = parseInt(v1[i])
			    const num2 = parseInt(v2[i])
			 
			    if (num1 > num2) {
			      return 1
			    } else if (num1 < num2) {
			      return -1
			    }
			  }
			 
			  return 0
			},
			login(){
				var that=this;
				wx.getUserProfile({
				      desc: '用于完善会员资料',
				      success: e => {
				        console.log("授权信息:",e);
				        //发起网络请求
				        context.request({
				          url: context.constant.url.login,
						  method:'POST',
				          data: {
				            encryptedData: e.encryptedData,
				            iv: e.iv,
				            code: that.code,
							nickname:that.nickname,
							avatar:that.avatar
				          },
				          success(res) {
							console.log(res.data);
							if(res.data.code==1){
								uni.setStorageSync('userInfo',res.data.data);
								uni.setStorageSync('token',res.data.data.token);
								uni.setStorageSync('loginFlag',{expireTime:res.data.data.expiretime})
								uni.switchTab({
									url:'/pages/my/my'
								})
							}else{
								setTimeout( () => {
									uni.showToast({
									title: res.data.msg,
									icon: "none",
								});
								setTimeout( () =>{
									wx.hideToast();
								},2000)
								},0);
							}
				          }
				        })
					  }
				})
			}
		}
	}
</script>

<style>
	page{
		background: #FFFFFF;
	}
.header {
    margin: 90rpx 90rpx 90rpx 50rpx;
    border-bottom: 1px solid #ccc;
    text-align: center;
    width: 650rpx;
    height: 300rpx;
    line-height: 450rpx;
	display: flex;
	justify-content: center;
	align-items: center;
}

.header .userinfo-avatar {
    width: 200rpx;
    height: 200rpx;
	margin-bottom: 80rpx;
}

.content {
    margin-left: 50rpx;
    margin-bottom: 90rpx;
}

.content text {
    display: block;
    color: #9d9d9d;
    margin-top: 40rpx;
}

.bottom {
    border-radius: 80rpx;
    margin: 70rpx 50rpx;
    font-size: 35rpx;
}
</style>

btnlogin.vue昵称填写组件:

tips:这里用到了vant的弹窗,记得uni-app项目是否引入了该组件库。别忘了在pages.json声明引用

<template>
	<view>
		<van-popup  position="bottom"  :show="zheshow1" round>
		<view class="zheshow" >
			<view class="cen_ter">
				<view class="box_At">
					<view class="box_At_text">获取您的昵称、头像、手机号</view>
					<view class="box_At_co">获取用户头像、昵称、手机号信息,主要用于完善个人资料,向用户提供更好使用体验</view>
					<view class="box_B" style="border-top:1px solid #f3f3f3 ;">
						<view class="acvter">头像</view>
						<button v-if="!active" class="acvter_all"  open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
							<view class="mast">请选择头像</view>
						</button>
						<view v-if="active" class="img"><image :src="active" ></image></view>
					</view>
					<view class="box_B">
						<view class="acvter">昵称</view>
						<input class="acvter_all"  type="nickname" :value="nickname" @blur="bindblur" placeholder="请输入昵称" />
					</view>
					<view class="Brn_S">
						<view class="btn_btns" @click="colse">取消</view>
						<button  class="btn" @click="btns" style="background-color: #22ac38 !important;color: #ffffff !important;">
							<view class="btns">保存</view>
						</button>
					</view>
				</view>
			</view>
		</view>
		</van-popup>
	</view>
</template>

<script>
	export default {
		props:['zheshow'],
		data() {
			return {
				on_zheshows:false,
				zheshow1:false,
				active:'',
				nickname:''
			}
		},
		mounted() {
			this.zheshow1=this.zheshow;
		},
		watch:{
			zheshow(zheshow,oldValue) {
				this.zheshow1=this.zheshow
			},
		},
		methods: {	
			colse(){
				console.log("取消")
				this.$parent.close();
			},
			onChooseAvatar(e) {
				let that = this
				uni.getFileSystemManager().readFile({
					filePath: e.detail.avatarUrl, //选择图片返回的相对路径
					encoding: "base64", 
					success: (res) => {
						let base64s = "data:image/jpeg;base64," + res.data
						that.active = base64s
					},
					fail: (res) => reject(res.errMsg),	                
				});
			},
			bindblur(e){this.nickname = e.detail.value},
			btns(e){
				if(this.active==''){
					uni.showToast({title:'请选择上传头像',icon:'none'})
					return
				}
				if(this.nickname==''){
					uni.showToast({title:'请填写昵称',icon:'none'})
					return
				}
				this.$parent.loset({nickname:this.nickname,active:this.active}) // 信息传递父组件中
			}
		}
	}
</script>

<style lang="scss" scoped>
	.zheshow{
		 width: 100%;height: 100%;background-color: rgba(0,0,0,0.3);position: fixed;top: 0;left: 0;
		 display: flex;align-items: center;align-items: flex-end;
		.mast{margin-top: 6rpx;}
		.Brn_S{width: 70%;height: 100rpx;display: flex;align-items: center;justify-content: space-between;margin: 10rpx auto;}
		.btn_btns{width: 300rpx;height: 80rpx;background: antiquewhite; display: flex;align-items: center;
		 justify-content: center; border-radius: 10rpx; margin-right: 70rpx;background-color:  #fafafa;color: #39B54A;}
		.imgs{position: absolute;right: 6%;width: 32rpx;height: 32rpx;}
		.img{width: 90rpx;height: 90rpx;border-radius: 50%;margin-left: 80rpx;image{width: 100%;height: 100%;border-radius: 50%;}}
		.cen_ter{
			width: 100%;height: 600rpx;border-top-left-radius: 30rpx;border-top-right-radius: 30rpx;background-color: #FFFFFF;
			display: flex;align-items: center;justify-content: center;
			.box_At{width: 90%;height: 92%;margin-top: 20rpx;display: flex;flex-direction: column;.box_At_text{font-weight: bold;font-size: 30rpx}
			.box_At_co{font-size: 28rpx;color: #ababab;margin-top: 24rpx;}
			.box_B{width: 100%;height: 120rpx;border-bottom: 1px solid #f3f3f3;display: flex;align-items: center;
			 margin-top: 12rpx;.acvter_all{font-size: 28rpx;color: #ababab;margin-left: 80rpx;}}
			.btn{width:300rpx;margin: 35rpx auto;height: 80rpx;display: flex;align-items: center;justify-content: center;
			 background-color: #39B54A;color: #FFFFFF;border-radius: 10rpx;font-size: 30rpx;}
		}}
	}
	button {
		border-radius: 30rpx;height: 80rpx !important;padding-left: 0!important ;
		padding-right: 0!important ; background-color: rgba(0,0,0,0) !important;color: #ababab !important;font-family: PingFang SC !important;
	}
	button:after {
	    top: 0;left: 0; border: 1px solid rgba(0,0,0,0) !important; -webkit-transform: scale(.5);
		transform: scale(.5); -webkit-transform-origin: 0 0; transform-origin: 0 0; box-sizing: border-box; border-radius: 10px;
	}	
</style>

组件效果:

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

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

相关文章

微服务-实用篇

微服务-实用篇 一、微服务治理1.微服务远程调用2.Eureka注册中心Eureka的作用&#xff1a;搭建EurekaServer服务Client服务注册服务发现Ribbon负载均衡策略配置Ribbon配置饥饿加载 3.nacos注册中心使用nacos注册中心服务nacos区域负载均衡nacos环境隔离-namespaceNacos和Eureka…

如何将本地项目上传到github上

将本地项目上传到github上有很多种方法&#xff0c;这里只讲述我认为最简单快捷的一种&#xff0c;先在github中创建一个仓库&#xff0c;接着在本地建文件夹&#xff0c;用命令行将项目推送到本地仓库&#xff0c;然后连接远程仓库&#xff0c;将本地项目推送到远程仓库上。要…

成功解决[!] CocoaPods could not find compatible versions for pod “sqflite“

当pod install时出现下面的错误&#xff1a; Analyzing dependencies [!] CocoaPods could not find compatible versions for pod "sqflite": In Podfile:sqflite (from .symlinks/plugins/sqflite/darwin)Specs satisfying the sqflite (from .symlinks/plugins…

【leetcode热题】杨辉三角 II

难度&#xff1a; 简单通过率&#xff1a; 41.1%题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个非负索引 k&#xff0c;其中 k ≤ 33&#xff0c;返回杨辉三角的第 k 行。 在杨辉三角中&#xff0c;每个数是它左上方和右上方的数的和。 示…

基于R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习技术应用

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…

就业班 2401--2.26 Linux Day5--进程管理一

一、权限扩展 文件权限管理之&#xff1a; 隐藏权限防止root误删除 文件属性添加与查看 [rootlinux-server ~]# touch file1 file2 file3 1.查看文件属性 [rootlinux-server ~]# lsattr file1 file2 file3 ---------------- file1 ---------------- file2 ----------------…

2024022601-数据库语言SQL

数据库语言SQL SQL的发展 1974年&#xff0c;由Boyce和Chamberlin提出 1975~1979&#xff0c;IBM San Jose Research Lab的关系数据库管理系统原型System R实施了这种语言 SQL-86是第一个SQL标准 SQL-89、SQL-92(SQL2)、SQL-99(SQL3) 非过程化语言 SQL语言进行数据库操作…

Android 框架设计模板

不同项目在使用该模板时多少会有出入&#xff0c;应以项目实际情况作为依据。 &#xff08;该文档可以 .md 格式存放于项目根目录&#xff0c;或编写到readme 中&#xff09; 项目描述 涉及如下方面 项目背景 &#xff08;可引用项目立项书&#xff09;项目需求 &#xff08…

小技巧:Nuxt处理全局组件的显示与隐藏

在Nuxt开发过程中&#xff0c;大家会遇到需要控制全局组件的显示与隐藏。比如说移动端的路由导航栏、头部的返回操作。。。 为了使切换页面的同时&#xff0c;确定是否展示全局组件&#xff0c;保证页面展示的平稳过渡。 下面是我在项目中用到一个办法&#xff0c;已实现。 …

formality:set_constant应用

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 往期文章链接: formality:形式验证流程 scan mode func的功能检查需要把scan mode设置成0。

petalinux烧写image.ub报错

xinlinx SDK烧写petalinux生成的BOOT.BIN和image.ub时&#xff0c;BOOT.BIN烧写正常&#xff0c;image.ub烧写报错如下 Erase Operation failed. INFO: [Xicom 50-44] Elapsed time 0 sec.ERROR: Flash Operation Failed串口助手操作擦除flash如图&#xff1a; 解决方法&am…

【自然语言处理四-从矩阵操作角度看 自注意self attention】

自然语言处理四-从矩阵操作角度看 自注意self attention 从矩阵角度看self attention获取Q K V矩阵注意力分数softmax注意力的输出再来分析整体的attention的矩阵操作过程从矩阵操作角度看&#xff0c;self attention如何解决问题的&#xff1f;W^q^ W^k^ W^v^这三个矩阵怎么获…

Visual Studio:Entity设置表之间的关联关系

1、选择表并右键-》新增-》关联 2、设置关联的表及关联关系并“确定”即可

ZTE E8820V2重启偶现5G wifi丢失问题

使用ZTE E8820V2设备时,发现设备在多次重启过程中会出现5G wifi信号丢失的情况。 1. 现象日志 使用老毛子固件,具体丢失时会出现相关log: 2. 问题原因: GPIO#19 是 PCIE reset 外,GPIO#26 也要 reset。 3. 解决方法: E8820V2/rt-n56u/trunk$ git diff linux-3.4.x…

AI一键生成原创文案,方法很简单!

AI一键生成原创文案&#xff0c;方法很简单&#xff01;你会不会觉得文案很难写&#xff1f;你会不会因为要写文案很烦恼&#xff1f;对于这些写作问题&#xff0c;在技术快速发展的今天&#xff0c;我们都可以迎刃而解了&#xff01;一键生成原创文案&#xff0c;它能帮助所有…

js 实战小案例

实战 时间 js 格式化时间 <script type"text/javascript">function formatDate(date) { let year date.getFullYear(); let month String(date.getMonth() 1).padStart(2, 0); // getMonth() 返回的月份是从0开始的&#xff0c;所以要加1&#xff0c;并…

如何用生成式AI创建食谱,解决五岁孩童挑食问题?

如何处理孩子挑食问题&#xff0c;对父母来说可能是一个挑战。这需要耐心、创造力和策略的结合。在深入具体策略之前&#xff0c;了解五岁儿童的口味偏好仍在发展中&#xff0c;他们的饮食行为受多种因素影响&#xff0c;包括气质、接触不同类型食物的程度以及父母对饮食的态度…

Mycat核心教程--mycat实战应用【一】

Mycat核心教程--mycat实战应用 一、MyCat概述1.1.Mycat 是数据库中间件1.2.为什么要用Mycat1.3.数据库中间件对比1.4.Mycat的官网1.4.1.Mycat的官网:[http://www.mycat.org.cn/](http://www.mycat.org.cn/)1.4.2.右上角下载里面有个文件下载服务&#xff0c;点进去发现无法访问…

高数考研 -- 公式总结(更新中)

1. 两个重要极限 (1) lim ⁡ x → 0 sin ⁡ x x 1 \lim _{x \rightarrow 0} \frac{\sin x}{x}1 limx→0​xsinx​1, 推广形式 lim ⁡ f ( x ) → 0 sin ⁡ f ( x ) f ( x ) 1 \lim _{f(x) \rightarrow 0} \frac{\sin f(x)}{f(x)}1 limf(x)→0​f(x)sinf(x)​1. (2) lim ⁡…

BUUCTF crypto做题记录(9)新手向

一、rsa2 得到题目代码如下&#xff1a; N 101991809777553253470276751399264740131157682329252673501792154507006158434432009141995367241962525705950046253400188884658262496534706438791515071885860897552736656899566915731297225817250639873643376310103992170…