这个问题以前有人问过:新的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。我把表单放在桌子周围,然后它就可以正常工作了。
检查在向用户显示表单的部分是否有以下内容:
-
<form>
和</form>
之间:<div class="g-recaptcha" data-sitekey="your_public_key"></div>
-
关闭
</head>
标签前:<script src='https://www.google.com/recaptcha/api.js'></script>
-
检查你的表单使用
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教程,以便进行简单的调试。