Uni-App 快捷登录

news2024/11/30 0:48:52

uniapp 实现一键登录前置条件: 开通uniCloud, 开通一键登录功能参考的文档 :
官网 - 一键登录uniapp指南 : https://uniapp.dcloud.net.cn/univerify.html#%E6%A6%82%E8%BF%B0
官网 - 一键登录开通指南 : https://ask.dcloud.net.cn/article/37965
官网 - unicloud使用指南 https://uniapp.dcloud.net.cn/uniCloud/quickstart.html#
官网 - 一键登录uniCloud使用说明 https://uniapp.dcloud.net.cn/uniCloud/univerify.html#

一、开通阿里云服务

二、新建云函数getPhoneNumber

由于一键登录依赖 verify

 

编写云函数代码

'use strict'
const crypto = require('crypto')
exports.main = async (event, context) => {
	const res = await uniCloud.getPhoneNumber({
		provider: 'univerify',
		apiKey: '', // 在开发者中心开通服务并获取apiKey
		apiSecret: '', // 在开发者中心开通服务并获取apiSecret
		access_token: event.access_token,
		openid: event.openid
	})
	if(res.phoneNumber){
		return {
			code: 0,
			message: '获取手机号成功',
			data: res.phoneNumber
		}
	} else {
		return {
			code: result.data.code,
			message: result.data.msg,
			data: result.data.data
		}
	}
}

三、配置 uni-app项目

 

 

四、编写getPhoneLogin.js

export default{
	methods:{
		async oneClickLogin() {
			await this.preLogin(true)
			uni.login({
				provider: 'univerify',
				univerifyStyle: {
					fullScreen: false,
					backgroundColor: '#ffffff',
					otherLoginButton: {
						// 是否显示其他登录按钮
						visible: false
					},
					icon: {
						"path":"static/logo.png",
						"width":  "60px",
						"height": "60px" 
					},
					authButton: {
						normalColor: '#2dc8a1'
					},
					privacyTerms: {
						defaultCheckBoxState: false
					}
				},
				success(res) {
					uniCloud.callFunction({
						name: 'getPhoneNumber',
						data: {
							access_token: res.authResult.access_token,
							openid: res.authResult.openid
						}
					}).then(async (dataRes) => {
						if (dataRes.result.code == 0) {
							setTimeout(async () => {
								uni.closeAuthView()
							}, 1000)
						} else {
		                    uni.showToast({
								title: dataRes.result.message,
								icon: 'none'
							})
						}
					}).catch((err) => {
						uni.showModal({
							title: '登录失败',
							content: err.errMsg,
							showCancel: false,
							success() {
								uni.closeAuthView()
							}
						})
					})
				},
				fail(err) {
					if (err.errCode != 30002 && err.errCode != '30003' && err.errCode != '30006') {
						uni.showModal({
							title: '登录失败',
							content: err.errMsg,
							showCancel: false,
							success() {
								// 客户端关闭一键登录授权界面
								uni.closeAuthView()
							}
						})
					}
				}
			})
		},
		
		/**
		 * 预登录
		 * 1、预登录操作可以判断当前设备环境是否支持一键登录,如果能支持一键登录,此时可以显示一键登录选项,同时预登录会准备好相关环境,显著提升显示授权登录界面的速度。
		 * 2、如果当前设备环境不支持一键登录,此时应该显示其他的登录选项。
		 * 3、如果手机没有插入有效的sim卡,或者手机蜂窝数据网络关闭,都有可能造成预登录校验失败。
		 * @param Boolean isShowMsg: 是否显示错误提示
		 */
		preLogin(isShowMsg = false) {
			return new Promise((resolve, reject) => {
				uni.preLogin({
					provider: 'univerify',
					success() {
		                this.isOneClickLogin = true
						resolve(true)
					},
					fail(err) {
						// 如果手机没有插入有效的sim卡,或者手机蜂窝数据网络关闭,都有可能造成预登录校验失败。
		                this.isOneClickLogin = false
						if (isShowMsg && err.errMsg != 'login:ok') {
							// 不同运营商 返回的报错字段不同
							uni.showModal({
								title: '当前设备环境不支持一键登录',
								content: err.errMsg || err.metadata.resultMsg || err.metadata.error_data || err.metadata.resultDesc ||
									'请检查是否插入有效sim卡及开启蜂窝数据网络',
								showCancel: false
							})
						}
						resolve(false)
					}
				})
			})
		}
	}
}

也可成功后自己请求自己的 后台接口

async oneClickLogin() {
				await this.preLogin(true)
 
				uni.login({
					provider: 'univerify',
					univerifyStyle: {
						fullScreen: true,
						backgroundColor: '#ffffff',
						otherLoginButton: {
							// 是否显示其他登录按钮
							visible: false
						},
						authButton: {
							normalColor: '#2dc8a1'
						},
						privacyTerms: {
							// 条款勾选框初始状态
							defaultCheckBoxState: false,
							privacyItems: [{
									url: 'https://xxx/agreement.html',
									title: '用户服务协议'
								},
								{
									url: 'https://xxx/privacypolicy.html',
									title: '隐私政策'
								}
							]
						}
					},
					success(res) {
						uniCloud.callFunction({
							name: 'login',
							data: {
								access_token: res.authResult.access_token,
								openid: res.authResult.openid,
								serversUrl: '这里上传你的接口地址'
							}
						}).then(async (dataRes) => {
							if (dataRes.result.code == 0) {
                                // 这里写你登录成功后的逻辑 ...
 
								uni.showToast({
									title: '登录成功',
									icon: 'success'
								})
 
								uni.setStorageSync('token', dataRes.result.data.access_token)
 
								setTimeout(async () => {
									uni.closeAuthView()
									uni.navigateBack()
								}, 1000)
							} else {
                                uni.showToast({
									title: dataRes.result.message,
									icon: 'none'
								})
							}
						}).catch((err) => {
							uni.showModal({
								title: '登录失败',
								content: err.errMsg,
								showCancel: false,
								success() {
									uni.closeAuthView()
								}
							})
						})
					},
					fail(err) {
						if (err.errCode != 30002 && err.errCode != '30003' && err.errCode != '30006') {
							uni.showModal({
								title: '登录失败',
								content: err.errMsg,
								showCancel: false,
								success() {
									// 客户端关闭一键登录授权界面
									uni.closeAuthView()
								}
							})
						}
					}
				})
			},

四、配置参数(可自行配置)

{  
    "fullScreen": false, // 是否全屏显示,默认值: false
    "backgroundColor": "#ffffff",  // 授权页面背景颜色,默认值:#ffffff
    "backgroundImage": "", // 全屏显示的背景图片,默认值:"" (仅支持本地图片,只有全屏显示时支持)  
    "icon": {  
        "path": "static/xxx.png", // 自定义显示在授权框中的logo,仅支持本地图片 默认显示App logo
        "width":  "60px",  //图标宽度 默认值:60px
        "height": "60px"   //图标高度 默认值:60px
    },  
    "closeIcon": {  
        "path": "static/xxx.png" // 自定义关闭按钮,仅支持本地图片。 HBuilderX3.3.7+版本支持
    },  
    "phoneNum": {  
        "color": "#202020"  // 手机号文字颜色 默认值:#202020  
    },  
    "slogan": {  
        "color": "#BBBBBB"  //  slogan 字体颜色 默认值:#BBBBBB  
    },  
    "authButton": {  
        "normalColor": "#3479f5", // 授权按钮正常状态背景颜色 默认值:#3479f5  
        "highlightColor": "#2861c5",  // 授权按钮按下状态背景颜色 默认值:#2861c5(仅ios支持)  
        "disabledColor": "#73aaf5",  // 授权按钮不可点击时背景颜色 默认值:#73aaf5(仅ios支持)  
        "textColor": "#ffffff",  // 授权按钮文字颜色 默认值:#ffffff  
        "title": "本机号码一键登录", // 授权按钮文案 默认值:“本机号码一键登录”  
        "borderRadius": "24px"	// 授权按钮圆角 默认值:"24px" (按钮高度的一半)
    },  
    "otherLoginButton": {  
        "visible": true, // 是否显示其他登录按钮,默认值:true  
        "normalColor": "", // 其他登录按钮正常状态背景颜色 默认值:透明 
        "highlightColor": "", // 其他登录按钮按下状态背景颜色 默认值:透明 
        "textColor": "#656565", // 其他登录按钮文字颜色 默认值:#656565  
        "title": "其他登录方式", // 其他登录方式按钮文字 默认值:“其他登录方式”  
        "borderColor": "",  //边框颜色 默认值:透明(仅iOS支持)  
        "borderRadius": "0px" // 其他登录按钮圆角 默认值:"24px" (按钮高度的一半)
    },  
    "privacyTerms": {  
        "defaultCheckBoxState":true, // 条款勾选框初始状态 默认值: true
        "isCenterHint":false, //未勾选服务条款时点击登录按钮的提示是否居中显示 默认值: false (3.7.13+ 版本支持)
        "uncheckedImage":"", // 可选 条款勾选框未选中状态图片(仅支持本地图片 建议尺寸 24x24px)(3.2.0+ 版本支持)   
        "checkedImage":"", // 可选 条款勾选框选中状态图片(仅支持本地图片 建议尺寸24x24px)(3.2.0+ 版本支持)   
        "checkBoxSize":12, // 可选 条款勾选框大小
        "textColor": "#BBBBBB", // 文字颜色 默认值:#BBBBBB  
        "termsColor": "#5496E3", //  协议文字颜色 默认值: #5496E3  
        "prefix": "我已阅读并同意", // 条款前的文案 默认值:“我已阅读并同意”  
        "suffix": "并使用本机号码登录", // 条款后的文案 默认值:“并使用本机号码登录”  
        "privacyItems": [  // 自定义协议条款,最大支持2个,需要同时设置url和title. 否则不生效  
            {  
                "url": "https://", // 点击跳转的协议详情页面  
                "title": "用户服务协议" // 协议名称  
            }  
        ]  
    },
    "buttons": {  // 自定义页面下方按钮仅全屏模式生效(3.1.14+ 版本支持)
        "iconWidth": "45px", // 图标宽度(高度等比例缩放) 默认值:45px
        "list": [
            {
                "provider": "apple",
                "iconPath": "/static/apple.png" // 图标路径仅支持本地图片
            }, 
            {
                "provider": "weixin",
                "iconPath": "/static/wechat.png" // 图标路径仅支持本地图片
            }
        ]
    }
}

注意:写完后这个uniClound目录是跟我们前端代码放在一起的。云函数代码写完后需要上传部署到云服务空间。 

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

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

相关文章

如何使用JDBC操作数据库?一文带你吃透JDBC规范

文章目录 1. 前言2. JDBC 概述2.1 概念2.2 优点 3. JDBC 快速入门4. JDBC API详解4.1 DriverManager4.1.1 注册驱动4.1.2 获取连接 4.2 Connection4.2.1 获取执行sql的对象4.2.2 事务管理 4.3 Statement4.4 ResultSet4.5 PreparedStatement4.5.1 sql注入问题4.5.2 preparedStat…

不用动脑小白也能制作出精美的电子杂志

随着互联网技术的发展和微信的普及程度,电子杂志制作已经受到越来越多人的关注,毕竟电子杂志的阅读便利性是纸质杂志无法比拟的。那如何制作一本精美的电子杂志呢? 这其实很easy,可以使用在线电子杂志制作平台FLBOOK &#xff0c…

Linux使用挂载Windows共享文件夹

1、在linux下要挂载windows的共享文件,需要安装cifs-utils软件包。 dpkg -l|grep cifs-utils可以查看是否安装了这个软件包,which mount.cifs可以查看这个软件包安装在哪里。sudo apt-get install cifs-utils可以安装软件包。 2、建立一个目录用来作挂载…

AIR700 改变AIR530Z串口波特率

AIR530Z串口波特率默认9600,但实际应用中需要更高的波特率,可选波特率见下图。 主控采用合宙AIR700E核心板,通过UART1连接AIR530Z 合宙Luatos uart官方文档 主要问题 AIR700E要改变AIR530Z的波特率,在默认9600波特率情况下通过发…

跨境电商商城源码(支持多种支付方式+多语言+多货币+快速部署)

随着跨境电商的繁荣发展,支付方式的多样性已成为消费者和电商平台关注的焦点。本文将介绍一款支持多种支付方式的跨境电商源码,以提升用户的购物体验和平台的竞争力。 一、背景概述 近年来,跨境电商市场呈现出迅速增长的趋势。然而&#xff0…

建设城市展厅用的多媒体互动装置有哪些作用?

随着科技的迅速进步,智慧城市这一概念已经逐渐从理论走向现实,而智慧城市展厅则成为了集中展示智慧城市理念、技术和规划的重要场所,在其中发挥着重要的作用,并且还在建设这些展厅的过程中,应用了大量的多媒体互动装置…

fpmarkets总结的交易员5个阶段,您处在第几级

交易员的发展是一个逐步上升的阶梯式过程。总体上,这个过程被fpmarkets总结的五个阶段: 第一阶段,新手期。在这个阶段,新手交易者会接触到大量的市场工具和信息。主要目标是学习如何在市场中交易,同时避免产生亏损。许…

MySQL:至少参与xxx参与的全部事件(二)

MySQL:至少参与xxx参与的全部事件(二) – WhiteNights Site 标签:MySQL 本来不难的,结果实验课上又没能当场做出来。还是回到宿舍复盘才看到问题所在,令人感慨。 头歌例题 仔细审题 任务描述 创建一个名…

数据结构(超详细讲解!!)第二十节 数组

1.定义 1.概念 相同类型的数据元素的集合。 记作:A(A0,A1,…,Am-1) 二维数组可看作是每个数据元素都是相同类型的一维数组的一维数组。多维数组依此类推。 二维数组是数据元素为线性表的线性表。 A(A0,A1,……,An-1) 其中…

docker 下安装mysql8.0

在docker中查询mysql镜像 PS C:\Users\admin> docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation……

每个外贸人都有一颗不甘的心

是不是每个三十多岁的外贸人都有一颗不安现状的心?总是想挑战一下自己的极限或者是拓宽一下自己未知的领域? 最近遇到一个经常去各个国家参加展会来获取客户的外贸人,他的第一话题不是自己去展会的效果如何,也不是说自己现在做的…

更好看更好听的百元真无线耳机,BarbetSound Buds T60上手

现在的真无线蓝牙耳机已经很成熟了,选择也特别多,大家很容易找到适合自己的款式。我比较关注耳机在续航、音质等方面的表现,最近用的是来自BarbetSound的Buds T60,这款耳机轻巧便携,而且音质非常好,性价比十…

【LLM】预训练||两句话明白儿的底层原理

预训练鼻祖阶段:目前认为是Bert时期 从字面上看,预训练模型(pre-training model)是先通过一批语料进行训练模型,然后在这个初步训练好的模型基础上,再继续训练或者另作他用。这样的理解基本上是对的&#…

学习笔记|两组率卡方检验和Fisher确切法|适用条件|规范表达|《小白爱上SPSS》课程:SPSS第十五讲 | 两组率卡方检验和Fisher确切法怎么做?

目录 学习目的软件版本原始文档两组率卡方检验和Fisher确切法适用条件简述一、实战案例读数据: 二、统计策略三、SPSS操作四、结果解读第一,分组统计描述结果第二,卡方检验。 五、规范报告1、规范表格2、规范文字 学习目的 SPSS第十五讲 | 两…

Scala语言用Selenium库写一个爬虫模版

首先,我将使用Scala编写一个使用Selenium库下载yuanfudao内容的下载器程序。 然后我们需要在项目的build.sbt文件中添加selenium的依赖项。以下是添加Selenium依赖项的代码: libraryDependencies "org.openqa.selenium" % "selenium-ja…

Web APIs——节点操作

1、DOM节点 DOM节点:DOM树里每一个内容都称之为节点 节点类型: 元素节点 所有的标签 比如body、div属性节点 所有的属性 比如 href文本节点 所有的文本其他 2、查找节点 关闭二维码案例: 点击关闭按钮,关闭的是二维码的盒子&#…

Maven系列第10篇:设计你自己的maven插件【高手必备】

Maven默认提供了很多插件,功能也非常强大,但是如果我们想自己开发一些插件,比如自定义一款自动打包并且发布到服务器然后重启服务器的插件;或者定义一款插件自动打包自动运行打包好的构件。各种好玩的东西只要你能想到&#xff0c…

Python中表单的处理

目录 1. 表单的基本概念 2. 使用Flask处理表单 3. 表单验证 4. 数据存储 5. 使用数据库存储表单数据 6. 安全性考虑 总结 当我们谈论Web开发时,表单处理是一个不可避免的话题。表单是Web应用程序中用户输入数据的界面,而处理这些数据则是后端开发…

从零开始制作一个割草机器人

项目背景 为啥要做一个割草机器人呢?(个人因素:我梦想就是做一款人形机器人保护人类,解放人类) 基础准备:我们公司本身做过高精度,基于高精度的技术扩展到农机自动化驾驶。目前可以实现AB线拖…

【qemu逃逸】BlizzardCTF2017-strng

前言 虚拟机用户名:ubuntu 密码:passw0rd 一道入门题,看下启动脚本: ./qemu-system-x86_64 \-m 1G \-device strng \-hda my-disk.img \-hdb my-seed.img \-nographic \-L pc-bios/ \-enable-kvm \-device e1000,netdevnet0 \…