PHP-форма + Google reCAPTCHA

Странно, что документация Google для recaptcha не так полезна, как я думал, это будет. Меня попросили принять текущую существующую форму (которая получает спам несколько раз в день) и обновлять ее с помощью новой recaptcha от Google. Есть много учебников для старого капчи, но не так много для нового. Я просто хочу, чтобы простая форма захватила имя, адрес электронной почты, сообщение, а затем заменила мое текущее «поле борьбы с ботом» на recaptcha (я использовал поле, в котором в основном спрашивали вас, что такое 2 + 2, и если вы ввели что-либо, но 4, он не отправил). Если требуемые поля действительны и вернавка действительна, я хочу, чтобы она отправила мне электронное письмо с содержимым полей формы.

Я прошел через простые шаги:

  1. зарегистрировал мой сайт, чтобы получить ключи

  2. добавлен этот фрагмент внутри моей теги:

    <script src='https://www.google.com/recaptcha/api.js'></script> 
  3. добавлен этот фрагмент в конце моей формы:

     <div class="g-recaptcha" data-sitekey="#MYKEY#"></div> 

На данный момент, recaptcha появляется просто отлично. Но часть на стороне сервера немного запутанна.

Это моя обновленная контактная форма с показанием recaptcha:

 <form method="post" action="contact-post.php"> <label>Your Name (required):</label> <input name="name" type="text" placeholder="Enter your name here"> <label>Email Address (required):</label> <input name="email" type="email" placeholder="Enter your email address here"> <label>Your Message (required):</label> <textarea name="message" placeholder="Write your message here"></textarea> <div style="margin-top:20px;" class="g-recaptcha" data-sitekey="#MYKEY#"></div> <input id="submit" name="submit" type="submit" value="Submit Form"> </form> 

И вот моя текущая страница POST (я не уверен, где добавить код recaptcha):

 <?php $name = $_POST['name']; $email = $_POST['email']; $message = $_POST['message']; $human = $_POST['human']; $from = 'From: My Website'; $to = 'myemail@gmail.com'; $subject = 'Request Form'; $body = "Name: $name \n E-Mail: $email \nMessage:\n$message"; if ($_POST['submit']) { if ($email != '') { if ($human == '4') { if (mail ($to, $subject, $body, $from)) { echo '<p>You have successfully submitted your information to PS4RS. Subscribers to our mailing list will begin to periodically receive updates.</p>'; } else { echo '<p>Something went wrong, go back and try again!</p><p><input type="button" value="Go Back" onclick="history.back(-1)" class="goback" /></p>'; } } else if ($_POST['submit'] && $human != '4') { echo '<p>You answered the anti-spam question incorrectly!</p><p><input type="button" value="Go Back" onclick="history.back(-1)" class="goback" /></p>'; } } else { echo '<p>You need to fill in all required fields!!</p><p><input type="button" value="Go Back" onclick="history.back(-1)" class="goback" /></p>'; } } ?> 

Любая помощь приветствуется. Я чувствую, что это могут быть довольно распространенные люди с людьми, которые пытаются внедрить его в свои текущие рабочие формы.

Проверьте эту ссылку: https://developers.google.com/recaptcha/docs/verify

В нескольких словах вы должны подать запрос на

 https://www.google.com/recaptcha/api/siteverify?secret=YOUR_SECRET&response=RESPONSE_CAME_FROM_YOUR_FORM&remoteip=USER_IP_ADDRESS 

Если YOUR_SECRET является секретным ключом, который вы получили на сайте ReCAPTCHA, USER_IP_ADDRESS может быть получен через массив $_SERVER а RESPONSE_CAME_FROM_YOUR_FORM – это строка, отправленная с вашей формой. Он хранится в $_POST['g-recaptcha-response'] .

Вы можете сделать это через file_get_contents($url) как

 $data = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=YOUR_SECRET&response=RESPONSE_CAME_FROM_YOUR_FORM&remoteip=USER_IP_ADDRESS"); 

В $data вы получите объект JSON, содержащий поле success , которое вы ищете. Если успех неверен, то это не человек, и вы должны exit() . Я предлагаю вам проверить это в начале вашей программы.

Обновление :

Декодирование объекта JSON выглядит так:

 $data = json_decode($data); // This will decode JSON to object if(!$data->success) exit(); 

Обновление :

Иногда file_get_contents($url) не сможет настроить защищенное соединение https. Вместо этого вы можете использовать open_https_url($url) Сделайте свой код похожим:

 <?php $your_secret = "<secret_key_you_received_from_recaptcha_site>"; $client_captcha_response = $_POST['g-recaptcha-response']; $user_ip = $_SERVER['REMOTE_ADDR']; $captcha_verify = open_https_url("https://www.google.com/recaptcha/api/siteverify?secret=$your_secret&response=$client_captcha_response&remoteip=$user_ip"); $captcha_verify_decoded = json_decode($captcha_verify); if(!$captcha_verify_decoded->success) die('DIRTY ROBOT'); $name = $_POST['name']; $email = $_POST['email']; $message = $_POST['message']; $human = $_POST['human']; $from = 'From: My Website'; $to = 'myemail@gmail.com'; $subject = 'Request Form'; $body = "Name: $name \n E-Mail: $email \nMessage:\n$message"; if ($_POST['submit']) { if ($email != '') { if ($human == '4') { if (mail ($to, $subject, $body, $from)) { echo '<p>You have successfully submitted your information to PS4RS. Subscribers to our mailing list will begin to periodically receive updates.</p>'; } else { echo '<p>Something went wrong, go back and try again!</p><p><input type="button" value="Go Back" onclick="history.back(-1)" class="goback" /></p>'; } } else if ($_POST['submit'] && $human != '4') { echo '<p>You answered the anti-spam question incorrectly!</p><p><input type="button" value="Go Back" onclick="history.back(-1)" class="goback" /></p>'; } } else { echo '<p>You need to fill in all required fields!!</p><p><input type="button" value="Go Back" onclick="history.back(-1)" class="goback" /></p>'; } } ?> 

Возможно, вышеупомянутый ответ немного устарел, поскольку Google теперь использует reCaptcha nocaptcha. Я нашел более простой и более полный ответ здесь для использования с вашим отдельным файлом электронной почты php.

Решение имеет простую форму электронной почты с именем и электронной почтой и отдельный файл php для отправки формы. Вы должны быть в состоянии пойти оттуда и настроить свою форму соответственно. Решение работало для меня.

https://stackoverflow.com/a/27439796/3934886

и ссылку на учебник:

http://codeforgeek.com/2014/12/google-recaptcha-tutorial/