рекапча не работает; она не возвращает успеха
Мне нужна капча для моей формы, и у меня возникли некоторые проблемы с серверной интеграцией.
Форма принимает четыре типа данных:
- имя
- электронная почта
- комментарий.
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 .= "rn" . $name;
$msg = wordwrap($msg, 70, "rn");
$header = "From: " . $email;
mail("myemail9@gmail.com", $subject, $msg, $header);
$msgSuccess = "Message successfully sent";
}
} else {
$error = "Error";
}
}
2 ответа:
Вы используете неправильный метод HTTP для проверки ответа пользователя. В коде вы используете
file_get_contents
, и он отправляет запрос GET, который возвращает false каждый раз.Как указано в документации , вам необходимо отправить запрос POST в Google recaptcha api.
Смотрите Этот ответ на отправку почтового запроса с помощью
file_get_contents
Примечание: cURL является более распространенным методом отправки почтовых запросов и может быть намного проще в понимании и реализации. Я бы предложил использовать завиток для начала.
Edit (добавлен конкретный пример, не протестирован):
$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);