uniapp实现一键登录

1、开通uni一键登录服务

1)需要登录DCloud开发者中心,申请开通一键登录服务。(注:已在开发者中心开发了项目应用获取appid)

2)进入基础配置配置相关的信息,我这个是已经配置好了,在获取用户手机号码时需要云服务用到的ApiKeyApiSecret可在这里获取

真机调试无需添加应用,如需打包使用请添加。一键登录应用ID为离线打包时配置的appid

3)添加服务空间

2、uni-app项目开通uniCloud服务

1)在uni-app项目中创建云开发环境,可阿里云或者腾讯云(我的是阿里云)

2)创建云函数,右键云开发环境创建

3)云函数使用

'use strict';
exports.main = async (event, context) => {
	// event里包含着客户端提交的参数
		const res = await uniCloud.getPhoneNumber({
			appid: 'xxxx', // 替换成自己开通一键登录的应用的DCloud appid,使用callFunction方式调用时可以不传(会自动取当前客户端的appid),如果使用云函数URL化的方式访问必须传此参数
			provider: 'univerify',
			apiKey: 'caf274f2f33c8715725f28ee5c755602', // 在开发者中心开通服务并获取apiKey
			apiSecret: '03f484268054c2b8f4cfb575ed5f2d89', // 在开发者中心开通服务并获取apiSecret
			access_token: event.access_token,
			openid: event.openid
		})
		// 这里已经成功获取手机号,访问后端接口处理
		const phone = res.phoneNumber
		const apiUrl = "xxxx" // 后端登录验证地址
		
		return await uniCloud.httpclient.request(apiUrl, {
		    method: 'POST',
		    data: {
		      phone: phone
		    },
		    contentType: 'json', // 指定以application/json发送data内的数据
		    dataType: 'json' // 指定返回值为json格式,自动进行parse
		  })
};

4)将云函数上传到云服务器(点击云函数右键上传)

5)项目配置(manifest.json中app模块的一键登录勾选)

3、项目开发

1)页面点击一键登录(客户端-预登录)

uni.preLogin({
					provider: 'univerify',
					success(res) { //预登录成功
					console.log('预登录成功'); 
						uni.login({
							provider: 'univerify',
							univerifyStyle: {
								"icon": {
									"path": "static/0105c858eeffaca8012049ef28010c.jpg" // 自定义显示在授权框中的logo,仅支持本地图片 默认显示App logo   
								},
							},
							success(res) { // 登录成功
								uniCloud.callFunction({
									name: 'get_phone_with_card_token', // 你的云函数名称
									data: {
										access_token: res.authResult
											.access_token, // 客户端一键登录接口返回的access_token
										openid: res.authResult.openid // 客户端一键登录接口返回的openid
									}
								}).then(res => {
									console.log(res);
									if (res.result.data.status == 0) {
										// 登陆失败操作
										console.log('登陆失败操作');
									} else {
										console.log('登陆成功操作');
										// 登陆成功操作
										uni.closeAuthView()
									}
								}).catch(err => {
									console.log("获取失败");
								})
							},
							fail(res) { // 登录失败
							}
						})
					},
					fail(res) { // 预登录失败
						// 不显示一键登录选项(或置灰)
						// 根据错误信息判断失败原因,如有需要可将错误提交给统计服务器
						console.log('失败', 2222);
						console.log(res.errCode)
						console.log(res.errMsg)
					}
				});

2)运行时可在云函数中查看日志(判断是否请求成功)

注)如果手机没有插入有效的sim卡,或者手机蜂窝数据网络关闭,都有可能造成预登陆校验失败。(所以运行测试时需要在有sim卡的真机上测试,使用数据线连接电脑和手机,将项目运行在手机上)
连接后可自动检测

原文链接https://blog.csdn.net/weixin_42373488/article/details/113182370

uni-app数据缓存

同步

读取: const value = uni.getStorageSync('storage_key');
写入: uni.setStorageSync('storage_key', 'hello');

异步

读取:
uni.getStorage({
    key: 'storage_key',
    success: function (res) {
        console.log(res.data);
    }
});
写入:
  uni.setStorage({
    key: 'storage_key',
    data: 'hello',
    success: function () {
        console.log('success');
    }
});