Google reCAPTCHA V2 JavaScript 我们检测到您的站点未验证 reCAPTCHA 解决方案

Google reCAPTCHA V2 JavaScript We detected that your site is not verifying reCAPTCHA solutions

错误信息 我们检测到您的站点未验证 reCAPTCHA 解决方案。这是在您的网站上正确使用 reCAPTCHA 所必需的。请查看我们的开发者网站了解更多信息。 我创建了这个 reCaptcha 代码,它运行良好但我不知道如何验证它,我认为它正在使用函数进行验证 grecaptcha.getResponse(); 但事实并非如此。 显然,recaptcha 在网站上运行良好,但我刚刚在 Google 管理员中看到下一条消息:

要求: 1.Do 表格中没有使用 action="file.php",表格中只有一个 javascript 函数。

     <!DOCTYPE>
<html>
<head >
    <title></title>
    <script src='https://www.google.com/recaptcha/api.js'></script>
    <script type="text/javascript">
        function get_action() {
            var v = grecaptcha.getResponse();
            console.log("Resp" + v );
            if (v == '') {
                document.getElementById('captcha').innerHTML = "You can't leave Captcha Code empty";
                return false;
            }
            else {
                document.getElementById('captcha').innerHTML = "Captcha completed";
                return true;
            }
        }
    </script>
</head>
<body>
    <form id="form1" onsubmit="return get_action();">
    <div>
    <div class="g-recaptcha" data-sitekey="6LdNIlAUAAAAADS_uVMUayu5Z8C0tw_jspdntbYl"></div>
    </div>
   <input type="submit" value="Button" />
   
    <div id="captcha"></div>
    </form>
</body>
</html>

请你帮帮我。我会很感激 我如何验证它,因为我需要使用 javascript 函数 onsubmit="return get_action();" 而不是 action="file.php" *当我提交时?:

grecaptcha.getResponse() 函数只会为您提供用户响应令牌,然后必须在 google reCAPTCHA 服务器上通过 HTTP POST 调用对其进行验证。

您可以使用 AJAX 请求来验证令牌,但出于安全原因,这些验证 应始终在服务器端完成 - JavaScript可能总是被用户干扰并被欺骗相信 reCAPTCHA 已成功验证。

Google reCAPTCHA docs:

After you get the response token, you need to verify it with reCAPTCHA using the following API to ensure the token is valid.

所以您需要做的是将您的 reCAPTCHA 密码(在 reCAPTCHA 管理页面中为您生成的第二个密钥)和用户响应令牌(从 grecaptcha.getResponse() 函数收到的那个)发送到 reCAPTCHA API 如 reCAPTCHA docs.

中所述

在PHP中,你会这样想:

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://www.google.com/recaptcha/api/siteverify");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
    'secret'   => YOUR_RECAPTCHA_SECRET,
    'response' => USER_RESPONSE_TOKEN,
]));

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$data = curl_exec($ch);

curl_close($ch);

$response = @json_decode($data);

if ($response && $response->success)
{
    // validation succeeded, user input is correct
}
else
{
    // response is invalid for some reason
    // you can find more in $data->{"error-codes"}
}

这就是我的建议...

1.) 将查询字符串附加到您的 reCPATCHA 脚本。此外,为了获得更好的性能,防止渲染阻塞,您可以将 async defer 属性添加到 <script ...>。为了正确起见,您应该将脚本移动到 DOM 中的 <form> 之后。 ...</form> <script src='https://www.google.com/recaptcha/api.js?onload=recaptchaRender' async defer></script>.

2.) 添加一个名为 recaptchaRender() 的新函数。处理对 Google 的验证并将响应卸载给回调 get_action。将 RECAPTCHA_SITE_KEY 替换为您的 Google 站点密钥。

function recaptchaRender{
    grecaptcha.render( 'reCaptchSubmit', {
        'sitekey': 'RECAPTCHA_SITE_KEY',
        'callback': get_action
    });
}

3.) 添加 id="reCaptchSubmit" 到您的提交按钮。

4.) 从表单元素中删除 onsubmit="return get_action();"

基本上你错过了你的脚本和 Google 之间的身份验证。这不会处理您的表单验证,但至少会让您进入渲染回调 get_action(),您可以在其中处理验证 - 可能想要重命名为更相关的内容,即 validateForm()