需求:由于公司一直都是直接用的阿里云一键登录,查看了uniapp官网,发现uni直接可以接入一键登录,但是需要额外购买对应的服务。最后找到了一个支持号码认证的SDK实现了一键登录
SDK链接:阿里云号码认证SDK - DCloud 插件市场
注意点:
一、要使用离线打包的方式,否则会报引入的插件不存在
下载插件解压后放置到项目下的插件目录内,要采用本地插件的方式。
二、进行自定义基座打包后可以使用真机运行测试
配置目录及manifest插件配置如下(请注意插件放置目录名的大小写)
三、打完自定义基座运行到真机时,请检查是否是选择的“自定义基座“,而不是“标准基座“!否则会报引入的插件不存在。
四、代码报错时请注意报错具体位置,因为有部分报错HBuilderX不会提示报错的具体位置。
五、不需要开启manifest里面的一键登录功能,走的不是DCloud的官方API
代码:
<template>
<view class="content">
</view>
</template>
<script>
var aLiSDKModule = uni.requireNativePlugin('AliCloud-NirvanaPns')
console.log(aLiSDKModule)
let platform = uni.getSystemInfoSync().platform
// sdkInfo 是从阿里云控制台获取的秘钥
const sdkInfo ='*****......'
aLiSDKModule.setAuthSDKInfo(sdkInfo)
import {
postToken,
getUserInfo
} from '@/api/api.js'
export default {
data() {
return {
authUiConfig: "",
}
},
onLoad() {
uni.showLoading({
title: "Loading"
})
aLiSDKModule.accelerateLoginPage(5000, result => {
if ("600000" == result.resultCode) {
console.log("加速成功")
} else {
uni.hideLoading()
uni.showToast({
title: "一键登录超时,建议采用验证码登录!",
duration: 1000,
icon: 'none'
})
uni.navigateTo({
url: '/subpkg/code_login/code_login'
})
}
})
aLiSDKModule.getLoginToken(
5000,
this.authUiConfig,
tokenResult => {
if ("600001" == tokenResult.resultCode) {
console.log("授权页拉起成功")
uni.hideLoading()
} else if ("600000" == tokenResult.resultCode) {
console.log(tokenResult)
// 拿着获取到的tokenResult.token传给后端获取userToken
uni.hideLoading()
const data = {
joinType: "***",
access_token: tokenResult.token,
}
//后端给的获取userToken的方法
postToken(data).then(res => {
console.log(res)
const userToken = res.info.userToken
uni.setStorageSync('userToken', userToken)
//获取用户信息的方法
this.getUserInfo(userToken)
aLiSDKModule.quitLoginPage()
}).catch(err => {
console.log(err)
})
// console.log("获取Token成功,接下来拿着结果里面的Token去服务端换取手机号码,SDK服务到此结束")
//手动关闭授权页
// aLiSDKModule.quitLoginPage()
} else {
//其他失败情况,手动关闭授权页
aLiSDKModule.quitLoginPage()
}
},
clickResult => {
switch (clickResult.resultCode) {
case "700000":
console.log("用户点击返回按钮")
uni.switchTab({
url: '/pages/home/home'
})
break
case "700001":
console.log("用户切换其他登录方式")
uni.navigateTo({
url: '/subpkg/code_login/code_login'
})
break
case "700002":
console.log("用户点击登录按钮")
break
case "700003":
console.log("用户点击checkBox")
break
case "700004":
console.log("用户点击协议")
break
}
},
customUiResult => {
//这里回调的是自定义控件的点击事件,通过 customUiResult.widgetId 来识别自定义控件,然后做一些自己的处理
}
)
},
onShow() {},
methods: {
// 获取用户信息
getUserInfo(userToken) {
const data = {
userToken: userToken,
...
}
getUserInfo(data).then(res => {
var decryptStr = new Buffer(res.info.phone, 'base64').toString('utf8')
uni.setStorageSync('loginFlag', true)
uni.setStorageSync('phone', decryptStr)
uni.showToast({
title: "登陆成功",
})
uni.switchTab({
url: '/pages/home/home'
})
console.log("用户信息为:" + res)
}).catch(err => {
console.log(err)
})
},
}
}
</script>
<style>
</style>