Google ReCaptcha没有发布' g-recaptcha-response'

时间:2015-06-06 17:08:00

标签: php recaptcha

之前已经问过这个问题:New Google ReCaptcha not posting/receiving 'g-recaptcha-response' - 但没有正确答案。

我和他的设置完全一样,但代码在这里失败了:

if(!$captcha){
   exit;
}

所以$captcha=$_POST['g-recaptcha-response']似乎是空的。

new google recaptcha with checkbox server side php =这里的第二个答案似乎也无效。

有谁知道为什么会发生这种情况?

11 个答案:

答案 0 :(得分:17)

我遇到了这个问题,发现我的表单在DOM中过早关闭,因为它位于表中。 ReCaptcha设置一个显示:无g-recaptcha-response textarea,然后在完成验证码时填写数据。它似乎寻找div所处形式的孩子,因此无法找到它最初创建的g-recaptcha-response。我把表格放在桌子周围,之后就可以了。

答案 1 :(得分:4)

今天我在同事的网站上遇到了同样的问题(g-recaptcha-response在提交时没有价值)。事实证明,标记<form错误地嵌套在开头标记<table之后(不在td中,而是直接在<table之后)。
这导致了这个问题 移动标记form后,它会包裹tableg-recaptcha-response的值在提交后正确发布到服务器端。

答案 2 :(得分:3)

检查向用户显示表单的部分中是否有以下内容

  1. <form></form>之间:

    <div class="g-recaptcha" data-sitekey="your_public_key"></div>

  2. 在结束</head>代码之前:

    <script src='https://www.google.com/recaptcha/api.js'></script>

  3. 检查您的表单是否使用post作为方法,...

    <form method="post" ...>

  4. 如果这些都是正确的,那么至少应该有一些$_POST['grecaptcha-response']。在生成的客户端html代码中检查第一个(在许多浏览器中,通过按Strg + U查看用户表单) - 而不是服务器端代码 - 更容易使用该知识。如果所有这些都在客户端就位,那么这将是一个艰难的^^

答案 3 :(得分:1)

刚遇到同样的问题。它不是导致问题的<table>标记,而是导致问题的<div>标记。

我的表单位于用于格式化表单总体布局的主<div>内。 <form>代码不必位于我用于表单布局的主<div>中。我在表单布局<form>标记之前移动了<div>标记,它开始完美运行。

答案 4 :(得分:1)

Google似乎希望您的开始和结束标记不在<table><div>等其他DOM元素之内。我有完全相同的问题,现在已经解决了。移动你的......

<div class="g-recaptcha" data-sitekey="abcd1234etc."></div>

...代码到任何或标签之外,它将起作用。好像Google无法找到表单并注入其表单值。

答案 5 :(得分:0)

首先检查是否设置了recaptcha

if(!isset($_POST['g-recaptcha-response']) ){
    die ("Error: Not valid recaptcha on form");
}

另请查看此simple PHP tutorial以进行简单调试。

答案 6 :(得分:0)

是的,错误是DOM

代码错误

table width="100%" border="0" cellspacing="0" cellpadding="0" align="center"
form id="contacto" name="contacto" method="post" action="xxx"

代码确定


form id="contacto" name="contacto" method="post" action="xxx"
table width="100%" border="0" cellspacing="0" cellpadding="0" align="center"

答案 7 :(得分:0)

完美的解决方案是不要创建自己的 g-recaptcha-response 输入,因为谷歌会用响应填充它,然后继续创建另一个 g-recaptcha-response textarea但不会用响应值填充它

答案 8 :(得分:0)

如果您使用的是reCaptcha v3,则必须在表单中通过附加ID来明确定义 g-recaptcha-response

如果您使用的是reCaptcha v2,则只需确保将recaptchacontainer与您一起放在表单中

答案 9 :(得分:0)

以上都不对我有用。我正在使用react-google-recaptcha。看来您必须事先等待/解决recaptchaRef.current.execute()承诺。

在没有兑现承诺的情况下,它工作了一半时间,也就是我打电话给recaptchaRef.current.getValue()的时候。否则它将返回一个空值。

答案 10 :(得分:0)

在以波尔图主题html5制作的网站上,我遇到了同样的问题。 负责验证的javascript代码是手动传递的字段,因此有必要添加g-captcha-response字段。

在“ view.contact.js”中

// Ajax Submit
$.ajax({
    type: 'POST',
    url: $form.attr('action'),
    dataType: 'JSON',
    data: {
        name: $form.find('#name').val(),
        email: $form.find('#email').val(),
        subject: $form.find('#subject').val(),
        messaggio: $form.find('#messaggio').val(),
        grecaptcharesponse: $form.find('#g-recaptcha-response').val()
    }

...

并在php页面中进行更改 $_POST['g-recaptcha-response'] with $_POST['grecaptcharesponse']