uni-app经验分享:完美解决uni-app编译APP-PLUS使用阿里云验证码(加载外部js实现滑动验证、图形验证)

发布于 1周前 作者 yuanlaile 来自 Uni-App

uni-app经验分享:完美解决uni-app编译APP-PLUS使用阿里云验证码(加载外部js实现滑动验证、图形验证) 先上最终效果图,H5 与 App对比:

https:https://www.itying.com/uniimg.php?url=https://img-cdn-tc.dcloud.net.cn/uploads/article/20210525/5ebbeab454453b70a64b6c3e6ddc17f1.jpeg

https:https://www.itying.com/uniimg.php?url=https://img-cdn-tc.dcloud.net.cn/uploads/article/20210525/3f3efc550630da58396d7efff70637af.jpeg

https:https://www.itying.com/uniimg.php?url=https://img-cdn-tc.dcloud.net.cn/uploads/article/20210525/f9edeb059cf936783076949dd3ba3bf7.jpeg

由于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])  
})

1 回复

在uni-app中集成阿里云验证码(如滑动验证和图形验证),通常涉及到在APP-PLUS环境中加载外部JS文件,并处理验证逻辑。以下是一个基本的实现步骤和代码示例,帮助你完美解决这一问题。

步骤概述

  1. 引入阿里云验证码SDK:首先,你需要从阿里云验证码控制台获取SDK文件,并放置在项目的合适位置。

  2. 在APP-PLUS环境下加载外部JS:使用uni-app提供的条件编译功能,确保仅在APP-PLUS环境下加载外部JS文件。

  3. 初始化验证码:在页面的onReadyonLoad生命周期中初始化验证码。

  4. 处理验证结果:根据用户操作,处理验证成功或失败的结果。

代码示例

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会回调successfail函数。

注意事项

  • 确保阿里云验证码SDK文件路径正确。
  • 根据实际需求调整SDK初始化参数。
  • 在APP-PLUS环境下进行充分测试,确保验证码功能正常工作。
  • 考虑到安全性,不要在前端暴露敏感信息。

通过上述步骤和代码示例,你应该能够在uni-app中完美集成阿里云验证码,实现滑动验证和图形验证功能。如果遇到具体问题,建议查阅阿里云验证码官方文档,或联系阿里云技术支持获取帮助。

回到顶部