【问题标题】:reCAPTCHA on second form submit not working第二种形式的 reCAPTCHA 提交不起作用
【发布时间】:2019-03-10 06:44:37
【问题描述】:

当用户提交表单时,在 php 中的字段被验证。如果有一些错误 php 返回 echo 消息,表明有错误(它不会向 ajax 返回错误)。所以ajax还是“成功”的。

如果我在 ajax 成功中评论 grecaptcha.reset();,并且当用户第二次提交表单时,$response != null && $response->success 在 php 中返回 false

如何解决这个问题,使ajax成功后没有grecaptcha.reset(),并且用户只需通过一次验证码就足够了。

这是 html 形式的 reCAPTCHA:

<div class="g-recaptcha" style="display:inline-block;" data-sitekey="6LdDlHIUAAAAAD3hgpRSSsNpS7SaRILGNTNiyak_"></div>

这里是 jQuery:

jQuery('#some_form').submit(function(e){
    e.preventDefault();
    var FormData = jQuery(this).serialize();
    jQuery('.buttonHolder').css('display', 'none');
    jQuery('#spinner-1').css('display', 'block');


jQuery.ajax({   

        url : rml_obj.ajax_url,
        type : 'post',
        dataType : 'json',
        data : {
            action : 'some_form',
            security : rml_obj.check_nonce,
            data1 : FormData
        },
        success : function( response ) {
            PUM.open(7939);
            //alert(checkbox_chk);
            jQuery('.pum-content').html(response.message1);
            jQuery('.copy-url').html(response.message2);
            jQuery('.buttonHolder').css('display', 'block');
            jQuery('#spinner-1').css('display', 'none');
            //grecaptcha.reset();
        },
        error: function(xhr, ajaxOptions, thrownError){
                alert(xhr.status);
            },

    });
});

这里是测试 reCAPTCHA 的 php 代码:

require_once "recaptchalib.php";
$secret = "6LdDlHIUAAAAALFlTOx-9T63cODtjs7eno******";
$response = null; 
$reCaptcha = new ReCaptcha($secret);

$data = $_POST[ 'data1' ];
parse_str($data, $output);
$var1 = $output['var1'];
$var2= $output['var2'];

if ($output["g-recaptcha-response"]) {
    $response = $reCaptcha->verifyResponse(
    $_SERVER["REMOTE_ADDR"],
    $output["g-recaptcha-response"]
    );
}

if ($response != null && $response->success) {
//insert data into db ...
    header("Content-type: application/json; charset=utf-8");
    echo json_encode(
            array("message1" => 'message1',
                  "message2" => 'message2')
    )
} else {
    header("Content-type: application/json; charset=utf-8");
    echo json_encode(
            array("message1" => 'error reCAPTCHA')
}

【问题讨论】:

  • error php return echo message that there is an error (it doesn't return an ERROR to ajax). So the ajax is still "success". 这是不正确的术语。您回显或输出的任何内容都会返回到 AJAX 回调,AJAX 调用的成功或失败取决于处理请求的服务器,例如 404 错误。相反,是否存在应用程序错误与请求错误有很大不同。我明白你在说什么,而且你的大部分内容是正确的,但你所说的方式似乎表明你并不完全理解请求错误和应用程序错误之间的区别。
  • 我现在懂术语了,以前不知道怎么表达。因此,在 AJAX 回调和第二个表单提交之后,如果 AJAX 中没有 grecaptcha.reset(),则 $response != null &amp;&amp; $response-&gt;success 返回 false in php。
  • 我指出这一点是因为在成功回调中检查应用程序错误然后采取相应措施是完全可能且适当的。例如,您可以返回{'error' : 'validation_error'},然后检查成功if(response.error),然后修改事物的行为。我想现在当您将其作为响应 echo "reCAPTCHA error"; 时,这会导致一些 javascript 错误,因为 response.message1 未定义。
  • 我不使用 ReCaptcha,也没有在大约 5 年内做过任何类似的事情,因为这些天我所做的人们可以提交东西的所有东西都在登录系统后面。所以我希望我能为您提供更多帮助,但基本上您需要一种方法来了解验证何时失败(在客户端),以便您可以更改 UI 如何响应下一次提交。
  • 当然,一个选项是验证表单客户端或使用完全独立的 AJAX 脚本(实时执行,或在提交之前执行),然后一起阻止初始表单提交。从而使 2 个提交对验证问题没有实际意义。

标签: php jquery ajax recaptcha


【解决方案1】:

感谢ArtisticPhoenix 的好建议。在进一步调查相同的 reCAPTCHA 响应后,无法验证两次。 php 字段验证的更改已经解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-21
    • 2021-03-06
    • 2011-07-19
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多