Интеграция reCapcha в форму обратной связи

Статус
Закрыто для дальнейших ответов.

mamogayo

Новичок
Регистрация
16.03.2019
Сообщения
2
Здравствуйте, формучане! Всех с наступающей весной!
Нужна помощь очень-очень!

Не получается интегрировать reCapcha от гугла в свою форму обратной связи.


reCapcha скопировала по рецепту с этого сайта:https://phpjs.ru/2017/07/18/google-captcha-v2/

Там в самом начале сказано, что, цитирую: "в конце статьи есть способ проверки капчи всего лишь 3мя строчками кода."

Ну, так я и сделала. Скопировала разметку,




Код:
<!--капча от гугла-->
<form action="" method="post">
 <div class="g-recaptcha" data-sitekey="_______-________"></div>
 <script type="text/javascript"
 src="https://www.google.com/recaptcha/api.js?hl=<?php echo $lang; ?>">
 </script>
затем эти самые 3 строчки в файл post.php.

Код:
<?php 
$recaptcha_secret = '_____-__';
$response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$recaptcha_secret."&response=".$_POST['g-recaptcha-response']);  
$result = json_decode($response, true);
Капча работает.

Затем скопировала уже свою, готовую форму обратной связи:
1. в index.html, поместив блок с капчей перед кнопкой отправки.

Код:
<body>
<form action="" id="form">
<div><input name="email" placeholder="Email" data-validation="email" data-validation-error-msg="Введите верный Email!"></div>
<div><input name="alias" placeholder="Имя" data-validation="length" data-validation-length="min2" data-validation-error-msg="Слишком короткое имя! Нужно от 2-х символов!"></div>
<div><input name="phone" placeholder="Телефон" type="number" data-validation="number" data-validation-error-msg="Допустимы только цифры!"></div>
<div><textarea name="message" placeholder="Сообщение" data-validation="length" data-validation-length="min10" data-validation-error-msg="Сообщение должно быть длинее 10 символов!"></textarea></div>

<!--капча от гугла-->
<form action="" method="post">
 <div class="g-recaptcha" data-sitekey="_______-______"></div>
 <script type="text/javascript"
 src="https://www.google.com/recaptcha/api.js?hl=<?php echo $lang; ?>">
 </script>
 <br/>
 <!--<input type="button" value="submit" />-->
 </form>
<input type="button" value="Отправить сообщение">
</form>
<div class='result'></div>




<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js'></script>
<script>window.JQuery || document.write('<script src="js/jquery-3.1.1.min.js"><\/script>');</script>
<script src='js/jquery.form-validator.min.js'></script>
<script src='js/script.js'></script>
</body>
</html>
2. в post.php, сразу после кода проверки капчи:

Код:
<?php 
$recaptcha_secret = '__-___';
$response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$recaptcha_secret."&response=".$_POST['g-recaptcha-response']);  
$result = json_decode($response, true); 

//форма обратной связи
if (!empty($_POST['alias']) AND !empty($_POST['email']) AND !empty($_POST['message']) AND empty($_POST['name'])){ 
  
  $headers = "From: ФИО \r\n".    
  $headers .= 'Reply-To: ***@gmail.com'.  // $headers .=
  $headers .= 'X-Mailer: PHP/'. phpversion();
             
  $theme = 'Новое сообщение';

  $letter = "Данные сообщения:\r\n";
  $letter .='Имя: '.$_POST['alias']."\r\n";  
  $letter .='Email: '.$_POST['email']."\r\n";
  $letter .='Телефон: '.$_POST['phone']."\r\n";
  $letter .='Сообщение: '.$_POST['message']."\r\n";
  $letter = $_POST['name'];  
  

  if (mail('***@gmail.com', $theme, $letter, $headers)){
    echo "Сообщение отправлено!";
  } else {
    echo "Ошибка при отправке!";
  }
} else {
  echo "Ошибка: Заполните все поля!";
}
?>
Форма, естественно, всё отправляет, игнорируя капчу.

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

Подозреваю, что нужно что-то вроде этой строчки:

Код:
if ($resp->isSuccess()):
(это из кода, любезно предоставленного по ссылке, которую я оставляла в самом начале поста)
вставить где-то между этих двух строк обработки формы обратной связи:
Код:
if (mail('***@gmail.com', $theme, $letter, $headers)){
    echo "Сообщение отправлено!";
и/или как-то упомянуть в самом начале обработки в этой строке:

Код:
if (!empty($_POST['alias']) AND !empty($_POST['email']) AND !empty($_POST['message']) AND empty($_POST['name'])){
На всякий случай, скрипт JS:
Код:
$.validate({
  borderColorOnError : 'red'
});


$('[type="button"]').click(function() {
  errors = [];
  if( !$('#form').isValid() ) {
    //displayErrors( errors );
  } else {
    $.post( 
    
    "post.php", //url
    
    { //данные из форм
      email: $('[name="email"]').val(),
      alias: $('[name="alias"]').val(),
      phone: $('[name="phone"]').val(),
      message: $('[name="message"]').val(),
      name: $('[name="name"]').val()    
    }, 
    
    function( data ) { 
      $( ".result" ).html(data);
    }
    
    );
  }

});

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

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 138
mamogayo сказал(а):
Подозреваю, что нужно что-то вроде этой строчки:
Всё верно подозреваешь.
А также надо блок запроса к Гуглу перенести внутрь условия, чтобы не делать лишние запросы.
Получается примерно так
Код:
if (!empty($_POST['alias']) AND ..... AND empty($_POST['name'])){ // Твоя проверка формы

// верхнее условие пройдено, делаем запрос к гуглу
$recaptcha_secret = '_____-__';
$response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$recaptcha_secret."&response=".$_POST['g-recaptcha-response']);  
$result = json_decode($response, true);
// и тут же проверяем его
// if ($resp->isSuccess())
// только можно обратную проверку
if (!$resp->isSuccess()){
   echo "Ошибка при отправке! Не верная капча";
   exit; // Останавливаем скрипт
}
// далее твой старый код
И обязательно надо все твои
Код:
$letter .='Имя: '.$_POST['***']."\r\n";
Обернуть хотя бы в htmlspecialchars
Код:
$letter .='Имя: '.htmlspecialchars($_POST['***'])."\r\n";
 

mamogayo

Новичок
Регистрация
16.03.2019
Сообщения
2
Banru, спасибо за ответ.
Но теперь возникает ошибка в браузере:

Fatal error: Call to a member function isSuccess() on null

Ругается на эту строчку:

if (!$resp->isSuccess()){

Пробовала писать $response (ведь в коде выше у меня есть такая переменная) вместо $resp, та же ошибка.
Пробовала писать

$resp = $response;
перед

if (!$resp->isSuccess()){

РПочитала, что такое проверка на существование, написала это:

if (isset($resp))(!$resp->isSuccess()){
echo "Ошибка при отправке! Не верная капча";
exit; // Останавливаем скрипт
}
Браузер нашёл лишнюю скобку '{'. То же самое с $response. Нужно ли в этом случае делать такую проверку или существуют другие решения, не подскажешь?

Или так (нашла у кого-то в коде):

$resp = $recaptcha->verify($_POST['g-recaptcha-response'], $_SERVER['REMOTE_ADDR']);
Это строчка 14. На что браузер отвечает:
Код:
Fatal error: Call to a member function verify() on null ... on line 14
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 138
mamogayo сказал(а):
РПочитала, что такое проверка на существование, написала это:
Плохо почитали
Код:
if( isset($resp) && !$resp->isSuccess() ){
   echo "Ошибка при отправке! Не верная капча";
   exit; // Останавливаем скрипт
}
Но такое нельзя использовать. Если капча не пройдёт валидацию и/или не вернётся ответ, то капча посчитается правильной.
С другой стороны такой метод полезен, например для комментариев, на случай отказа (отключится, отвалится) рекапчи, люди смогут писать комментарии, но и спамеры тоже.

Некогда разбираться. Попробуйте тогда как в инструкции
Код:
if (!empty($_POST['alias']) AND ..... AND empty($_POST['name'])){ // Твоя проверка формы

// верхнее условие пройдено, делаем запрос к гуглу
$recaptcha_secret = '_____-__';
$response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$recaptcha_secret."&response=".$_POST['g-recaptcha-response']);  
$result = json_decode($response, true);
// и тут же проверяем его
// if ($resp->isSuccess())
// только можно обратную проверку
if ($resp->isSuccess()){
   // далее твой старый код
}else{
   echo "Ошибка при отправке! Не верная капча";
   exit; // Останавливаем скрипт
}
Если не заработает, то вероятно у вас пробелемы с подключение к рекапчи, например неправильный ключ.
 
Статус
Закрыто для дальнейших ответов.
Верх Низ