由于项目需要用到手机号一键登录

在manifest中配置

uniapp的一键登录需要用到云函数

所以去配置dcloud后台服务空间

https://unicloud.dcloud.net.cn/

去配置dcloud后台开通一键登录然后去申请应用

https://unicloud.dcloud.net.cn/pages/uni-login/app-config

然后去右键项目创建uniCloud云开发绑定刚才申请的服务空间

在里面的cloudfunctions中创建函数

index.js文件


'use strict';
exports.main = async (event, context) => {
  // event里包含着客户端提交的参数
  console.log("event:",event,context);
  const res = await uniCloud.getPhoneNumber({
  	appid: '', //填写你自己的appid
  	provider: 'univerify',
  	access_token: event.access_token,
  	openid: event.openid
  })
 
  console.log(res); // res里包含手机号
  // 执行用户信息入库等操作,正常情况下不要把完整手机号返回给前端
  // 如果数据库在uniCloud上,可以直接入库
  // 如果数据库不在uniCloud上,可以通过 uniCloud.httpclient API,
  // 将手机号通过http方式传递给其他服务器的接口,
  // 详见:https://uniapp.dcloud.net.cn/uniCloud/cf-functions?id=httpclient
  return {
    code: 0,
    message: '获取手机号成功',
    data:res
  }
}

选择公共模块

使用代码

// sim授权登录
	const goSimAuth = () => {
		if (!checkSelectAgreement('sim')) return;
		uni.getProvider({
			service: 'oauth',
			success: function(res) {
				console.log(res.provider, res.provider == 'univerify') // ['qq', 'univerify']
				if (~res.provider.indexOf('univerify')) {
					console.log("univerify:SIM一键登录",verifyButton.value) // ['qq', 'univerify']
					uni.login({
						provider: 'univerify',
						univerifyStyle: {
							fullScreen: true,
							backgroundColor: "#ffffff", // 授权页面背景颜色,默认值:#ffffff
							backgroundImage: "/static/imgs/loginIcon/univerify/univerify.png",
							icon: {
								"path": " ", // 自定义显示在授权框中的logo,仅支持本地图片 默认显示App logo
								"width": "0px", //图标宽度 默认值:60px
								"height": "0px" //图标高度 默认值:60px
							},
							closeIcon: {
								"path": " ", // 自定义显示在授权框中的logo,仅支持本地图片
								"width": "0px", //图标宽度 默认值:60px (HBuilderX 4.0+ 仅iOS支持)
								"height": "0px" //图标高度 默认值:60px (HBuilderX 4.0+ 仅iOS支持)
							},
							phoneNum: {
								"color": "#05110D" // 手机号文字颜色 默认值:#202020
							},
							slogan: {
								"color": "#05110D" //  slogan 字体颜色 默认值:#BBBBBB
							},
							authButton: {
								"normalColor": "#FF6B35", // 授权按钮正常状态背景颜色 默认值:#3479f5
								"highlightColor": "#FF6B35", // 授权按钮按下状态背景颜色 默认值:#2861c5(仅ios支持)
								"disabledColor": "#FF6B35", // 授权按钮不可点击时背景颜色 默认值:#73aaf5(仅ios支持)
								"textColor": "#ffffff", // 授权按钮文字颜色 默认值:#ffffff
								"title": "登录", // 授权按钮文案 默认值:“本机号码一键登录”
								"borderRadius": "8px" // 授权按钮圆角 默认值:"24px" (按钮高度的一半)
							},
							otherLoginButton: {
								"visible": true, // 是否显示其他登录按钮,默认值:true
								"normalColor": "", // 其他登录按钮正常状态背景颜色 默认值:透明
								"highlightColor": "", // 其他登录按钮按下状态背景颜色 默认值:透明
								"textColor": "#7B7B7B", // 其他登录按钮文字颜色 默认值:#656565
								"title": "短信验证码登录", // 其他登录方式按钮文字 默认值:“其他登录方式”
								"borderColor": "", //边框颜色 默认值:透明(仅iOS支持)
								"borderRadius": "0px" // 其他登录按钮圆角 默认值:"24px" (按钮高度的一半)
							},
							privacyTerms: {
								"defaultCheckBoxState": true, // 条款勾选框初始状态 默认值: true
								"isCenterHint": false, //未勾选服务条款时点击登录按钮的提示是否居中显示 默认值: false (3.7.13+ 版本支持)
								"uncheckedImage": "/static/imgs/loginIcon/univerify/wxz.png", // 可选 条款勾选框未选中状态图片(仅支持本地图片 建议尺寸 24x24px)(3.2.0+ 版本支持)
								"checkedImage": "/static/imgs/loginIcon/univerify/xz.png", // 可选 条款勾选框选中状态图片(仅支持本地图片 建议尺寸24x24px)(3.2.0+ 版本支持)
								"checkBoxSize": 12, // 可选 条款勾选框大小
								"textColor": "#969B9C", // 文字颜色 默认值:#BBBBBB
								"termsColor": "#1F2021", //  协议文字颜色 默认值: #5496E3
								"prefix": "我已阅读并同意", // 条款前的文案 默认值:“我已阅读并同意”
								"suffix": "并使用本机号码登录", // 条款后的文案 默认值:“并使用本机号码登录”
								"privacyItems": [ // 自定义协议条款,最大支持2个,需要同时设置url和title. 否则不生效
									{
										"url": "https://api.minihongyu.com/privacy/usageLicense.html", // 点击跳转的协议详情页面
										"title": "用户协议" // 协议名称
									},
									{
										"url": "https://api.minihongyu.com/privacy/privacyAgreement.html", // 点击跳转的协议详情页面
										"title": "隐私政策" // 协议名称
									}
								]
							},
							buttons: { // 自定义页面下方按钮仅全屏模式生效(3.1.14+ 版本支持)
								"iconWidth": "40px", // 图标宽度(高度等比例缩放) 默认值:45px
								"list": verifyButton.value
							}
						},
						success: function(res) {
							// 关闭授权弹窗
							uni.closeAuthView()
							// {openid:'登录授权唯一标识',access_token:'接口返回的 token'}
							// 登录成功
							console.log(res.authResult, "sim授权的信息")
							// return
							simAuth.value = res.authResult
							goUniCloudFunction()
						},
						fail: function(err) {
							if (err.code == '30008') {
								console.log(err.index)
								switch (err.index) {
									case 0: {
										// 苹果登录
										console.log('苹果登录')
										goAppleAuth();
										break;
									}
									case 1: {
										// 微信登录
										console.log('微信登录')
										goWechatAuth();
										break;
									}
									case 2: {
										// 抖音登录
										console.log('抖音登录')
										goTiktokAuth()
										break;
									}
									default: {
										console.log('不知道点的啥')
									}
								}
							} else if(err.code == '30005') {
								console.log("111请开启移动数据后再次使用")
								uni.showToast({
									title: err.metadata.desc+',请开启移动数据后再次使用',
									icon: "none"
								})
							}else{
								uni.closeAuthView();
							}
							// 登录授权失败
							console.log(err, "当前授权·失败了")
						}
					})
				}
			}
		});
	}
	// 上传云函数
	const goUniCloudFunction = () => {
		// simAuthPhone.value = '15881775851';
		// goSmiLoginApi();

		uniCloud.callFunction({
				name: "simLogingFunction", // 填写你自己的云函数名称
				//传入上面获取的openid和access_token获取手机号
				data: {
					access_token: simAuth.value.access_token, // 客户端一键登录接口返回的access_token
					openid: simAuth.value.openid // 客户端一键登录接口返回的openid
				}
			})
			.then((dataRes) => {
				//此处已经成功获取手机号等信息
				console.log("云函数返回的参数", dataRes)
				simAuthPhone.value = dataRes.result.data.phoneNumber;
				goSmiLoginApi();
				// 获取手机号后根据自己的需求做后面的登录操作即可
				//...
			})
			.catch((err) => {
				console.log(err);
				console.log("云函数报错", err)
				uni.showToast({
					title: err.errMsg,
					icon: "none"
				})
			})
	}
	// smi手机号一键登录授权 给后端传递获取到的unionid和openId还有手机型号的信息
	const goSmiLoginApi = async () => {
		let data = ref({
			phoneNumber: simAuthPhone.value,
			brand: systemInfo.value.brand,
			invitationCode: uni.getStorageSync('invitationCode') || ''
		})
		//#ifdef APP-PLUS
		data.value.deviceType = isIos.value ? 'IOS' : 'Android';
		// #endif
		//#ifndef APP-PLUS
		data.value.deviceType = 'PC';
		// #endif
		console.log(data.value, "上传");
		// return
		uni.showLoading({
			title: "加载中",
			mask: true,
		})
		try {
			const res = await request({
				url: `/app/logIn/simLogIn`,
				method: 'POST',
				data: data.value
			})
			uni.hideLoading()
			console.log(res, "当前接口返回回来的参数")
			if (res.code == 200) {
				uni.setStorageSync('userInfo', res.data)
				uni.setStorage({
					key: 'token',
					data: res.data.token,
					success: function() {
						uni.switchTab({
							url: '/pages/index/index'
						});
					}
				});
			} else {
				uni.showToast({
					title: res.data.msg,
					icon: 'none',
					duration: 2000
				});
			}
		} catch (err) {
			console.log(err, "sim登录失败")
			uni.showToast({
				title: err.data.message,
				icon: 'none',
				duration: 2000
			});
		}
	}

调试ios需要打包,安卓标准基座就可以

更多推荐