ReCaptcha 2.0 с AJAX

Мне удалось заставить ReCaptcha 2.0 работать на моем сайте. Тем не менее, он работает только тогда, когда я не использую AJAX, и я позволяю форме отправлять «естественно».

Я хочу отправить форму с помощью captcha и предупредить пользователя с записью об успехе без обновления страницы .

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

HTML:

<form class="form" action="javascript:void(0)" novalidate> <!-- all the inputs... --> <!-- captcha --> <div class="input-group"> <div class="g-recaptcha" data-sitekey="6LdOPgYTAAAAAE3ltWQGar80KUavaR-JblgPZjDI"></div> </div> <div class="errors" id="errors" style="display: none"></div> <div class="input-group"> <input type="button" value="Send" class="btn-default right" id="submit"> <div class="clear"></div> </div> </form> 

JS:

 $('#submit').click(function(e) { console.log('clicked submit'); // --> works var $errors = $('#errors'), $status = $('#status'), name = $('#name').val().replace(/<|>/g, ""), // prevent xss email = $('#email').val().replace(/<|>/g, ""), msg = $('#message').val().replace(/<|>/g, ""); if (name == '' || email == '' || msg == '') { valid = false; errors = "All fields are required."; } // pretty sure the problem is here console.log('captcha response: ' + grecaptcha.getResponse()); // --> captcha response: if (!errors) { // hide the errors $errors.slideUp(); // ajax to the php file to send the mail $.ajax({ type: "POST", url: "http://orenurbach.com/assets/sendmail.php", data: "email=" + email + "&name=" + name + "&msg=" + msg + "&g-recaptcha-response=" + grecaptcha.getResponse() }).done(function(status) { if (status == "ok") { // slide down the "ok" message to the user $status.text('Thanks! Your message has been sent, and I will contact you soon.'); $status.slideDown(); // clear the form fields $('#name').val(''); $('#email').val(''); $('#message').val(''); } }); } else { $errors.text(errors); $errors.slideDown(); } }); 

PHP:

 <?php // assemble the message from the POST fields // getting the captcha $captcha = ''; if (isset($_POST['g-recaptcha-response'])) $captcha = $_POST['g-recaptcha-response']; echo 'captcha: '.$captcha; if (!$captcha) echo 'The captcha has not been checked.'; // handling the captcha and checking if it's ok $secret = 'MY_SECRET'; $response = json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secret."&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR']), true); var_dump($response); // if the captcha is cleared with google, send the mail and echo ok. if ($response['success'] != false) { // send the actual mail @mail($email_to, $subject, $finalMsg); // the echo goes back to the ajax, so the user can know if everything is ok echo 'ok'; } else { echo 'not ok'; } ?> 

Результат на странице PHP:

 captcha: The captcha has not been checked.array(2) { ["success"]=> bool(false) ["error-codes"]=> array(1) { [0]=> string(22) "missing-input-response" } } not ok 

Суть в том, как я могу получить ответ ввода вручную без его автоматического перехода с остальными данными POST?

Хорошо, это было довольно глупо.

Я сделал несколько ошибок:

  • В файле PHP все строки имели одинарные кавычки, и это вызывало проблемы.
  • Во время тестирования я добавил несколько файлов в файл PHP, поэтому if (status == "ok") никогда не работал. Я получил электронные письма, но не получил никаких конформаций, которые я сделал, и теперь я понимаю, почему.
  • Когда я хотел проверить, что файл PHP был опущен, я просто перешел на его адрес в URL-адрес и всегда получал ошибку. Даже когда почта была отправлена. Теперь я понимаю, что это неправильный способ проверки журналов.

Спасибо @Samurai, который помог мне разобраться в вещах.


Окончательный код PHP:

 <?php // assemble the message from the POST fields // getting the captcha $captcha = ""; if (isset($_POST["g-recaptcha-response"])) $captcha = $_POST["g-recaptcha-response"]; if (!$captcha) echo "not ok"; // handling the captcha and checking if it's ok $secret = "MY_SECRET"; $response = json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secret."&response=".$captcha."&remoteip=".$_SERVER["REMOTE_ADDR"]), true); // if the captcha is cleared with google, send the mail and echo ok. if ($response["success"] != false) { // send the actual mail @mail($email_to, $subject, $finalMsg); // the echo goes back to the ajax, so the user can know if everything is ok echo "ok"; } else { echo "not ok"; } ?>