最近,谷歌彻底彻底检查了他们的reCaptcha API,并将其简化为一个复选框。
问题是,我可以提交包含reCaptcha的表单而不检查它,表单将忽略reCaptcha。
在您必须使用私钥等将表单发送到PHP文件之前,我在他们的开发人员指南中没有看到任何提及。我不知道如何验证表单以确保用户填写新的reCaptcha。
我错过了什么吗?是否仍需要具有私钥的PHP文件?
到目前为止,我所有的reCaptcha都是:
<div data-type="image" class="g-recaptcha" data-sitekey="My Public Key"></div>
答案 0 :(得分:62)
如果您想检查用户是否点击了I'm not a robot
复选框,您可以使用reCaptcha API提供的.getResponse()
功能。
如果用户没有验证自己,它将返回一个空字符串,如下所示:
if (grecaptcha.getResponse() == ""){
alert("You can't proceed!");
} else {
alert("Thank you");
}
如果用户已经验证了自己,则响应将是一个非常长的字符串。
有关API的更多信息,请访问此页面:reCaptcha Javascript API
答案 1 :(得分:14)
var googleResponse = jQuery('#g-recaptcha-response').val();
if (!googleResponse) {
$('<p style="color:red !important" class=error-captcha"><span class="glyphicon glyphicon-remove " ></span> Please fill up the captcha.</p>" ').insertAfter("#html_element");
return false;
} else {
return true;
}
把它放在一个函数中。在提交时调用此函数... #html_element
是我的空div。
答案 2 :(得分:13)
您可以根据Google reCAPTCHA documentation
以3种方式验证回复 g-recaptcha-response
:用户选中复选框(我不是机器人)后,您的HTML中会填充ID为g-recaptcha-response
的字段。
您现在可以使用此字段的值来了解用户是否是机器人,使用下面的mentioed行: -
var captchResponse = $('#g-recaptcha-response').val();
if(captchResponse.length == 0 )
//user has not yet checked the 'I am not a robot' checkbox
else
//user is a verified human and you are good to submit your form now
在您提交表单之前,您可以拨打以下电话: -
var isCaptchaValidated = false;
var response = grecaptcha.getResponse();
if(response.length == 0) {
isCaptchaValidated = false;
toast('Please verify that you are a Human.');
} else {
isCaptchaValidated = true;
}
if (isCaptchaValidated ) {
//you can now submit your form
}
您可以按如下方式显示您的reCAPTCHA: -
<div class="col s12 g-recaptcha" data-sitekey="YOUR_PRIVATE_KEY" data-callback='doSomething'></div>
然后在JavaScript中定义该函数,该函数也可用于提交表单。
function doSomething() { alert(1); }
现在,一旦选中了复选框(我不是机器人),您将收到已定义回调的回调,在您的情况下为doSomething
。
答案 3 :(得分:10)
从用户体验的角度来看,它可以帮助用户明白何时可以继续提交表单 - 通过启用禁用按钮,或者只是使按钮可见。
这是一个简单的例子......
<form>
<div class="g-recaptcha" data-sitekey="YOUR_PRIVATE_KEY" data-callback="recaptchaCallback"></div>
<button type="submit" class="btn btn-default hidden" id="btnSubmit">Submit</button>
</form>
<script>
function recaptchaCallback() {
var btnSubmit = document.getElementById("btnSubmit");
if ( btnSubmit.classList.contains("hidden") ) {
btnSubmit.classList.remove("hidden");
btnSubmitclassList.add("show");
}
}
</script>
答案 4 :(得分:2)
试试这个链接: https://github.com/google/ReCAPTCHA/tree/master/php
该页面的最新信息发布了该页面的链接: https://developers.google.com/recaptcha/intro
我提出的一个阻止这两个文件正常工作的问题是我的网站php.ini文件。确保正确设置此属性,如下所示: allow_url_fopen =开启
答案 5 :(得分:2)
使用JavaScript时对我有用
<script src='https://www.google.com/recaptcha/api.js'></script>
<script>
function submitUserForm() {
var response = grecaptcha.getResponse();
if(response.length == 0) {
document.getElementById('g-recaptcha-error').innerHTML = '<span style="color:red;">This field is required.</span>';
return false;
}
return true;
}
function verifyCaptcha() {
document.getElementById('g-recaptcha-error').innerHTML = '';
}
</script>
<form method="post" onsubmit="return submitUserForm();">
<div class="g-recaptcha" data-sitekey="YOUR_SITE_KEY" data-callback="verifyCaptcha"></div>
<div id="g-recaptcha-error"></div>
<input type="submit" name="submit" value="Submit" />
</form>
答案 6 :(得分:1)
您可以先在前端验证是否已标记复选框:
var recaptchaRes = grecaptcha.getResponse();
var message = "";
if(recaptchaRes.length == 0) {
// You can return the message to user
message = "Please complete the reCAPTCHA challenge!";
return false;
} else {
// Add reCAPTCHA response to the POST
form.recaptchaRes = recaptchaRes;
}
然后在服务器端使用Google reCAPTCHA API验证收到的响应:
$receivedRecaptcha = $_POST['recaptchaRes'];
$verifiedRecaptcha = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$google_secret.'&response='.$receivedRecaptcha);
$verResponseData = json_decode($verifiedRecaptcha);
if(!$verResponseData->success)
{
return "reCAPTCHA is not valid; Please try again!";
}
有关详情,请访问Google docs。
答案 7 :(得分:1)
在表单提交后验证Google reCapcha是否有效
if ($post['g-recaptcha-response']) {
$captcha = $post['g-recaptcha-response'];
$secretKey = 'type here private key';
$response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=" . $secretKey . "&response=" . $captcha);
$responseKeys = json_decode($response, true);
if (intval($responseKeys["success"]) !== 1) {
return "failed";
} else {
return "success";
}
}
else {
return "failed";
}
答案 8 :(得分:0)
//validate
$receivedRecaptcha = $_POST['recaptchaRes'];
$google_secret = "Yoursecretgooglepapikey";
$verifiedRecaptchaUrl = 'https://www.google.com/recaptcha/api/siteverify?secret='.$google_secret.'&response='.$receivedRecaptcha;
$handle = curl_init($verifiedRecaptchaUrl);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false); // not safe but works
//curl_setopt($handle, CURLOPT_CAINFO, "./my_cert.pem"); // safe
$response = curl_exec($handle);
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
curl_close($handle);
if ($httpCode >= 200 && $httpCode < 300) {
if (strlen($response) > 0) {
$responseobj = json_decode($response);
if(!$responseobj->success) {
echo "reCAPTCHA is not valid. Please try again!";
}
else {
echo "reCAPTCHA is valid.";
}
}
} else {
echo "curl failed. http code is ".$httpCode;
}
答案 9 :(得分:0)
我想到的一个阻止这两个文件正常工作的问题是我的网站的for(int i = 0;i<input.length;i++){
if(repeat(input[i])){
System.out.println("The answer is " + input[i] + " at index " + i);
break;//you find it! Now break the loop
}
}
文件。确保正确设置此属性,如下所示:
php.ini
答案 10 :(得分:-1)
将reCaptcha
与reCaptcha
DLL
文件一起使用时,我们可以在C#
中进行验证。
RecaptchaControl1.Validate();
bool Varify = RecaptchaControl1.IsValid;
if (Varify)
{
// Pice of code after validation.
}
它为我工作。
答案 11 :(得分:-1)
var googleResponse = $('#g-recaptcha-response').val();
if(googleResponse=='')
{
$("#texterr").html("<span>Please check reCaptcha to continue.</span>");
return false;
}