uni-app经验分享:完美解决uni-app编译APP-PLUS使用阿里云验证码(加载外部js实现滑动验证、图形验证)
uni-app经验分享:完美解决uni-app编译APP-PLUS使用阿里云验证码(加载外部js实现滑动验证、图形验证) 先上最终效果图,H5 与 App对比:
由于uni-app除H5外 均不支持document、window等浏览器的js API,所以阿里云的验证码https://g.alicdn.com/AWSC/AWSC/awsc.js(dom操作) 无法在App中直接使用。
故改为web-view加载本地html文件做滑动校验操作,通过验证将sessionId token等参数传回vue页面,最终效果与h5一模一样,用户不会感知是web-view加载的验证。
vue 页面代码:
// 点击发送验证码判断是否为App
// #ifdef APP-PLUS
return this.appCreateVerify()
// #endif
// plus创建web-view方法
appCreateVerify() {
// 阿里云验证码 App打开本地verify页面(uni-app本地html存放在根目录/hybrid/html中)
if (wv) {
return wv.show()
}
wv = plus.webview.create('', 'custom-webview', {
'uni-app': 'none',
background: 'transparent',
webviewBGTransparent: true
}, {
appkey: this.nc.appkey,
scene: this.nc.scene
})
wv.loadURL('/hybrid/html/awsc-verify.html')
const currentWebview = this.$scope.$getAppWebview()
// 此处监听uni.postMessage传递参数
plus.globalEvent.addEventListener('plusMessage', msg => {
const result = msg.data.args.data
if(result.name == 'postMessage'){
this.querySendCode(result.arg)
}
})
currentWebview.append(wv)
},
// 发送验证码请求
querySendCode(data) {
if (this.sending) return // 阻止awsc或事件监听 重复触发问题
this.sending = true
LoginSendCode({
phone: this.form.phone,
...data,
scene: this.nc.scene
}).then(res => {
this.sending = false
if (!res.success) {
return uni.showToast({
title: res.msg,
icon: 'none'
})
}
uni.showToast({
title: '验证码发送成功'
})
this.second = 60
const timer = setInterval(() => {
this.second--
if (this.second <= 0) {
clearInterval(timer)
}
}, 1000)
})
},
本地html页面代码:
<style>...设置页面背景透明、滑动验证样式等...</style>
<script src="https://g.alicdn.com/AWSC/AWSC/awsc.js"></script>
<script src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.1.js"></script>
<script>
document.addEventListener('plusready', function() {
var wv = plus.webview.currentWebview()
// 阿里云滑动验证
window.AWSC.use('nc', function(state, module) {
window.nc = module.init({
appkey: wv.appkey,
scene: wv.scene,
renderTo: 'ncContainer',
success: function(data) {
uni.postMessage({
data
})
wv.hide()
window.nc.reset()
}
})
})
})
</script>
效果还算理想,由此可见其他类似的需要操作dom的功能都能如此实现,小程序同样可以使用 <web-view>
标签去实现类似功能
vue页面与本地html文件消息传输方式补充:
最近学到了新的消息传输方式,plus.globalEvent监听uni.postMessage推送的消息会出现重复推送等问题,建议改为Webview url拦截的方式获取html文件数据。
// html中跳转自定义url,会被拦截,不会进行跳转
window.location.href = 'push?params=loading'
// vue页面wv拦截url变更
wv.overrideUrlLoading({mode:'reject'}, e => {
var params = decodeURI(e.url.split('push?params=')[1])
})
在uni-app中集成阿里云验证码(如滑动验证和图形验证),通常涉及到在APP-PLUS环境中加载外部JS文件,并处理验证逻辑。以下是一个基本的实现步骤和代码示例,帮助你完美解决这一问题。
步骤概述
-
引入阿里云验证码SDK:首先,你需要从阿里云验证码控制台获取SDK文件,并放置在项目的合适位置。
-
在APP-PLUS环境下加载外部JS:使用uni-app提供的条件编译功能,确保仅在APP-PLUS环境下加载外部JS文件。
-
初始化验证码:在页面的
onReady
或onLoad
生命周期中初始化验证码。 -
处理验证结果:根据用户操作,处理验证成功或失败的结果。
代码示例
1. 引入SDK
将阿里云验证码SDK文件(如aliyun-captcha.js
)放置在项目的static
目录下。
2. 加载外部JS
在需要集成验证码的页面中,使用条件编译加载外部JS:
// #ifdef APP-PLUS
const captchaScript = document.createElement('script');
captchaScript.src = `${process.env.BASE_URL}/static/aliyun-captcha.js`;
captchaScript.onload = () => {
initCaptcha();
};
document.head.appendChild(captchaScript);
// #endif
3. 初始化验证码
定义一个initCaptcha
函数来初始化验证码:
function initCaptcha() {
// 假设aliyunCaptcha是SDK中暴露的全局变量
aliyunCaptcha.init({
// 配置参数,如appId, scene等,具体参考阿里云验证码文档
appId: 'your-app-id',
scene: 'your-scene',
success: (result) => {
console.log('验证成功', result);
// 处理验证成功逻辑
},
fail: (error) => {
console.error('验证失败', error);
// 处理验证失败逻辑
}
});
}
4. 处理验证结果
根据SDK提供的接口,处理用户操作触发的验证结果。例如,用户滑动验证后,SDK会回调success
或fail
函数。
注意事项
- 确保阿里云验证码SDK文件路径正确。
- 根据实际需求调整SDK初始化参数。
- 在APP-PLUS环境下进行充分测试,确保验证码功能正常工作。
- 考虑到安全性,不要在前端暴露敏感信息。
通过上述步骤和代码示例,你应该能够在uni-app中完美集成阿里云验证码,实现滑动验证和图形验证功能。如果遇到具体问题,建议查阅阿里云验证码官方文档,或联系阿里云技术支持获取帮助。