我无法在我的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>
答案 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,但是您可以根据需要进行处理。