uni-app使用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控制台
代码如下:
-
;
-
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']
-
});
-
}
-
});
-
}
-
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhggeieh
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01