Как проверить, что reCaptcha проверен - PullRequest
0 голосов
/ 23 мая 2019

Я создаю контактную форму, которая должна отправлять почту, если установлен флажок Google reCaptcha v2. Теперь он повторяет мой текст, даже если reCaptcha отмечен.

Я пытался передвигаться по фрагменту reCaptcha и пытался выполнить if (isset, но, похоже, не работает.

  $email = $_POST['email'];
  $subject = $_POST['subject'];
  $message = $_POST['message'];

  $errorEmpty = false;
  $errorEmail = false;
  $errorCaptcha = false;

  if(empty($name) || empty($email) || empty($subject) || empty($message)){
    echo "<span style='color: red;font-weight: bold;'>Fyll i alla fält!</span>";
    $errorEmpty = true;
  }
  if(empty($_POST['g-recaptcha-response'])){
    echo "<span style='color: red;font-weight:bold;'>reCaptchan är inte ifylld!</span>";
    $errorCaptcha = true;
  }
   elseif(!filter_var($email, FILTER_VALIDATE_EMAIL)){
     echo "<span style='color: red;font-weight: bold;'>Du måste skriva in en giltig e-mail adress!</span>";
     $errorEmail = true;
   }
    else{
      echo "<span style='color: green;font-weight: bold;'>Ditt meddelande skickades, vi återkommer inom max 3 arbetsdagar!</span>";
    }

    if(isset($_POST['g-recaptcha-response']) && !empty($_POST['g-recaptcha-response'])){
      $secret = '';
      $verifyResponse = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secret.'&response='.$_POST['g-recaptcha-response']);
      $responseData = json_decode($verifyResponse);
      if($responseData->success){
  $to = $email;
  $subject = $subject;
  $text = "Name: $name\n From: $name\n Message: $message";
  $headers = "From: $email";
  if($errorEmpty == false && $errorEmail == false && $errorCaptcha == false){
  mail($to,$subject,$text,$headers);
  }
 }
} // ReCaptcha 2

Я хочу, чтобы функция mail () активировалась, если проверена reCaptcha, в противном случае я хочу передать пользователю текст.

Ответы [ 2 ]

1 голос
/ 24 мая 2019

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

Если вы говорите, что не можете if($responseData->success){ правильно отобразитьподтвердите флажок, я бы порекомендовал вам взглянуть на данные ответа с помощью var_dump($responseData) и посмотреть, если Google пытается вам что-то сказать (неверный секретный ключ, имя домена и т. д.).

В качестве альтернативного подхода вы можете использовать библиотеку Google PHP reCaptcha в качестве более простого метода для решения этой ситуации - мой код, например:

function validateRecaptcha(?String $gRecaptchaResponse) {

    /* API source from: https://github.com/google/recaptcha */

    $recaptcha = new ReCaptcha\ReCaptcha(***SECRET HERE***);

    $resp = $recaptcha->verify($gRecaptchaResponse, $_SERVER['REMOTE_ADDR']);

    return $resp->isSuccess();

}

PS: будьте осторожны, используя empty для проверки ввода пользователя.Если пользователь решил отправить сообщение, содержащее только 0, проверка if(...|| empty($message)){ не удалась бы.

См .: https://www.php.net/manual/en/function.empty.php

0 голосов
/ 27 мая 2019

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

<?php
$error = false;
$output = '';

$name    = $_POST["name"];
$email   = $_POST['email'];
$subject = $_POST['subject'];
$message = $_POST['message'];

if (empty($name) || empty($email) || empty($subject) || empty($message)) {
  $output = "<span style='color: red;font-weight: bold;'>Fyll i alla fält!</span>";
  $error = true;
}
if (empty($_POST['g-recaptcha-response'])) {
  $output = "<span style='color: red;font-weight:bold;'>reCaptchan är inte ifylld!</span>";
  $error = true;
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
  $output =  "<span style='color: red;font-weight: bold;'>Du måste skriva in en giltig e-mail adress!</span>";
  $error = true;
}
if ($error) {
  echo $output;
} else {
  $secretKey = "YOUR-SECRET-KEY";
  $captcha=$_POST['g-recaptcha-response'];
  $url = 'https://www.google.com/recaptcha/api/siteverify?secret=' .
    urlencode($secretKey) .  '&response=' . urlencode($captcha);
  $response = file_get_contents($url);
  $responseKeys = json_decode($response, true);
  if ($responseKeys["success"]) {

    // mail then
    $to = $email;
    $email_subject = $subject;
    $email_body = "Name: $name\n From: $name\n Message: $message";
    //Send the email!
    $mail_check = mail($to, $email_subject, $email_body);
    if ($mail_check) {
      echo "Mail Sent!";
    } else {
      echo 'Mail Failed';
    }
  } else {
    echo 'Response not Success';
  }
}
?>
...