网站之前一直用的是google recaptcha v2 ,同一页面内如果有多个表单需要保护也很麻烦,官方也没什么文档。自己折腾了一下大致如下:

单页面多表单利用callback引入js:

<script src="https://www.google.com/recaptcha/api.js?onload=CaptchaCallback&render=explicit" async defer></script><script type="text/javascript">var CaptchaCallback = function() {//表单一grecaptcha.render('g-recaptcha-news', {'sitekey' : '<?php echo Mage::helper('recaptcha')->getKey(); ?>'});//表单二grecaptcha.render('g-recaptcha-pop', {'sitekey' : '<?php echo Mage::helper('recaptcha')->getKey(); ?>'});//表单三grecaptcha.render('g-recaptcha-contact', {'sitekey' : '<?php echo Mage::helper('recaptcha')->getKey(); ?>'});};
</script>

还需要确保以上3个form里面分别有id为g-recaptcha-news、g-recaptcha-pop、g-recaptcha-contact的div与代码对应,如果js找不到这个id是会报错的;

后端php在表单控制器或者在表单控制器之前提交验证并返回,若失败则阻断表单提交即可;

public function Validate_captcha($response){$verifyResponse = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret=' . $this->getSecretkey() . '&response=' . $response);$responseData = json_decode($verifyResponse);if ($responseData->success):return true;else:return false;endif;}

v2总有个框有碍观瞻一直觉得很不爽,所以手欠换成了V3 invisible recaptcha 就是无感验证;然后发现这个就比较坑爹了;v3的思路跟v2差不多但有个很明显的缺陷就是超时了没办法自动刷新,因为V2验证超时了你还可以通过验证界面再次点击刷新token但是v3是没有界面的无处点击!

具体安装如下:

安装js在回调里面执行初始化方法,在需要验证的表单里面放入一个input用于接收token跟上面v2的div类似

var recaptchaScript = document.createElement('script');recaptchaScript.src = 'https://www.google.com/recaptcha/api.js?onload=mtInvisibleCaptchaOnloadCallback&render=<?php echo $captcha->getSiteKey(); ?>';recaptchaScript.attributes = 'async defer';document.body.appendChild(recaptchaScript);window.mtInvisibleCaptchaOnloadCallback = function () {for (var i = 0; i < window.formToProtectOnPage.length; i++) {window.formToProtectOnPage[i].innerHTML +='<input class="invisible_token" type="hidden" name="invisible_token" value=""/>';}for (var i = 0; i < window.formToProtectOnPage.length; i++) {var form = window.formToProtectOnPage[i];if (form.tagName.toLowerCase() != 'form') {continue;}currentFormId = form.id;currentFormId = currentFormId.replace(/\W+(?!$)/g, '');grecaptcha.ready(function() {grecaptcha.execute('<?php echo $captcha->getSiteKey(); ?>', {action: currentFormId}).then(function(token) {$(".invisible_token").val(token);});});}};

后端验证:

    public function verify($token){$verification = array('success' => false,'error' => '');if ($token) {try {$secret = Mage::getStoreConfig(self::CONFIG_PATH_GENERAL_SECRET_KEY);$url = 'https://www.google.com/recaptcha/api/siteverify?secret=' .$secret . '&response=' . $token . '&remoteip=' . $_SERVER["REMOTE_ADDR"];$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);$response = curl_exec($ch);$result = json_decode($response, true);if ($result['success']) {$verification['success'] = true;} elseif (array_key_exists('error-codes', $result)) {$verification['error'] = $this->getErrorMessage($result['error-codes'][0]);}} catch (Exception $e) {$verification['error'] = $e->getMessage();}}return $verification;}

逻辑跟v2一样,唯一不同的我们需要额外处理超时的问题,谷歌的验证超时是大约2-3分钟,页面上的验证过了这段时间就过期了,但是用户如果不刷新页面是永远无法提交受保护的表单的,那么如何解此问题呢?

方法有2个:

1,在初始化的地方写一个定时器每2分钟执行一次获取验证码的方法,此方法优点就是可全局一次性搞定,缺点我就不说了很low的一种做法;

setInterval(function () {grecaptcha.execute('GOOGLE CLIENT KEY', { action: 'contact' }).then(function (token) {if ($("#recaptcha_token").length) {console.log("set new token to existing input >> token = " + token);$("#recaptcha_token").val(token);} else {console.error("recaptcha_token does not exist on email_form");}});}, 60000);

2、在提交表单的时候执行一次获取验证码的方法,此方法就是每个表单都要单独加代码比较麻烦点;

google recaptcha v2 and v3相关推荐

  1. recaptcha v2_reCAPTCHA v2 vs v3 – reCAPTCHA v2和v3之间的区别

    recaptcha v2 Here, in this article, you will get to learn about reCAPTCHAs, how they work, and the d ...

  2. 当React Native 遇到了Google reCAPTCHA

    做客户端开发久了,总有一些烦心事来扰乱你,其中一个就是机器人注册.当然大部分App目前注册的时候都要提供短信验证码.但是这还是防不住一些专业的羊毛党,各种短信验证码平台用的飞起.那该怎么办呢?上验证码 ...

  3. Android v1、v2、v3签名原理

    Android签名机制 什么是Android签名 了解 HTTPS 通信的同学都知道,在消息通信时,必须至少解决两个问题:一是确保消息来源的真实性,二是确保消息不会被第三方篡改. 同理,在安装 apk ...

  4. 谷歌(Google): reCaptcha(2.0版本)做网站验证码

    百度百科: CMU设计了一个名叫reCAPTCHA的强大系统,让他们的电脑去向人类求助.具体做法是:将OCR软件无法识别的文字扫描图传给世界各大网站,用以替换原来的验证码图片:那些网站的用户在正确识别 ...

  5. OUC暑期培训(深度学习)——第四周学习记录:MobileNetV1,V2,V3

    第四周学习:MobileNetV1,V2,V3 Part 1 视频学习及论文阅读 1.MobileNetV1 MobileNetV1论文网址:[1704.04861] MobileNets: Effi ...

  6. Google reCAPTCHA ----------验证码

    现有验证码的产品形态调研范围如下,基本涵盖了比较主流的验证码平台: Google reCAPTCHA 极验 阿里云 腾讯云 点触 网易易盾 螺丝帽 FunCaptcha 产品背景 ‍‍reCAPTCH ...

  7. 【Android签名机制详解】二:Android V1、V2、V3、V4签名方案

    前言 书接上回[Android签名机制详解]一:密码学入门,在了解了消息摘要.非对称加密.数字签名.数字证书的基本概念后,我们趁热打铁.直奔主题,讲解签名在Android中的实际应用. 基础知识 An ...

  8. keystone v2 to v3

    keystone v2 to v3 http://www.cloudkb.net/how-to-change-keystone-api-v2-v3/ posted on 2016-03-18 00:1 ...

  9. ASP.NET Google Maps Javascript API V3 实战基础篇一获取和设置事件处理程序中的属性...

    ASP.NET Google Maps Javascript API V3 实战基础篇一获取和设置事件处理程序中的属性 <%@ Page Language="C#" Auto ...

最新文章

  1. Invalid character escape '\o'.
  2. 解决ftp限制用户访问上层目录后无法登陆问题
  3. 接口到底是什么(一语道破)
  4. 使用proc文件系统
  5. oracle数据库连接名是什么,连接到Oracle数据库的几种命名方式
  6. Python 字符串前面加u,r,b,f的含义(字符串前缀)
  7. 入门 | egg.js 入门之egg-jwt
  8. 绝对精辟!10分钟让你全面了解当前世界金融危机
  9. 微博持续开展不友善言论治理专项 重点整治网络暴力行为
  10. mysql 恢复空密码_mysql 找回密码
  11. 8年web前端开发老程序员告诉你如何零基础学习web前端
  12. Linux系统下使用iftop结合iptables服务解决带宽被恶意请求的问题
  13. 如何通过jQuery动态设置元素CSS的样式,以及HTML中CSS “内联式”、“嵌套式”、“外联式”使用方法
  14. oracle32 plsql,32位plsql developer连接64位oracle
  15. 【元胞自动机】基于元胞自动机多车道信号交叉口仿真含Matlab源码
  16. wireshark显示过滤器和捕获过滤器
  17. 风力摆控制系统赛题分析
  18. 鸿蒙系统推广时间,鸿蒙系统将全面推广,目标覆盖3亿台设备,第三方IoT可达1亿台...
  19. PHP公司高级面试题2017,php面试题2017
  20. 暑期项目实训——08

热门文章

  1. 反思:Google 为何把 SurfaceView 设计的这么难用?
  2. 软件测试 | 测试开发 | 智能音箱语音交互系统简介与测试初探
  3. 数字IC前端学习笔记:LSFR(线性反馈移位寄存器)
  4. (转)FFmpeg源代码简单分析:avformat_open_input()
  5. 安装Anaconda:出现无法连接怎么办? 以及一些基础环境操作
  6. c语言求最大公因数和最小公倍数
  7. 云服务器部署stable diffusion webui
  8. java 304_304 Not Modified状态码
  9. 詹姆斯·克拉克·麦克斯韦: 麦克斯韦方程的历史
  10. 走向人生巅峰?这份自由程序员速成宝典你值得拥有...