【问题标题】:reCAPTCHA with ajax validation always returns wrong even when correct带有 ajax 验证的 reCAPTCHA 即使正确也总是返回错误
【发布时间】:2013-12-04 23:13:49
【问题描述】:

实例如下:http://www.uslegalsupport.com/contact-us-new/

基本上,当您填写表格并输入必填字段时,如果您输入了正确或错误的验证码,它就会说它是无效的。我检查了我能想到的所有内容,并将其与 http://www.jquery4u.com/forms/setup-user-friendly-captcha-jqueryphp/ 进行了比较 - 我似乎无法弄清楚我错过了什么和/或做错了什么。

非常感谢任何帮助!

JavaScript:

<script type="text/javascript">
//Validate the Recaptcha' Before continuing with POST ACTION
function validateCaptcha()
{
    challengeField = $("input#recaptcha_challenge_field").val();
    responseField = $("input#recaptcha_response_field").val();
    var html = $.ajax({
        type: "POST",
        url: "validateform.php",
        data: "form=signup&recaptcha_challenge_field=" + challengeField + "&recaptcha_response_field=" + responseField,
        async: false
        }).responseText;
    if(html == "success") {
        //Add the Action to the Form
        $("form").attr("action", "/thank-you-for-contacting-us-new/"); //<-- your script to process the form
        $("#submit").attr("value", "Submit");
        //Indicate a Successful Captcha
        $("#captcha-status").html("<p class=\"green bold\">Success! Thanks you may now proceed.</p>");
    } else {
        $("#captcha-status").html("<p class=\"red bold\">The security code you entered did not match. Please try again.</p>");
        Recaptcha.reload();
    }
}
</script>

HTML 表单:

<form id="signup" method="post" action="javascript:validateCaptcha()">

<input class="contacinput" type="text" name="name222" placeholder="Name*" size="40" required><br />
<input class="contacinput" type="text" name="company222" placeholder="Company or Law Firm*" size="40" required><br />
<input class="contacinput" type="text" name="title222" placeholder="Title*" size="40" required><br />
<input class="contacinput" type="text" name="phone222" placeholder="Phone Number*" size="20" required><br />
<input class="contacinput" type="text" name="email222" placeholder="Email*" size="20" required><br />
<input class="contacinput" type="text" name="address222" placeholder="Street Address" size="20"><br />
<input class="contacinput" type="text" name="city222" placeholder="City" size="20"><input class="contacinput" type="text" name="state222" placeholder="State" size="5"><input class="contacinput" type="text" name="zip222" placeholder="Zip*" size="5" required><br />
<input class="contacinput" type="text" name="subject222" placeholder="Subject*" size="40" required><br />
<textarea rows="10" cols="45" class="contacinput" name="message222" placeholder="Message*" required></textarea><br /><br />

</p>

<div id="captcha-wrap">
        <div id="termsckb-wrap"><p class="bold">Type in the words below (separated by a space):</p></div>
        <?php
        require_once("recaptchalib.php");
        $publickey = "my-public-key-is-here"; // you got this from the signup page
        echo recaptcha_get_html($publickey);
        ?>
        <div id="captcha-status"></div>
</div>
            <p style="color: red;" id="captchaStatus">&nbsp;</p>


<input class="wpcf7-form-control wpcf7-submit signup submitbtn" id="signupbutton" value="submit" type="submit" name="signupbutton" />

</form>

验证表单.php:

<?php 
require_once("recaptchalib.php");

$privatekey = "my-private-key-is-here"; //<!----- your key here
$resp = recaptcha_check_answer ($privatekey,
                              $_SERVER["REMOTE_ADDR"],
                              $_POST["recaptcha_challenge_field"],
                              $_POST["recaptcha_response_field"]);

if (!$resp->is_valid) {
  // What happens when the CAPTCHA was entered incorrectly
  //die ("The reCAPTCHA wasn't entered correctly. Please go back and try it again. <a href=\"javascript:history.go(-1)\">Back</a>"
  //"(reCAPTCHA said: " . $resp->error . ")
    echo "fail";
} else {
    echo "success";
}

?>

【问题讨论】:

    标签: javascript php jquery ajax recaptcha


    【解决方案1】:

    AJAX 是异步的。您的var html 确实拥有它创建的XMLHttpRequest 对象的副本,但您必须检查html.onreadystatechange,确保html.readyState === 4 &amp;&amp; html.status === 200 获得html.responseText。请改用$.ajax({success:function(){/*do stuff here*/}})$.ajax({/*Object properties*/}).done(function(){/*do stuff here/*})。请注意,您不必使用匿名函数,没有() 的函数名称也可以。

    简介:

    function validateCaptcha(){
      var challengeField = $('#recaptcha_challenge_field').val();
      var responseField = $('#recaptcha_response_field').val();
      $.ajax({
        type: 'POST',
        url: 'validateform.php',
        data: encodeURI('form=signup&recaptcha_challenge_field='+challengeField+'&recaptcha_response_field='+responseField),
        async: false
      }).done(function(resp){
        if(resp === 'success'){
          $('#signup').submit();
        }
        else{
          $('#captcha-status').html("<p class='red bold'>The security code you entered did not match. Please try again.</p>");
          Recaptcha.reload();
        }
      });
    }
    

    function validateCaptcha(){
      var challengeField = $('#recaptcha_challenge_field').val();
      var responseField = $('#recaptcha_response_field').val();
      $.ajax({
        type: 'POST',
        url: 'validateform.php',
        data: encodeURI('form=signup&recaptcha_challenge_field='+challengeField+'&recaptcha_response_field='+responseField),
        async: false,
        success: function(resp){
          if(resp === 'success'){
            $('#signup').submit();
          }
          else{
            $('#captcha-status').html("<p class='red bold'>The security code you entered did not match. Please try again.</p>");
            Recaptcha.reload();
          }
        }
      });
    }
    

    然后这样做:

    $('#signupbutton').click(validateCaptcha);
    $(window).keydown(function(e){
      if(e.keyCode === 13){
        validateCaptcha();
        return false;
      }
    }
    

    您还应该更改一些 HTML,例如:

    <form id='signup' method='post' action='/thank-you-for-contacting-us-new/'>
    

    并摆脱没有打开&lt;p&gt;&lt;/p&gt; 标签。 并将您的type='submit' 更改为type='button'

    <input class='wpcf7-form-control wpcf7-submit signup submitbtn' id='signupbutton' value='submit' type='button' name='signupbutton' />
    

    【讨论】:

    • 嗨,谢谢您的回复,我对 java 和 ajax 不太熟悉,我只是想拼凑代码,如果您不介意提供更多信息或示例我会很感激的。我不太明白你在说什么用 $.ajax({success:function(){/*do stuff here*/}}) 或 $.ajax({/*Object properties*/}) 替换。 done(function(){/*在这里做东西/*}),而不是。
    • 感谢您的示例,当我根据您的原始帖子进行尝试时,我实际上非常接近第二个示例。我尝试了两个示例,都与原始帖子相同。现在 uslegalsupport.com/contact-us-new 已设置为您的第二个示例。
    • 刚刚尝试了您的两个修订版,均未返回任何类型的响应。它目前正在使用第一个。
    • 您是否提出了所有建议,制作了类型按钮,删除了额外的 /p 标记(感谢错过) - 添加了第二个注册按钮 JavaScript 代码,尝试了您列出的两种方法。两者都不做任何事情,您不会收到错误消息或任何东西。
    • 在更仔细地评估了uslegalsupport.com/contact-us-new 的代码,查看了您的 JavaScript 和 jQuery 之后,我现在已经为您提供了所有我愿意提供的帮助。太多的 JavaScript 和太多的 AJAX 请求让我无法免费查看每一段代码。我编写的代码甚至可能给您的其他代码带来问题。抱歉,我只是不愿意花 5 个多小时来解决这个问题。祝你好运!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    相关资源
    最近更新 更多