最近在给公司的网页把传统的输入字符数字的验证码改google reCAPTCHA验证,就写写我学到的和一些我的理解!说得不好请勿怪!有兴趣可以的去
https://developers.google.com/recaptcha/docs/display官网看看。

一、是recaptcha密钥的申请https://developers.google.com/recaptcha。需要登录google账号哦!

申请到密钥后,就是使用了。这https://developers.google.com/recaptcha/docs/display有介绍的。不过我还是再回顾一下。

二、 div+class 的简单使用与recaptcha前端验证

<script type="text/javascript" src="https://www.google.com/recaptcha/api.js" async defer></script>
<script>
   var recaptchaBox = doucument.getElementById("recaptchaBox");
   //验证成功回调事件,用data-callback绑定
   var verifyCallback = function (response) {
        recaptchaBox.style.border = "";
        document.getElementById("resStr").innerText = response;     //输出一下,看看这验证通过后,返回的验证码
   }
  function btnClick() {
      var res = grecaptcha.getResponse();
      if (!res) {
        alert("请完成recaptcha验证!");
        recaptchaBox.style.border = "1px solid red";
        return;
      }
   }
</script>
<div id="recaptchaBox"><div class="g-recaptcha" data-sitekey="your_site_key" data-callback="verifyCallback"></div></div>
<span id="resStr"></span>
<button type="button" id="btn" onclick="" runat="server">button-btn</button>

google提供的grecaptcha.getResponse()方法的返回值,在验证通过时,与回调事件中response相同。验证不通过则返回值为空,该方法可用于在前台判断recaptcha验证是否通过。

二、onload事件与主题(风格)

<script type="text/javascript">
   var onloadCallback = function () {
    grecaptcha.render('recaptchaId', {
      'sitekey': '网站密钥',
      'callback': '验证通过,回调事件',
      'theme': '目前主题是dark或light,默认为light'
    });
  };
</script>
<script type="text/javascript" src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit"  async defer></script>

<div id="recaptchaBox2"><div id="recaptchaId"></div></div>

onload事件是提供id来加载recaptcha小窗口的,https://www.google.com/recaptcha/api.js 加载完成开始执行onload事件,onload是异步执行的。

在div+clas+'data-size'里,是加载完成api.js,异步查找到div+clas+'data-size',然后调用相关事件。

三、api.js的可选参数render=onload/explicit

根据google reCAPTCHA官网对render参数的介绍,翻译后:“可选的。 是否显式呈现窗口小部件。 默认为onload,这将在它找到的第一个g-recaptcha标记中呈现小部件。”

从这里可以看出,render至少在表面上时可选的,实际上却是不是如此的,看“默认为onload”就知道了,你在引用https://www.google.com/recaptcha/api.js时没有写,不代表render它就没用到,因为它的值默认为onload。就像recaptcha的主题一样,它只是在你看不到的地方调用了。

另外也要注意一下,explicit为显式呈现窗口小部件,那么onload就是非显式呈现喽。去看看英文翻译:onload负载,explicit明确的

一起来看看下面的几个区别:注意参数render的值和是否使用onload事件

<h3>The First One</h3>
<script src="https://www.google.com/recaptcha/api.js" async="async"></script>
<div class="g-recaptcha" data-sitekey="your_sitekey"></div>
<h3>The First Two</h3>
<script src="https://www.google.com/recaptcha/api.js?render=onload" async="async"></script>
<div class="g-recaptcha" data-sitekey="your_sitekey"></div>
<h3>The First Three</h3>
<script src="https://www.google.com/recaptcha/api.js?render=explicit" async="async"></script>
<div class="g-recaptcha" data-sitekey="your_sitekey"></div>

The First One 和 The First Two 没什么区别,都能正常呈现,而The First Three。

在这里我还要提醒下哦,不能几个render参数值不同的在同一个页面一起运行,不然不能看出来是否呈现哦!
因为这样得到的结果是都正常呈现,只是呈现的有着时间上的差异。下面也一样的啦!下面的onload事件,我就省略啦。

<h3>The Second One</h3>
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback" async="async"></script>
<div id="grecaptcha1"></div>
<h3>The Second Two</h3>
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=onload" async="async"></script>
<div id="grecaptcha2"></div>
<h3>The Second Three</h3>
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async="async"></script>
<div id="grecaptcha3"></div>

 这一次的只有The Second Three能正常呈现,说明了有onload事件时,需满足render=explicit;而没有onload事件时,满足render=onload。

在grecaptcha.render("",{})方法中,'site-key'被配置成了,必要参数呢!
具体的是为啥,我这菜鸟不知道,我没有特别去破解过那些封包,要是哪位大神知道,麻烦给我留个言,菜鸟我在这先谢过啦。

四、直接后台验证

<script type="text/javascript">
    var onloadCallback = function () {
      grecaptcha.render('recaptcha', {
         'sitekey': 'your_site_key',
      'callback': function () { document.getElementById("recaptchaBox").style.border = ""; }
    });
  };
  function proxyButton() {
    var res = grecaptcha.getResponse();
    if (!res) {
      alert("请完成ReCaptcha验证!");
      document.getElementById("recaptchaBox").style.border = "1px solid red";
       return;
    }
    $("#hidd_response").val(res);
     __doPostBack('button', '');
  }
</script>
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>        
<div id="grecaptchaBox" style="width: 302px; height: 76px; padding: 1px;">
  <div id="grecaptcha" style="width: 304px; height: 78px;"></div>
</div> <input type="button" id="button" value="button" runat="server" onclick="return proxyButton();" onserverclick="btnClickServer" /> <asp:HiddenField ID="hidd_response" runat="server" Value="" />

 

 #region 获取返回的字符串

    [WebMethod]
    protected string VerifyCaptcha(string response)
    {
        string res = string.Empty;
        string secret = "6LcoyGoUAAAAANIlt2aFc7khDwUfBG-cabvUBihS";

        Dictionary<string, string> parameters = new Dictionary<string, string>();

        parameters.Add("secret", secret);
        parameters.Add("response", response);

        string url = "https://www.google.com/recaptcha/api/siteverify?secret=" + secret + "&response=" + response;
        return (new WebClient()).DownloadString(url);
    }
    #endregion

    #region 转换为json
    protected bool verifyPast()
    {
        string resStr = VerifyCaptcha(this.hidd_response.Value);

        Newtonsoft.Json.Linq.JObject jObject = Newtonsoft.Json.Linq.JObject.Parse(resStr);
        if (jObject["success"].ToString().ToLower() == "true")
            return true;
        else
            return false;
    }
    #endregion

在这里,我并没有将 “var res = grecaptcha.getResponse()”作为json/jsonp类型数据传值给后台,而是直接使用一个隐藏控件来存储它的值,在后台,就可以直接获取到这个值。

还有一点要注意,获取到的每一个“var res = grecaptcha.getResponse()”能且只能返回一次“success:true”,后面再用这个res去获取验证码返回的都是“success:false”

嗯,这里来点番外,据说这个https://www.google.com/recaptcha/api/siteverify验证使用什么T3技术啥的,所以这个.NET Framework2.0版本是不能访问该网站的;3.0的我不知道,没试过,4.0的是可以滴。

 要是想看 “var res = grecaptcha.getResponse()”作为json/jsonp类型数据传值给后台,可以去看看这2个:http://www.pdwzjs.com/news/731.htmlhttps://katyusha.net/archives/391.html

(⊙o⊙)…,差点忘了一个,语言设置,只要在引入api.js是在后面加上‘hl=xx’就行了,别忘了将 xx 替换掉哦,语言库:https://developers.google.com/recaptcha/docs/language 。

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

 

posted on 2018-08-31 15:47  欲穷  阅读(978)  评论(0编辑  收藏  举报