reCaptcha 不工作;它没有 return 成功
reCaptcha isn't working; it doesn't return success
我的表单需要一个验证码,但我在服务器端集成方面遇到了一些问题。
表单包含四种类型的数据:
- 名字
- 电子邮件
- 评论。
确定其中none个为空后,我要验证验证码。但是,由于某种原因,它总是 returns success == false
。
有人可以帮我找出我的代码有什么问题吗?
function validate($data)
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
$nameMsgErr = $emailErr = $msgSuccess = $error = "";
if(!empty($_POST['name_msg']) && !empty($_POST['email']) && !empty($_POST['subject']) && !empty($_POST['message'])) {
$url = 'https://www.google.com/recaptcha/api/siteverify';
$private_key = '------Private Key--------';
$response = file_get_contents($url . "?secret=" . $private_key . "&response=" . $_HOST['g-recaptcha-response'] . "&remoteip=" . $_SERVER['REMOTE_ADDR']);
$data = json_decode($response);
if(isset($data->success) AND $data->success == true) {
$name = validate($_POST['name_msg']);
$email = validate($_POST['email']);
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$emailErr = "Wrong email format";
} else {
$subject = validate($_POST['subject']);
$msg = validate($_POST['message']);
$msg .= "\r\n" . $name;
$msg = wordwrap($msg, 70, "\r\n");
$header = "From: " . $email;
mail("myemail9@gmail.com", $subject, $msg, $header);
$msgSuccess = "Message successfully sent";
}
} else {
$error = "Error";
}
}
您使用了错误的 HTTP 方法来验证用户响应。在您的代码中,您使用 file_get_contents
并且它正在发送一个 GET 请求,每次 returns false。
如 documentation 所述,您需要向 google 重新验证 api.
发送 POST 请求
请参阅 this 关于使用 file_get_contents
发送 POST 请求的回答
注意:cURL 是更常用的发送 POST 请求的方法,并且可能更容易掌握和实施。我建议使用 cURL 开始。
编辑(添加具体示例,未测试):
$postdata = http_build_query(
array(
'secret' => $private_key,
'response' => $_HOST["g-recaptcha-response"],
'remoteip' => $_SERVER["REMOTE_ADDR"]
)
);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postdata
)
);
$context = stream_context_create($opts);
$response = file_get_contents('https://www.google.com/recaptcha/api/siteverify', FALSE, $context);
这是我添加的:
opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => 'https://www.google.com/recaptcha/api/siteverify/secret='.$private_key.'&response='.$_HOST["g-recaptcha-response"].'&remoteip='.$_SERVER["REMOTE_ADDR"]
)
);
$context = stream_context_create($opts);
$response = file_get_contents($context);
我的表单需要一个验证码,但我在服务器端集成方面遇到了一些问题。
表单包含四种类型的数据:
- 名字
- 电子邮件
- 评论。
确定其中none个为空后,我要验证验证码。但是,由于某种原因,它总是 returns success == false
。
有人可以帮我找出我的代码有什么问题吗?
function validate($data)
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
$nameMsgErr = $emailErr = $msgSuccess = $error = "";
if(!empty($_POST['name_msg']) && !empty($_POST['email']) && !empty($_POST['subject']) && !empty($_POST['message'])) {
$url = 'https://www.google.com/recaptcha/api/siteverify';
$private_key = '------Private Key--------';
$response = file_get_contents($url . "?secret=" . $private_key . "&response=" . $_HOST['g-recaptcha-response'] . "&remoteip=" . $_SERVER['REMOTE_ADDR']);
$data = json_decode($response);
if(isset($data->success) AND $data->success == true) {
$name = validate($_POST['name_msg']);
$email = validate($_POST['email']);
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$emailErr = "Wrong email format";
} else {
$subject = validate($_POST['subject']);
$msg = validate($_POST['message']);
$msg .= "\r\n" . $name;
$msg = wordwrap($msg, 70, "\r\n");
$header = "From: " . $email;
mail("myemail9@gmail.com", $subject, $msg, $header);
$msgSuccess = "Message successfully sent";
}
} else {
$error = "Error";
}
}
您使用了错误的 HTTP 方法来验证用户响应。在您的代码中,您使用 file_get_contents
并且它正在发送一个 GET 请求,每次 returns false。
如 documentation 所述,您需要向 google 重新验证 api.
发送 POST 请求请参阅 this 关于使用 file_get_contents
注意:cURL 是更常用的发送 POST 请求的方法,并且可能更容易掌握和实施。我建议使用 cURL 开始。
编辑(添加具体示例,未测试):
$postdata = http_build_query(
array(
'secret' => $private_key,
'response' => $_HOST["g-recaptcha-response"],
'remoteip' => $_SERVER["REMOTE_ADDR"]
)
);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postdata
)
);
$context = stream_context_create($opts);
$response = file_get_contents('https://www.google.com/recaptcha/api/siteverify', FALSE, $context);
这是我添加的:
opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => 'https://www.google.com/recaptcha/api/siteverify/secret='.$private_key.'&response='.$_HOST["g-recaptcha-response"].'&remoteip='.$_SERVER["REMOTE_ADDR"]
)
);
$context = stream_context_create($opts);
$response = file_get_contents($context);