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


Google ReCaptcha not posting 'g-recaptcha-response'

这个问题以前有人问过:新的Google ReCaptcha没有发布/接收'g- recapcha -response'——但是没有合适的答案。

我有和他完全相同的设置,但是这里的代码失败了:

if(!$captcha){
   exit;
}

所以$captcha=$_POST['g-recaptcha-response']看起来是空的。

new google recaptcha with checkbox server side php =这里的第二个答案似乎也不起作用。

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

我遇到了这个问题,并发现我的表单在DOM中过早关闭,因为它在一个表中。ReCaptcha设置一个显示:none g-recaptcha-response文本区域,然后在您完成captcha时填充数据。它似乎在寻找div所在表单的子窗体,因此找不到它最初创建的g-recaptcha-response。我把表单放在桌子周围,然后它就可以正常工作了。

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

  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" ...>

如果这些都是正确的,至少一些$_POST['grecaptcha-response']应该来你的方式。首先在生成的客户端html代码中检查这些(在许多浏览器中,在查看用户表单时按下Strg + U)—而不是服务器端代码—使用这些知识更容易。如果所有这些都在客户端,这将是一个困难的^^

今天我在一个同事的网站上遇到了同样的问题(g-recaptcha-response在提交时没有价值)。原来,标签<form错误地嵌套在开始标签<table之后(不是在td中,而是直接在<table之后)。
这就是导致问题的原因。
在将标签form移动到包装table的方式之后,g-recaptcha-response的值在提交后被正确地发布到服务器端。

刚刚遇到了同样的问题。这不是一个<table>标签造成的问题,而是一个<div>标签造成的问题。

我的表单是在一个主要的<div>用于格式化表单的总体布局。<form>标签不必在主<div>我使用的形式布局。我移动了<form>标签就在我的表单布局<div>标签之前,它开始完美地工作。

似乎谷歌希望你的开始和结束标签是在其他DOM元素,如<table><div>之外。我也有同样的问题,现在已经解决了。移动你的…

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

…代码到任何或标记之外,它将工作。似乎谷歌无法找到表单并注入表单值。

我在一个用porto主题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']

我也遇到了同样的问题。在切换到Rails 7并通过Turbo-Hotwire提交表单之后,g-recaptcha-response总是空的。我可以通过将noscript: false添加到recaptcha标签来解决它。现在看起来是这样的,它与Turbo一起工作得很好:

<%= recaptcha_tags noscript: false %>

是的,错误是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"

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

填充它

如果您正在使用reCaptcha v3,您必须通过附加ID在表单中显式定义g-recaptcha-response

如果您使用的是reCaptcha v2,只需确保在表单中添加recaptchcontainerwith

以上方法对我都不起作用。我使用react-google-recaptcha。似乎你必须等待/解决recaptchaRef.current.execute()承诺事先。

不解决承诺,它工作了一半的时间,这是当我调用recaptchaRef.current.getValue()。否则它将返回一个空值。

无论如何,服务器的PHP INI配置必须接受"允许将url作为文件打开",否则reCaptcha返回空

首先检查是否设置了recaptcha

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

还可以看一下这个简单的PHP教程,以便进行简单的调试。