需求:由于公司一直都是直接用的阿里云一键登录,查看了uniapp官网,发现uni直接可以接入一键登录,但是需要额外购买对应的服务。最后找到了一个支持号码认证的SDK实现了一键登录

SDK链接:阿里云号码认证SDK - DCloud 插件市场

注意点:

一、要使用离线打包的方式,否则会报引入的插件不存在

下载插件解压后放置到项目下的插件目录内,要采用本地插件的方式。

android 阿里一键登录集成 阿里云一键登录_阿里云

二、进行自定义基座打包后可以使用真机运行测试

配置目录及manifest插件配置如下(请注意插件放置目录名的大小写)

android 阿里一键登录集成 阿里云一键登录_uni-app_02

三、打完自定义基座运行到真机时,请检查是否是选择的“自定义基座“,而不是“标准基座“!否则会报引入的插件不存在。

四、代码报错时请注意报错具体位置,因为有部分报错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>