uniapp使用uniCloud实现手机号一键登录

uni-app手机号一键登录是DCloud联合个推公司推出的,整合三大运营商网关认证能力的服务。

通过运营商的底层SDK,实现App端无需短信验证码直接获取手机号,实现一键登录功能。手机一键登录 替换了短信验证登录的方式,消除有短信验证模式等待时间较长,操作繁琐和容易泄露的痛点。

  • 支持版本:HBuilderX 3.0+
  • 支持项目类型:uni-app的App端,5+App,Wap2App
  • 支持系统平台:Android、IOS
  • 支持运营商:中国移动、中国联通、中国电信

一、开通服务

登录DCloud开发者后台,找到“一键登录”,选择“基础配置”,开通一键登录功能。

二、添加应用

  • DCloud AppId:创建uniapp项目时,生成的ID,如 __UNI__XXXXXX
  • 应用名称:填写App名称即可
  • Android签名:打包时使用的包名
  • Android应用签名MD5:通过keytool工具自定义生成,也可以使用dcloud测试默认:BA:AD:09:3A:82:82:9F:B4:32:A7:B2:8C:B4:CC:F0:E9:F3:7D:AE:58。 建议自己生成
  • IOS BundleId:IOS打包时的包名,一般跟Android包名一样

提交申请后,如”开通服务“中图例,状态为”正常“,则审核通过。

三、充值

一键登录是一个收费项目,需要充值后使用。开发环境中,可以”连接本地云函数“实现登录功能。

四、安全配置

在一键登录中选择”安全配置“项,添加服务空间,系统提供uniCloud服务空间白名单安全配置,可以提高接口调用安全性,防止被他人盗用。

五、实现一键登录功能

5.1 创建云函数

创建云函数其实很简单,如果有不清楚的,可以参照前一篇文章中如何创建的:uni-app中使用uniCloud实现发送短信验证码(开通、配置、使用)

注:开发云函数或调用云函数,一定要先开通云空间

uniCloud云开发平台地址:uniCloud官网-web控制台

代码如下:

'use strict';
exports.main = async (event, context) => {
  // event里包含着客户端提交的参数
  const res = await uniCloud.getPhoneNumber({
  	appid: '_UNI_ABCDEFG', // 替换成自己开通一键登录的应用的DCloud appid
  	provider: 'univerify',
  	apiKey: 'xxx', // 在开发者中心开通服务并获取apiKey
  	apiSecret: 'xxx', // 在开发者中心开通服务并获取apiSecret
  	access_token: event.access_token,
  	openid: event.openid
  });
  
  return {
    code: 0,
    data: res,
    message: '获取手机号成功'
  }
}

5.2 客户端-请求登录授权

预登录操作可以判断当前设备环境是否支持一键登录。代码如下:

uni.preLogin({
	provider: 'univerify',
	success(){  //预登录成功
		// 显示一键登录选项
	},
	fail(res){  // 预登录失败
		// 不显示一键登录选项(或置灰)
    // 根据错误信息判断失败原因,如有需要可将错误提交给统计服务器
		console.log(res.errCode)
		console.log(res.errMsg)
	}
})
  • 如果当前设备环境不支持一键登录,此时应该显示其他的登录选项。
  • 如果手机没有插入有效的sim卡,或者手机蜂窝数据网络关闭,都有可能造成预登录校验失败。

预登录成功后,可以调用授权功能,根据用户操作及授权结果返回对应的回调,拿到access_token,代码如下:

uni.login({
	provider: 'univerify',
	univerifyStyle: { // 自定义登录框样式
    //参考`univerifyStyle 数据结构`
  },
	success(res){ // 登录成功
		console.log(res.authResult);  // {openid:'登录授权唯一标识',access_token:'接口返回的 token'}
	},
	fail(res){  // 登录失败
		console.log(res.errCode)
		console.log(res.errMsg)
	}
})

5.3 返回值

{
	"errMsg": "login:ok",
	"authResult": {
		"openid": "208E2FBE6EF64DF3B2D377D886EF2A14124262bfd7ae16465ea0f0634554dcee7636",
		"access_token": "ZGI4NjkxZWE4YjAyNGUzMjhiMmZiNDcwODBjYjc5MDF8fDJ8djJ8Mg=="
	}
}

5.4 客户端通过callFunction向uniCloud云端换取手机号信息

通过5.3中的返回值,通过执行云函数换取手机号信息,代码如下:

// 在得到access_token后,通过callfunction调用云函数
uniCloud.callFunction({
  name: 'xxx', // 你的云函数名称
  data: {
    'access_token': 'xxx', // 客户端一键登录接口返回的access_token
    'openid': 'xxx' // 客户端一键登录接口返回的openid
  }
}).then(res => {
  // res.result = {
  //   code: '',
  //   message: ''
  // }
  // 登录成功,可以关闭一键登录授权界面了
}).catch(err=>{
  // 处理错误
})

5.5 综合示例

以上 客户端整合后,如下代码所示:

methods: {
	//登录函数
	login(){
		let that = this;
		uni.preLogin({
			provider: 'univerify',
			success() {
				uni.login({
					provider: 'univerify',
					success: res => {
						if(res.errMsg=='login:ok'){
							//执行云函数
							uniCloud.callFunction({
								name: 'phoneNumber',
								data: {
									// 客户端一键登录接口返回的access_token
									access_token: res.authResult['access_token'],
									// 客户端一键登录接口返回的openid
									openid: res.authResult['openid']
								}
							}).then(res => {
								//关闭弹框事件
								uni.closeAuthView();
								if(res.result['code']==0){
									//获取的手机号
									//do somthing...
									console.log(res.result['phoneNumber']);
								}else{
									uni.showToast({
										icon: 'none',
										title: '授权失败~'
									});
								}
								//if end
							}).catch(msg => {
								//关闭弹框事件
								uni.closeAuthView();
								console.error(msg);
							});
						}else{
							//关闭弹框事件
							uni.closeAuthView();
							uni.showToast({
								icon: 'none',
								title: res['errMsg']
							});
						}
					},
					fail: res => {
						uni.showToast({
							icon: 'none',
							title: res['errMsg']
						});
					}
				});
			},
			fail: res => {
				uni.showToast({
					icon: 'none',
					title: res['errMsg']
				});
			}
		});
	}
}

以上仅供参考,更详细请访问官方文档:概述 | uni-app官网

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
根据提供的引用内容,uniapp微信小程序可以通过以下步骤实现手机号一键登录: 1.在uniapp项目中安装并引入wx-server-sdk模块,该模块可以用于调用云函数。 2.在云函数中使用wx-server-sdk模块的getPhoneNumber方法获取用户手机号码。 3.在小程序端使用wx.login方法获取用户的code。 4.将获取到的code和encryptedData、iv等信息传递给云函数。 5.在云函数中使用code、encryptedData、iv等信息调用微信提供的解密算法,获取用户的手机号码。 6.将获取到的手机号码返回给小程序端,实现一键登录功能。 以下是示例代码: 1.云函数代码: ```javascript const cloud = require('wx-server-sdk') cloud.init() const wxContext = cloud.getWXContext() const appid = 'your appid' // 替换成自己的appid const appsecret = 'your appsecret' // 替换成自己的appsecret const wxServerSDK = require('wx-server-sdk') wxServerSDK.init({ env: wxContext.ENV, appid: appid, secret: appsecret }) exports.main = async (event, context) => { const wxContext = cloud.getWXContext() const { code, encryptedData, iv } = event const session = await wxServerSDK.cloud.callFunction({ name: 'login', data: { code: code } }) const sessionKey = session.result.session_key const phone = await wxServerSDK.cloud.callFunction({ name: 'getPhoneNumber', data: { appid: appid, sessionKey: sessionKey, encryptedData: encryptedData, iv: iv } }) return phone.result } ``` 2.小程序端代码: ```javascript // 获取用户手机号码 getPhoneNumber: function (e) { wx.cloud.callFunction({ name: 'getPhoneNumber', data: { code: this.globalData.code, encryptedData: e.detail.encryptedData, iv: e.detail.iv }, success: res => { console.log(res.result) // TODO: 处理获取到的手机号码 }, fail: err => { console.error(err) } }) } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值