Как я могу реализовать Google Recaptcha v3 в форме PHP?

Я хотел бы вставить контактную форму новой версии (V3) Recaptcha.

Я искал разные решения, но они показывают только часть кода, они неполные, или я получаю ошибку, и большинство найденных решений очень сложны для чего-то такого простого, и я не понимаю код.

3 ответа

Я искал этот и другие форумы, чтобы внедрить новую версию ReCaptcha (V3) в моих формах. Мне нужно было знать, как:

  • Вставьте это с JS
  • Как проверить это с помощью PHP
  • Какие новые поля были нужны в моей форме.

Я не нашел ни одного простого решения, которое показывало бы мне все эти моменты, или оно было слишком сложным для тех, кто просто хотел вставить контактную форму на своем веб-сайте.

В конце, взяв несколько частей кода нескольких решений, я использую простой и многократно используемый код, в который вам нужно только вставить соответствующие ключи.

Вот.

Основной код JS

<script src="https://www.google.com/recaptcha/api.js?render=your reCAPTCHA site key here"></script>
<script>
    grecaptcha.ready(function() {
    // do request for recaptcha token
    // response is promise with passed token
        grecaptcha.execute('your reCAPTCHA site key here', {action:'validate_captcha'})
                  .then(function(token) {
            // add token value to form
            document.getElementById('g-recaptcha-response').value = token;
        });
    });
</script>

Основной HTML-код

<form id="form_id" method="post" action="your_action.php">
    <input type="hidden" id="g-recaptcha-response" name="g-recaptcha-response">
    <input type="hidden" name="action" value="validate_captcha">
    .... your fields
</form>

Основной код PHP

    if(isset($_POST['g-recaptcha-response'])){
        $captcha=$_POST['g-recaptcha-response'];
    }
    else
        $captcha = false;

    if(!$captcha){
        //Do something with error
    }
    else{
        $secret = 'Your secret key here';
        $response=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=
            .$secret.&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR']);
        if($response.success==false)
        {
            //Do something with error
        }
    }
... The Captcha is valid you can continue with the rest of your code

Вам нужно только добавить свои ключи, больше никаких изменений не требуется:

    src="https://www.google.com/recaptcha/api.js?render=your reCAPTCHA site key here"    
    grecaptcha.execute('your reCAPTCHA site key here'

а также

    $secret = 'Your secret key here';

Очевидно, вы также должны изменить действие формы, в этом примере:

    action = "your_action.php"

В приведенном выше ответе эти строки необходимо обновить, чтобы иметь возможность читать значения ответа в PHP:

          $response = json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secret."&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR']));

    $response->{'success'}

    $response->{'score'}

Похоже, Google улучшил свои документы с момента первых ответов. Вот как я это делаю.

Интеграция на стороне клиента в форме:

Документы для этого находятся здесь: https://developers.google.com/recaptcha/docs/v3 .

Согласно Google, вы должны включать API Recaptcha на каждую страницу, чтобы он мог наблюдать за поведением пользователя. Поэтому я добавил эту строку в конец нижнего колонтитула, который есть на каждой странице (параметры не требуются):

      <script src="https://www.google.com/recaptcha/api.js"></script>

В форме вы используете кнопку отправки следующим образом:

      <button class="g-recaptcha" data-sitekey="PASTE-YOUR-RECAPTCHA-SITE-KEY-HERE" data-callback="onSubmit" data-action="submit">Submit Form</button>

И добавьте следующую функцию JavaScript, которая отправляет форму:

      function onSubmit() {
    var form = document.forms[0]; // change this if you have multiple forms

    if (/* possible client-side form validation code here */) {
        form.submit();
    }
}

Код проверки на стороне сервера:

Документы для этого находятся здесь: https://developers.google.com/recaptcha/docs/verify

Для этого я создал вспомогательную функцию:

      /**
 * Checks if the current script has a valid Google Captcha response token.
 * @returns True, if the script has a valid repsonse token, otherwise false.
 */
function isCaptchaValid()
{
    $captcha = isset($_POST['g-recaptcha-response']) ? $_POST['g-recaptcha-response'] : false;

    if (!$captcha) {
        return false;
    }

    $postdata = http_build_query(
        array(
            "secret" => "PASTE-YOUR-RECAPTCHA-SECRET-KEY-HERE",
            "response" => $captcha,
            "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);
    $googleApiResponse = file_get_contents("https://www.google.com/recaptcha/api/siteverify", false, $context);

    if ($googleApiResponse === false) {
        return false;
    }

    $googleApiResponseObject = json_decode($googleApiResponse);

    return $googleApiResponseObject->success;
}

Не нужно проверять какое-либо значение оценки, как это делается в других ответах. Согласно документам, в объекте ответа нет даже свойства score. Я проверил его, и он есть, но я им не пользуюсь.

Вы должны вызвать его в начале PHP-скрипта, который обрабатывает отправку формы следующим образом:

      if (!isCaptchaValid()) {
    die("STOP! You are a bot."); // or do something else
}
Другие вопросы по тегам