Vue中使用腾讯滑块验证码

前言

为了防止黑客恶意注册,之前使用了图片验证码做了预防,后面了解到可以使用图片识别技术,因此需要接入滑动验证,选择的是腾讯的滑块验证。

原理图

简单的画了一张草图,就是借助了第三方实现了验证的准确性。
在这里插入图片描述

申请

登录腾讯云后台,进入控制台,
在这里插入图片描述
新建验证
在这里插入图片描述
主要是使用到下面这两个参数
在这里插入图片描述

前端

引入js

<script src="https://ssl.captcha.qq.com/TCaptcha.js"></script>

放一个激活元素button

<button id="TencentCaptcha"
        data-appid="申请的APPID"
        data-cbfn="callback"
>验证</button>

滑动滑块后的回调方法

window.callback = function(res){
    console.log(res)
    // res(用户主动关闭验证码)= {ret: 2, ticket: null}
    // res(验证成功) = {ret: 0, ticket: "String", randstr: "String"}
    if(res.ret === 0){
        alert(res.ticket)   // 票据
    }
}

本来想的是在回调函数中成功以后,把按钮的字变为验证成功,但是
因为框架使用的是vant,里面使用Jq设置样式不成功。因此做了如下改动:
触发容器改成如下:
在这里插入图片描述
忽略上面除引入js那一步的操作,使用定制接入, js如下

var captcha1=   new TencentCaptcha(
                        document.getElementById('TencentCaptcha'),
                        'appid',
                        function(res) {
                          //这里的res就是你滑动成功后,腾讯服务器返回给你的消息,包含了需要到服务器端验证的字符串。
                                    randstr:res.randstr,
                                    ticket:res.ticket
                             if(res.ret==0){

                                axios.post('', {
                                 
                                }).then(function (response) {
                                    const obj = response.data;
                                });
                            }
                        },
                        { bizState: '自定义透传参数' }
                    );
                    captcha1.show(); // 显示验证码

服务端验证

           $ticket = input('ticket');
                $post_data = [
                    'aid' => '申请截图中第一个参数',
                    'AppSecretKey' => '申请截图中的第二个参数',
                    'Ticket' => $ticket, //客户端传过来
                    'Randstr' => input('randstr'),//客户端传过来的
                    'UserIP' => $this->ip(),
                ];
                $parms = http_build_query($post_data);
                $url = 'https://ssl.captcha.qq.com/ticket/verify?' . $parms;
                $res = curl_get($url);
                $result = json_decode($res, true);

后台统计

我们可以看到请求的次数,当一个ip恶意去访问这个地址的时候,在几次成功以后,会出现验证不成功,会记录在这里。
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的滑块验证码Vue3 实现: ```vue <template> <div class="slider-captcha"> <div class="captcha-container"> <div class="captcha-image" ref="captchaImage"> <img :src="captchaUrl" alt="captcha" @load="handleCaptchaLoad" /> </div> <div class="slider" ref="slider" @mousedown="handleMouseDown" @mousemove="handleMouseMove" @mouseup="handleMouseUp"> <div class="slider-icon" ref="sliderIcon"></div> </div> </div> <div class="result" v-if="isVerified">验证通过</div> </div> </template> <script> import { ref } from 'vue'; export default { name: 'SliderCaptcha', setup() { const captchaUrl = ref('https://picsum.photos/300/150'); const isVerified = ref(false); let isDragging = false; let startX = 0; let sliderWidth = 0; let sliderMaxX = 0; let dragOffset = 0; const handleCaptchaLoad = () => { sliderWidth = Math.floor(getComputedStyle($refs.slider).width.slice(0, -2)); sliderMaxX = sliderWidth - 40; }; const handleMouseDown = (event) => { isDragging = true; startX = event.clientX; dragOffset = $refs.slider.offsetLeft; }; const handleMouseMove = (event) => { if (!isDragging) return; const x = event.clientX - startX + dragOffset; $refs.slider.style.left = `${Math.max(0, Math.min(sliderMaxX, x))}px`; }; const handleMouseUp = () => { isDragging = false; if (Math.abs($refs.slider.offsetLeft - sliderMaxX) < 5) { isVerified.value = true; } else { $refs.slider.style.left = '0'; } }; return { captchaUrl, isVerified, handleCaptchaLoad, handleMouseDown, handleMouseMove, handleMouseUp, }; }, }; </script> <style scoped> .slider-captcha { position: relative; width: 300px; height: 150px; } .captcha-container { position: relative; width: 100%; height: 100%; overflow: hidden; } .captcha-image { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .slider { position: absolute; top: 50%; left: 0; width: 40px; height: 40px; transform: translateY(-50%); background-color: #ccc; border-radius: 50%; cursor: pointer; } .slider-icon { position: absolute; top: 0; left: 0; width: 40px; height: 40px; border-radius: 50%; background-color: #fff; box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.3); } .result { position: absolute; top: 50%; left: 0; width: 100%; text-align: center; font-size: 18px; color: #fff; transform: translateY(-50%); background-color: green; padding: 10px; } </style> ``` 这个组件会显示一个随机的图片作为验证码,下面有一个滑块。用户需要拖动滑块,使其到达滑动条的末端,才可通过验证。如果验证通过,会显示一个“验证通过”的提示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲不住的程序员

您的打赏将是我最大的鼓励感谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值