рекапча не работает; она не возвращает успеха


Мне нужна капча для моей формы, и у меня возникли некоторые проблемы с серверной интеграцией.

Форма принимает четыре типа данных:

  1. имя
  2. электронная почта
  3. комментарий.
Убедившись, что ни одна из них не пуста, я хочу проверить капчу. Однако по какой-то причине он всегда возвращает 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 3

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);