reCaptcha小部件不会过期,永远不会调用过期的回调

时间:2016-07-12 21:21:37

标签: javascript captcha recaptcha

我无法在我的ajax联系表单中集成reCaptcha。只有在用户完成挑战后的前2分钟才有效。 ReCaptcha在2分钟后过期。问题是小部件是完整的,没有像“会话过期。再次完成挑战”。用户无法执行任何操作,但会重新加载页面。此外,不调用过期回调(显然,因为小部件不会过期)。

我可以在完成后将计时器设置为2分钟以重置小部件。这可行,但它有点hacky,如果谷歌选择改变未来的到期时间。任何想法为什么它不会过期?

我尝试了两种集成小部件的方法(自动和显式)

编辑: 这是代码,我做了一个小例子html文件并证明它不起作用。

<html>
<head></head>

<body>

        <div id="google-recaptcha-widget"></div>

<script>
        var expiredCallback = function() {
            alert('expired!');
        }

        var recaptchaLoad = function() {

                grecaptcha.render('google-recaptcha-widget', {
                        'sitekey' : 'mysitekey'
                        'expired-callback': expiredCallback
                });

        }

</script>

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

</body></html>

2 个答案:

答案 0 :(得分:0)

<div id="google-recaptcha-widget" class="g-recaptcha" data-sitekey="mySiteKey" data-callback="myCallbackMethod" data-expired-callback="expiredCallback"></div>

<script>
    function myCallbackMethod() {
        // save the world
    }

    function expiredCallback() {
        // Uh oh, reCAPTCHA expired, hack the world
    }
</script>

答案 1 :(得分:0)

我遇到了一个同样的问题,即数据过期的回调根本不起作用。因此,我的解决方案是使用PHP以编程方式检查是否使用了来自json对象的'challenge_ts'时间戳2分钟。我在下面实际处理时间戳的代码中添加了注释:

$post_data = http_build_query(
    array(
        'secret' => 'YOUR_SECRET_KEY',
        'response' => $_POST['g-recaptcha-response'],
        'remoteip' => $_SERVER['REMOTE_ADDR']
    )
    );
$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-type: application/x-www-form-urlencoded',
        'content' => $post_data
    )
);
$context  = stream_context_create($opts);
$response = file_get_contents('https://www.google.com/recaptcha/api/siteverify', false, $context);
    $result = json_decode($response);
    // Storing the timestamp when the captcha was generated on the page
    $reCaptchaTS = $result->challenge_ts; 
    $date = new DateTime();
    // Setting the time for the captcha to expire for 2 minutes
    date_add($reCaptchaTS, date_interval_create_from_date_string('2 minutes'));
    if ($result->success) {
        // If 2 minutes have passed since the captcha was generated then it expires, generating an error. 
        if ($date > $reCaptchaTS) {
            $reCaptchaExpiredError = "<div class='alert alert-danger'><b>Error:</b> The reCAPTCHA has expired. Please try again.</div>";
        }
    }

因此,这里获取json时间戳并将其存储在变量$ reCaptchaTS中。然后,我通过添加2分钟来更新时间戳,以便我们可以设置验证码过期的时间。然后,我创建一个$ date并将当前时间存储在其中。

之后,我们只检查用户是否用if($ result-> success)完成了验证码。在那里,我们可以最终检查当前时间是否大于过期时间,这表示验证码已过期。那时我生成了我的错误消息$ reCaptchaExpiredError,但是您可以根据需要进行处理。