uniapp微信一键登录微信授权

news2024/12/23 19:37:05

前言

现在小程序逐渐成为主流,常用的微信授权登录很重要很常见的一个功能,今天自己总结了一下。

准备工作

1.如果你想自己想试一下这个功能首先你需要有一个开发中的项目并且你在开发成员里面。
2.配置自己的微信开发者工具的appid码
3.在hbuilderx的manifest.json中配置appid码

整体思路

1.登录流程
(1). 我们需要使用uniapp官网的api中的uni.getUserInfo(OBIECT)获取用户信息
(2).使用uniapp总api的uni.login()api进行登录获取信息
(3).编写前端请求后端的接口(微信一键登录的接口)
把uni.login接口返回的code给后端
后端会返回一个code码,其中这个code码会判断当前用户是否注册过,如果是60003(每个后端传递的code不同):没有注册如果是200:注册了
(4).code码是60003的时候我们需要让用户去注册
调用后台给的注册接口,需要把我们通过uni.getUserInfo(OBJECT)获取到的用户信息传递给后端,如果注册成功了后端就会返回一个成功的code码200,然后进入下一步
(5).code码是200的时候,需要进行判断是否绑定了手机号
要把用户的token保存下来,因为后面有很多地方要用到,判断用户是否绑定了手机号,我们登录时发送请求后端会给一个响应,通过判断响应信息中的某一个值来判断是否绑定了手机号,这里是判断返回值中的res.data.member,mobile

代码

代码是用hbuilderx进行编写的创建了一个小程序项目
结构如下:
在这里插入图片描述

首页index代码,主要即使为了写一个按钮进行跳转到登录页,下面的样式是自动生成的

<template>
	<view class="content">
		<image class="logo" src="/static/logo.png"></image>
		<view class="text-area">
			<text class="title">{{ title }}</text>
			<text @click="login">登录页面</text>
		</view>
	</view>
</template>

<script>
export default {
	data() {
		return {
			title: 'Hello'
		};
	},
	onLoad() {},
	methods: {
		login() {
			uni.navigateTo({
				url: '/pages/login/login'
			});
		}
	}
};
</script>

<style>
.content {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
}

.logo {
	height: 200rpx;
	width: 200rpx;
	margin-top: 200rpx;
	margin-left: auto;
	margin-right: auto;
	margin-bottom: 50rpx;
}

.text-area {
	display: flex;
	justify-content: center;
}

.title {
	font-size: 36rpx;
	color: #8f8f94;
}
</style>

登录页代码,微信登录,还有绑定手机号的跳转页面

<template>
	<view>
		<text>登录页</text>
		<button @click="wxlogin">微信登录</button>
		<button @click="showMobile">绑定手机号</button>
	</view>
</template>

<script>
export default {
	data() {
		return {
			registerDate: {} //存储用户数据用于用户注册微信
		};
	},
	methods: {
		wxlogin() {
			let that = this;
			//先获取用户的信息
			uni.getUserInfo({
				desc: '登录的数据',
				success(ures) {
					console.log(ures, '返回的用户信息');
					//这个地方的用户信息无论登录成功失败都可以拿到,只是拿到用户的信息
					//在成功的回调中去使用微信登录
					uni.login({
						provider: 'weixin', //使用微信登录
						success(lres) {
							console.log(lres, '请求微信登录返回的数据');
							//我们要根据上面获取的code码去作为请求参数发送给后端
							let params = {
								code: lres.code
							};
							//这里需要使用自己封装的接口 loginByWechat
							loginByWechat(params).then(res => {
								console.log(res, '微信一键登录返回的数据');
								/* 思路
								1.返回的数据可能是成功可能是失败
								2.失败的情况如果是 用户没有注册微信我们需要去执行其他操作
								3.把我们拿到的用户信息携带者去注册微信页面,注册成功后后端返回成功code码
								4.当code==200的时候也就是成功的时候
								5.成功但是一些属性为空,用户注册了微信但是没有绑定手机号应该跳转绑定手机号页面
								*/
								if (res.cdoe == '后台返回的错误码') {
									//当前用户没有注册 每个后端设置的错误码不同,根据接口文档
									//这一步需要我们拿到用户的数据去注册 在data中声明一个对象存储用户数据
									that.registerDate = {
										unionId: res.data.unionId ? res.data.unionId : res.data.openid, //开放平台ID
										openId: res.data,
										openid,
										sessionKey: res.data.sessionKey,
										signature: ures.signature, //签名
										rawData: ures.rawData, //原始数据
										encryptedData: ures.encryptedData, //加密数据
										iv: ures.iv //偏移量
									}; //这里的数据基本都是这些,只不过可能变量名不一样
									that.register(); //跳转注册页面
								}
								//当前用户注册了
								else if (red.code == '200') {
									//判断注册了 有没有绑定手机号
									that.mobile(res.data); //
									//这个地方可以把下面的函数直接这里 我这里是方便以后修改所以当都封装一下
								}
							});
						}
					});
				}
			});
		},
		//注册微信
		register() {
			let params = this.registerDate;
			//发送请求注册 wechatRegister自己封装的请求接口
			wechatRegister(params).then(res => {
				console.log(res, '是否注册');
				if (res.code == '200') {
					console.log('注册成功');
				} else {
					console.log('注册失败,重新注册!');
				}
			});
		},
		mobile(data) {
			//保存用户的token
			uni.setStorageSync('token', data.token); //同步的 异步的是setStoreage()
			// 判断用户是否绑定了手机号
			if (!data.member.mobile) {
				//没有绑定就应该去帮的那个手机号的页面
				this.showMobile(); //这个函数用来处理绑定手机号
				return;
			}
			//如果用户绑定了手机号就跳转项目的页面
			uni.switchTab({
				//跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
				url: '/pages/index/index'
			});
		},
		//去绑定手机号的页面
		showMobile() {
			uni.showModal({
				title: '提示', //提示框标题
				content: '根据国家相关规定,登陆需要绑定手机号', //提示框内容
				confirmText: '去绑定', //提示框的按钮
				success(res) {
					console.log(res);
					//这个地方res 会有一个属性是confirm:true 如果是true就是点击了去绑定,cancel是false就是点击了取消
					if (res.confirm) {
						//用户点击了去绑定
						uni.navigateTo({
							url: '/pages/bindPhone/bindPhone' //注册的页面
						});
					} else if (res.cancel) {
						//点击了取消
						//不绑定手机直接清除用户的登录状态让其无法进入小程序
						uni.removeStorageSync('token');
					}
				}
			});
		}
	}
};
</script>

<style></style>

绑定手机号,但是这个地方倒计时没有做

<template>
	<view>
		<!-- 绑定手机号页面 -->
		<text>绑定手机号</text>
		<view class="">
			<view class="">+86</view>
			<input type="number" placeholder="请输入手机号" v-model="phone" />
		</view>
		<view class="">
			<view class=""><input type="number" placeholder="请输入验证码" v-model="code" /></view>
			<view class="" @click="sendCode">
				<button type="primary">{{ btnContent }}</button>
			</view>
		</view>
		<button @click="bindTap">绑定</button>
	</view>
</template>

<script>
export default {
	data() {
		return {
			phone: '',
			code: '',
			btnContent: '获取验证码'
		};
	},
	methods: {
		//获取验证码
		sendCode() {
			let key = 'MODIEFY_MOBILE'; //这个是每个公司后端为了分别发送的是哪一种请求是修改密码 还是绑定手机号还是找回密码
			//发送请求  sendMessage自己封装的请求接口
			// Encrypt 这个是aes加密
			sendMessage({
				mobile: Encrypt(this.phone),
				key
			}).then(res => {
				console.log('短信是否发送成功', res);
			});
		},
		//绑定手机号
		bindTap() {
			updateMobile({
				mobile: Encrypt(this.phone),
				captcha: this.code
			}),
				then(res => {
					console.log(res, '绑定手机号');
					if (res.data.code == '200') {
						// 绑定成功了就跳转首页
						uni.navigateTo({
							url: '/pages/index/index'
						});
					}
				});
		}
	}
};
</script>

<style></style>

总结

以上就是微信登录的全部流程,可能有一些地方有问题但是整体流程是没错的。还是那句话代码代码千千万,适合自己最重要

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

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

相关文章

echarts 如何实现图例单个数据项加上背景颜色和饼图中的背景图自适应

需求: 实现效果如下: ECharts中,可以通过设置legend中的formatter属性来自定义图例项的显示格式。以下是一个示例: option = {// ...legend: {data: [A, B, C],formatter: function (name) {var color = #fff;if (name === A) {color = #ff0000; // 设置A的背景颜色为红色…

如何使用ArcGIS计算容积率

字段计算 为建筑图层新建一个area字段&#xff0c;用于记录单层建筑的面积&#xff0c;如下图所示。 单层建筑面积 为建筑图层新建一个areaAll字段&#xff0c;用于记录总建筑面积&#xff0c;areaAllarea*floor&#xff0c;如下图所示。 计算总面积 为小区图层新建一个area…

chatgpt赋能python:Python大于0的SEO

Python大于0的SEO Python是一种高级编程语言&#xff0c;被广泛用于数据科学、机器学习、Web应用程序和网络爬虫等领域。Python大于0的SEO是指使用Python编写程序来优化网站的排名。在本文中&#xff0c;我们将介绍Python大于0的SEO的基础知识和一些实用技巧。 什么是Python大…

【redis基础】哨兵

hi,这里是redis系列文章&#xff0c;本篇是【redis基础】哨兵&#xff0c;上一篇链接&#xff1a;【redis】redis主从复制_努力努力再努力mlx的博客-CSDN博客 目录 概念 作用 如何使用哨兵&#xff08;案例演示实战步骤&#xff09; redis sentinel架构提前说明 重点参数…

【Java】Java(四十九):注解及自定义注解

文章目录 什么是注解&#xff1f;概述注解的作用自定义注解注解的定义格式带有属性的注解 注解的使用注解的使用格式 元注解元注解的作用&#xff1a;常用元注解&#xff1a; 注解解析 什么是注解&#xff1f; 注解(Annotation)也称为元数据&#xff0c;是一种代码级别的说明注…

数据库管理-第八十期 Exadata to RAC(x86) ADG(20230605)

数据库管理 2023-06-05 第八十期 Exadata to RAC(x86) ADG1 环境2 搭建流程2.1配置静态监听-主库2.2配置静态监听-备库2.3配置本地命名-主备库2.4数据库配置-主库2.5生成参数文件和密码文件-主库2.6创建目录并上传密码文件-备库2.7添加数据库服务-备库2.8修改参数文件-备库2.9复…

超级智能的治理

原文链接&#xff1a;https://openai.com/blog/governance-of-superintelligence#SamAltman 作者丨Sam Altman&#xff0c;Greg Brockman&#xff0c;Ilya Sutskever 译者 | Ted Liu 审校 | LsssY 编辑丨肖钰雯 现在是开始思考超级智能治理的好时机--未来的人工智能系统甚至比通…

基于SpringBoot+vue的租房网站设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

Python中的Time和DateTime

Python在处理与时间相关的操作时有两个重要模块&#xff1a;time和datetime。在本文中&#xff0c;我们介绍这两个模块并为每个场景提供带有代码和输出的说明性示例。 time模块主要用于处理时间相关的操作&#xff0c;例如获取当前时间、时间的计算和格式化等。它提供了一些函数…

老胡的周刊(第093期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 dm-ticket[2] 大麦网自动购票, 支持 docker …

4、数据库:MySQL部署 - 系统部署系列文章

MySQL数据库在其它博文中有介绍&#xff0c;包括学习规划系列。今天就讲讲MySQL的部署事情。 一、先下载MySQL数据库&#xff1b; 到下面这个网址去下载数据库&#xff0c;这里下载的社区版&#xff1a; https://dev.mysql.com/downloads/installer/ 二、安装数据库&#xff1b…

读改变未来的九大算法笔记04_公钥加密

1. 加密的目的就是传输秘密 2. 分块密码&#xff08;Block Cipher&#xff09;的现代加密技术使用了相加把戏的变体 2.1. 加法得出的结果能用于统计分析&#xff0c;这意味着一些人能通过分析你的大量加密消息来得到密钥 2.2. 任何知道密钥的人都能用相反的步骤运行所有操作…

MathType7中文标准版数学公式编辑工具

MathType 是一款专业的数学公式编辑工具,提供交互式编辑器&#xff0c; 让你在编辑数学试卷、书籍、报刊、论文、幻灯演示等文档轻松输入各种复杂的数学公式和符号。当您准备坐下来撰写科学或技术论文&#xff0c;测试&#xff0c;幻灯片演示文稿或任何想要包括数学符号的地方时…

互联网野蛮生长,但金三银四好像消失了!

每次看到程序员字眼&#xff0c;就是秃头&#xff0c;肥胖&#xff0c;宅男、996&#xff0c;程序员&#xff0c;但是耐不住工资高啊&#xff01;但只有程序员才知道&#xff0c;干IT的&#xff0c;都有一个自己的程序员梦&#xff0c;梦想着能用 “代码改变世界”。 代码能不…

音视频实战开源项目学习第二期!

前言&#xff1a; 大家好&#xff0c;今天继续分享音视频开源学习第二期&#xff0c;在前面的一期里面&#xff0c;我已经给大家演示了如何去跑起这个开源项目&#xff0c;包括源码下载&#xff1b; 音视频实战开源项目学习第一期&#xff01; 今天继续来讲解这个开源项目。 不…

chatgpt赋能python:Python多行连一行:简便省事的代码优化方法

Python多行连一行&#xff1a;简便省事的代码优化方法 在Python编程中&#xff0c;经常会遇到多行代码的情况&#xff0c;这不仅降低了代码的可读性&#xff0c;也增加了调试的难度。为了解决这个问题&#xff0c;Python提供了多行连一行&#xff08;以反斜杠\结尾&#xff09…

Mocha AE:工具栏

Mocha AE 工具栏&#xff08;经典模式&#xff09;中的工具及视图选项。 保存 Save the project 保存项目 快捷键&#xff1a;Ctrl S 选取类工具 Pick Tool 选取工具 --Marquee Selection 矩形框选 --Lasso Selection 套索选取 Move inner and edge points 移动内部点和边缘…

YOLOv8 训练自己的数据集

本范例我们使用 ultralytics中的YOLOv8目标检测模型训练自己的数据集&#xff0c;从而能够检测气球。 #安装 !pip install -U ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple import ultralytics ultralytics.checks() 一&#xff0c;准备数据 公众号算法美食屋后…

JavaScript之DOM(九)

JavaScript之DOM 1、节点类型2、常用的属性与方法2.1、访问节点的常用方法2.2、增删改节点的常用方法2.3、class的常用方法2.4、css相关操作 DOM – Document Object Model (文档对象模型)&#xff0c;是 JS 操作 HTML 文档的接口&#xff0c;它最大的特点就是将文档表示为节点…

CloudQuery一体化数据库SQL操作安全管控平台

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; CloudQuery一体化数据库SQL操作安全管控平台 导读 CloudQuery作为业界领先的面向企业的数据库安全解决方案&#xff0c;CloudQuery致力于打造一站式安全可靠的数据操…