Google验证码reCAPTCHA接入Web

v2的版本

1. 介绍

reCAPTCHA是google旗下的验证码服务(免费的),当然要保证网络能打开google才行,所以常用于国外的网站。如果需要在国内使用,只需将所有的www.google.com替换成www.recaptcha.net即可。

官网:https://developers.google.com/recaptcha/

2. 接入

(1) site key

To start using reCAPTCHA, you need to sign up for an API key pair for your site. The key pair consists of a site key and secret key. The site key is used to invoke reCAPTCHA service on your site or mobile application. The secret key authorizes communication between your application backend and the reCAPTCHA server to verify the user’s response. The secret key needs to be kept safe for security purposes.

申请Site Key: http://www.google.com/recaptcha/admin

Verifying the user’s response:

https://developers.google.com/recaptcha/docs/verify

在本地开发时,可以使用此site key进行测试:

6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI

(2) 方式一:DOM中加入

<html>

  <head>

    <title>reCAPTCHA demo</title>

    <script src="https://www.google.com/recaptcha/api.js" async defer></script>

  </head>

  <body>

    <form action="?" method="POST">

      <div class="g-recaptcha" data-callback="robotVerified" data-sitekey="6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI"></div>

    </form>

  </body>

  <script>

    function robotVerified(){

      console.log('Verified: not robot');

    }

  </script>

</html>

(3) 方式二:Js 渲染

<html>

  <head>

    <title>reCAPTCHA demo</title>

    <script src="https://www.google.com/recaptcha/api.js?onloadCallback&render=explicit" async defer></script>

  </head>

  <body>

    <div id="robot"></div>

    <script type="text/javascript">

      var onloadCallback = function() {

        console.log("grecaptcha is ready!");

        //render grecaptcha

        grecaptcha.render('robot', {

          'sitekey': '6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI',

          'callback': function () {

            console.log('Verified: not robot');

          }

        });

      };

    </script>

  </body>

</html>

3. 配置

(1) 引用api.js的url参数

<script src="https://www.google.com/recaptcha/api.js?onloadCallback&render=explicit" async defer></script>

在引用recaptcha的api时,url上可以配置一些参数,如下:

参数名称    是否可选    值    描述

onload    是    函数名称    定义加载完成的回调函数名称

render    是    explicit 或 onload(默认)    当api加载好之后是否直接在类名为g-recaptcha的标签上渲染recaptcha。默认的onload是要渲染,explicit是不渲染

hl    是    点击查询不同语言对应的值    recaptcha显示语言,如果未指定,自动检测用户的语言。

[1] onload

<html>

  <head>

    <title>reCAPTCHA demo</title>

    <script src="https://www.google.com/recaptcha/api.js?onloadCallback" async defer></script>

  </head>

  <body>

    <form action="?" method="POST">

      <div class="g-recaptcha"data-sitekey="6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI"></div>

    </form>

  </body>

  <script>

    function onloadCallback(){

      console.log("grecaptcha is ready!");

    }

  </script>

</html>

[2] render

设置为explicit后,api加载完成以后也不会自动渲染rechaptcha框,页面会显示空白。

<html>

  <head>

    <title>reCAPTCHA demo</title>

    <script src="https://www.google.com/recaptcha/api.js?render=explicit" async defer></script>

  </head>

  <body>

    <form action="?" method="POST">

      <div class="g-recaptcha"data-sitekey="6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI"></div>

    </form>

  </body>

</html>

[3] hl

将hl配置为zh-CN后,显示简体中文界面。

<html>

  <head>

    <title>reCAPTCHA demo</title>

    <script src="https://www.google.com/recaptcha/api.js?hl=zh-CN" async defer></script>

  </head>

  <body>

    <form action="?" method="POST">

      <div class="g-recaptcha"data-sitekey="6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI"></div>

    </form>

  </body>

</html>

(2) reCAPTCHA自定义参数

在上文的接入章节中提到了,有两种接入的方式,两种方式都可以进行自定义配置。

类名为g-recaptcha的标签上的属性    grecaptcha.render参数    必填    值    描述

data-sitekey    sitekey    是        网站sitekey

data-theme    theme        dark或light(默认)    主题颜色

data-size    size        compact或normal(默认)    框大小

data-tabindex    tabindex        默认为0    The tabindex of the widget and challenge. If other elements in your page use tabindex, it should be set to make user navigation easier.

data-callback    callback        验证成功回调函数    g-recaptcha-response token会作为参数传递到回调函数中

data-expired-callback    expired-callback        验证失效回调函数    用户需要重新验证

data-error-callback    error-callback        错误回调函数    因为网络等问题无法验证,通过回调函数提醒用户重试

[1] theme

dark和light如下

[2] size

compact和normal如下:

[3] data-callback

<html>

  <head>

    <title>reCAPTCHA demo</title>

    <script src="https://www.google.com/recaptcha/api.js" async defer></script>

  </head>

  <body>

    <form action="?" method="POST">

      <div class="g-recaptcha" data-callback="robotVerified" data-sitekey="6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI"></div>

    </form>

  </body>

  <script>

    function robotVerified(data){

      console.log(data);

    }

  </script>

</html>

在回调函数robotVerified中接受到的这个参数就是g-recaptcha-response token(注意:每次都不一样)。如下:

03AHqfIOks78_xzIktpZlVUGhCIiRruEDFaP9aAir-ChZpGbSdQ3JcUpCuEQ9KwuynC5M-TR8wQfppmIJqIXBGl1xvusZqj444QqI2dhyTXx6LmL9y00knaFIRn5KC9ILWX-H3Hgv66mamhakmo3x1EIEoiA03EixOtPgbW_Q68dDl48B0_8qHl6o9KOfLiolqdwIApi61FZCqUXhvPKZc55i2FVA2qvsh0oauN0YdHWG_ReyXlW2vdS-A0U0E28NWafM1-IfDnxOBchxSE-uYIiXB4QeruyeNaA

(3) JavaScript API

方法    参数    返回    描述

grecaptcha.render(container,parameters)    【container】id名称(字符串) or document.getElementById(‘example1’)

【parameters】参照上节内容,如{"sitekey": "your_site_key", "theme": "light"}    widget id    在container指定的标签内渲染reCAPTCHA模块

grecaptcha.reset(opt_widget_id)    widget id(可选,省略时默认为第一个创建的模块)    -    重置reCAPTCHA

grecaptcha.getResponse(opt_widget_id)    widget id(可选,省略时默认为第一个创建的模块)    【未通过】""

【已通过】g-recaptcha-response token    获得reCAPTCHA的结果响应

[1] render

<html>

  <head>

    <title>reCAPTCHA demo</title>

    <script src="https://www.google.com/recaptcha/api.js?onloadCallback&render=explicit" async defer></script>

  </head>

  <body>

    <div id="robot1"></div>

    <div id="robot2"></div>

    <script type="text/javascript">

      var onloadCallback = function() {

        var widge1 = grecaptcha.render('robot1', {

          'sitekey': '6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI',

          theme: 'dark'

        });

        console.log(widge1); //0

        var widget2 = grecaptcha.render(document.getElementById('robot2'), {

          'sitekey': '6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI',

          tabindex:'2'

        });

        console.log(widget2); //1

      };

    </script>

  </body>

</html>

[2] reset

<html>

  <head>

    <title>reCAPTCHA demo</title>

    <script src="https://www.google.com/recaptcha/api.js?onloadCallback&render=explicit" async defer></script>

  </head>

  <body>

    <div id="robot"></div>

    <button onclick="resetRecaptcha()">重置</button>

    <script type="text/javascript">

      var widgeId;

      var onloadCallback = function() {

        widgeId = grecaptcha.render('robot', {

          'sitekey': '6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI',

        });

      };

      function resetRecaptcha(){

        grecaptcha.reset(widgeId); // <---看这里

      }

    </script>

  </body>

</html>

[3] getResponse

<html>

  <head>

    <title>reCAPTCHA demo</title>

    <script src="https://www.google.com/recaptcha/api.js?onloadCallback&render=explicit" async defer></script>

  </head>

  <body>

    <div id="robot"></div>

    <button onclick="getResponseFromRecaptcha()">看看验证通过了没?</button>

    <script type="text/javascript">

      var widgetId;

      var onloadCallback = function() {

        widgetId = grecaptcha.render('robot', {

          'sitekey': '6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI',

        });

      };

      function getResponseFromRecaptcha(){

        var response = grecaptcha.getResponse(widgetId); // <---看这里

        if (response.length == 0) { //返回""或 token(如:03AHqfIOmtBMGg686uP3YPAN7hJyaqUi69SSrEnC3Km7Hcnr5y1u-A-yp8z28yBvgVxqWiRndLrXrk_TyJrdob3tVh4BGnI4YNsoKocqZmbilGnJRX6Mxxj6jQ0AkhoRangAVFmRFZyy7RH5u5ruM5t_H7-P4GNnaFUaMELgOYyJ5ZgUtEMwBS1iNrGg6B6MZmgd4kcJXhWYR4vU_RwqFOuzxd9NMF7OCLl8FzOhN4baI5S2krnORqMBkiWenKNUtCuKfB1HzGdiVog7mzBKJvseSBlAPXrTN-Gg)

          console.log('reCaptcha not verified');

          return false;

        } else {

          console.log('reCaptcha verified');

          return true;

        }

      }

    </script>

  </body>

</html>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容