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

前面我出过两期博客关于小程序授权登录,利用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>

组件效果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第12章 项目质量管理(一)

博主2023年11月通过了信息系统项目管理的考试&#xff0c;考试过程中发现考试的内容全部是教材中的内容&#xff0c;非常符合我学习的思路&#xff0c;因此博主想通过该平台把自己学习过程中的经验和教材博主认为重要的知识点分享给大家&#xff0c;希望更多的人能够通过考试&a…

系统攻防-WindowsLinux远程探针本地自检任意代码执行权限提升入口点

知识点&#xff1a; 1、远程漏扫-Nessus&Nexpose&Goby 2、本地漏扫(提权)-Wesng&Tiquan&Suggester 3、利用场景-远程利用&本地利用&利用条件 一、演示案例-操作系统-远程漏扫-Nessus&Nexpose&Goby Nessus Nessus号称是世界上最流行的漏洞扫描…

2024年江苏事业单位招聘报名指南

江苏事业单位目前已出的公告中&#xff0c;扬州和常州的报名时间相对较早&#xff0c;2月27日就开始报名了&#xff1b;其他大多在2月28日或3月1日起开始报名。 报名请移步<江苏人事考试网> 【报名时间】 2月28日9:00-3月4日16:00#图文万粉激励计划# 【资格初审】2月28…

Shiro反序列化漏洞原理代码分析(3)

最终POC transform链POC 由于我们要序列化的对象是PriorityQueue&#xff0c;所以我们就先实例化一个该对象 并且赋初值 PriorityQueue priorityQueue new PriorityQueue(2);priorityQueue.add(1);priorityQueue.add(2); 由于我们最后要调用的是ChainedTransformer对象的tr…

ADS-B Ground Receiver Radarcape

目录 Radarcape ADS-B MLAT Receiver Web Browser User Interface Radarcape Technical Data Radarcape Software Features Radarcape Basics Radarcape ADS-B MLAT Receiver Radarcape is a professional ADS-B receiver made for 24/7 operation. High performance rec…

C# TesseractOCR识别身份证号

https://github.com/tesseract-ocr/tessdata 新建控制台项目并添加包 Tesseract和Tesseract.Drawing 下载训练的模型 地址 代码实现 using Tesseract;var filePath "F:\\Desktop\\韦小宝.png"; var exePath AppDomain.CurrentDomain.BaseDirectory; var …

敏捷开发中如何写好用户故事?

什么是用户故事&#xff1f; 用户故事&#xff08;user story&#xff09;是一个用来确认用户和用户需求的简短描述&#xff0c;作为什么用户&#xff0c;希望如何&#xff0c;这样做的目的或者价值何在。用户故事在软件研发中又被描述为需求。用户故事通常的格式为&#xff1…

人工智能、机器学习和生成式人工智能之间有什么区别?

文 | BFT机器人 在这个数字的智能时代&#xff0c;大家对人工智能、机器学习和生成式人工智能这些名词字眼很熟悉&#xff0c;有些人或许对它们还有一些了解&#xff0c;但是当他们一起出现的时候&#xff0c;大家能够区别它们是什么意思吗&#xff1f;今天小编将带你们详细解…

Spring6学习技术|事务

学习材料 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09; 事务 什么是事务&#xff1f;好像是数据库部分的词&#xff0c;我自己的理解是对数据库进行的操作序列&#xff0c;要么一起完成&#xff0c;要么都不完成…

vue-router4 (一)vite安装并构建项目

1、使用vite构建项目&#xff0c;cmd运行 npm init vitelatest 2、安装vue-router (Vue2安装对应的router3版本&#xff1b;Vue3 安装对应的router4版本) npm install vue-router -s 构建步骤截图如下&#xff1a; 注&#xff1a; vue2使用vetur vue3使用volar 这两个插件…

微信公众号关键词自动回复

今天主要给大家讲一下如何实现微信公众号关键词的自动回复功能&#xff0c;就如网站的文章而言&#xff0c;进行人机识别&#xff0c;需要关注公众号回复验证码获取到验证码从而展示文章内容&#xff0c;&#xff0c;具体效果如下图。 springboot 2.3.2RELEASE 1、微信公众平台…

Spring全面精简总结

Spring两大核心功能&#xff1a;IOC控制反转、AOP面向切面的编程 控制反转(loC&#xff0c;Inversion of Control)&#xff0c;是一个概念&#xff0c;是一种思想。指将传统上由程序代码直接操控的对象调用权交给容器&#xff0c;通过容器来实现对象的装配和管理。控制反转就是…

电感电流波形分析

电感电流波形分析 首先&#xff0c;当电感充电时候&#xff08;红色回路&#xff09;电感左右两端是左正右负 假设在初始状态下&#xff0c;电容两端电压是0V&#xff0c;可以看出来A点电位是400V&#xff0c;B和C两端电容也都是0V 根据电感表达式di/dtUL/L400V/L 所以看得出…

在Pycharm中运行Django项目如何指定运行的端口

方法步骤&#xff1a; 打开 PyCharm&#xff0c;选择你的 Django 项目。在菜单栏中&#xff0c;选择 “Run” -> “Edit Configurations...”。在打开的 “Run/Debug Configurations” 对话框中&#xff0c;选择你的 Django server 配置&#xff08;如果没有&#xff0c;你…

数据脱敏(八)静态脱敏

HuggingFists低代码平台提供Mysql,Postgresql,Oracle,ClickHouse等多种数据库连接插件及配套读写算子。提供ftp,sftp,百度盘&#xff0c;阿里云文件系统&#xff0c;腾讯文件系统等多种文件系统连接插件及配套读写算子。满足用户静态脱敏场景下各种数据源要求。 静态脱敏-数据库…

在Web UI上提交Flink作业

1&#xff09;任务打包完成后&#xff0c;我们打开Flink的WEB UI页面&#xff0c;在右侧导航栏点击“Submit New Job”&#xff0c;然后点击按钮“ Add New”&#xff0c;选择要上传运行的JAR包 JAR包上传完成&#xff0c;如下图所示 &#xff08;2&#xff09;点击该JAR包&…

新加坡大带宽服务器概览

随着全球互联网的迅猛发展&#xff0c;服务器作为支撑网络应用的重要基础设施&#xff0c;扮演着越来越重要的角色。新加坡&#xff0c;作为亚洲四小龙之一&#xff0c;其服务器市场也备受关注。特别是新加坡的大带宽服务器&#xff0c;更是受到了众多企业和个人的青睐。那么&a…

【网安合规】Rsyslog 开源日志服务器 - 快速收集企业网络日志,合规利器!

微信改版了&#xff0c;现在看到我们全凭缘分&#xff0c;为了不错过【全栈工程师修炼指南】重要内容及福利&#xff0c;大家记得按照上方步骤设置「接收文章推送」哦~ 文章目录&#xff1a; 0x00 前言简述 01.缘由 描述: 由于《信息安全技术网络安全等级保护基本要求[GB/T 222…

Nest.js权限管理系统开发(七)用户注册

创建user模块 先用nest的命令创建一个 user 模块&#xff0c; nest g res user 实现user实体 然后就生成了 user 模块,在它的实体中创建一个用户表user.entity.ts&#xff0c;包含 id、用户名、密码,头像、邮箱等等一些字段&#xff1a; Entity(sys_user) export class Us…

部署VUE+SpringBoot+nginx项目

本文是前端是vite element-plus 后端 springBoot 部署整个项目主要分为3个步骤&#xff0c; 1. 部署nginx&#xff0c;主要是配置nginx.conf 2.打包前端代码 3.打包后端代码 1.安装nginx 安装手顺&#xff1a; linux安装nginx_linux安装nginx需要gcc还是gcc-c-CSDN…