Добавление reCAPTCHA в action.php

#php #html #recaptcha

#php #HTML #recaptcha

Вопрос:

Будучи разработчиком-любителем, который умеет вырезать и вставлять, я пытаюсь добавить reCAPTCHA v2 на старый веб-сайт html / php,

У меня работает captcha, единственная проблема в том, что при отправке формы она отправляется по фактическому адресу /action.php и отображает некоторый код сообщение «Спасибо».

          <?php
if($_POST) {

require('constant.php'); 

$user_name      = filter_var($_POST["name"], FILTER_SANITIZE_STRING);
$user_email     = filter_var($_POST["email"], FILTER_SANITIZE_EMAIL);
$user_phone     = filter_var($_POST["phone"], FILTER_SANITIZE_STRING);
$content   = filter_var($_POST["content"], FILTER_SANITIZE_STRING);

if(empty($user_name)) {
    $empty[] = "<b>Name</b>";       
}
if(empty($user_email)) {
    $empty[] = "<b>Email</b>";
}
if(empty($user_phone)) {
    $empty[] = "<b>Phone Number</b>";
}   
if(empty($content)) {
    $empty[] = "<b>Comments</b>";
}

if(!empty($empty)) {
    $output = json_encode(array('type'=>'error', 'text' => implode(", ",$empty) . ' Required!'));
    die($output);
}

if(!filter_var($user_email, FILTER_VALIDATE_EMAIL)){ //email validation
    $output = json_encode(array('type'=>'error', 'text' => '<b>'.$user_email.'</b> is an invalid Email, please correct it.'));
    die($output);
}

//reCAPTCHA validation
if (isset($_POST['g-recaptcha-response'])) {

    require('component/recaptcha/src/autoload.php');        

    $recaptcha = new ReCaptchaReCaptcha(SECRET_KEY, new ReCaptchaRequestMethodSocketPost());

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

      if (!$resp->isSuccess()) {
            $output = json_encode(array('type'=>'error', 'text' => '<b>Captcha</b> Please try the captcha again!'));
            die($output);               
      } 
}

$toEmail = "email@email.com";
$mailHeaders = "From: " . $user_name . "<" . $user_email . ">rn";
    $mailBody = "User Name: " . $user_name . "n";
$mailBody .= "User Email: " . $user_email . "n";
$mailBody .= "Phone: " . $user_phone . "n";
$mailBody .= "Content: " . $content . "n";
if (mail($toEmail, "Contact Mail", $mailBody, $mailHeaders)) {
    $output = json_encode(array('type'=>'message', 'text' => 'Hi '.$user_name .', thank you for the comments. We will get back to you shortly.'));
    die($output);
} else {
    $output = json_encode(array('type'=>'error', 'text' => 'Unable to send email, please contact'.SENDER_EMAIL));
    die($output);
}
}?>
  

HTML выглядит следующим образом

     <form id="frmContact" action="action.php" method="POST" novalidate="novalidate">
<div class="label">Name:</div>
<div class="field">
    <input type="text" id="name" name="name"
        placeholder="enter your name here"
        title="Please enter your name" class="required"
        aria-required="true" required>
</div>
<div class="label">Email:</div>
<div class="field">
    <input type="text" id="email" name="email"
        placeholder="enter your email address here"
        title="Please enter your email address"
        class="required email" aria-required="true" required>
</div>
<div class="label">Phone Number:</div>
<div class="field">
    <input type="text" id="phone" name="phone"
        placeholder="enter your phone number here"
        title="Please enter your phone number"
        class="required phone" aria-required="true" required>
</div>
<div class="label">Comments:</div>
<div class="field">
    <textarea id="comment-content" name="content"
        placeholder="enter your comments here"></textarea>
</div>
<div class="g-recaptcha" data-sitekey="**My-Site-Key**"></div>
<div id="mail-status"></div>
<button type="Submit" id="send-message" style="clear: both;">Send
    Message</button>
  

Он отображает следующее
Скриншот

Я надеялся заставить его не загружать новую веб-страницу, а просто отображать сообщение ниже или что-то в этомроде.

Любые рекомендации были бы высоко оценены, Пит

Комментарии:

1. Если вы не хотите повторно загружать свою страницу, используйте AJAX (javascript, который вызывает вашу страницу php, ожидает результата, а затем что-то делает — показывает какое-то сообщение, …)

2. Отображается ли виджет Captcha на вашей странице? При отправке формы имеет ли она значение captcha ( g-recaptcha-response )? На первый взгляд я вижу, что вы проверяете captcha только в том случае, если она была отправлена (и вы всегда должны проверять ее или завершать работу, если она не отправлена)

Ответ №1:

Я только что понял, что проблема в том, что вы используете другую страницу для обработки recaptcha. Если вы добавите HTML в конец страницы php вместо этого, вы можете использовать ту же страницу как для формул HTML, так и для обработки PhP. (в старой части ниже я думал, что это была та же страница), так что это решило бы проблему. Поскольку action.php это не то же самое, что страница формулы, она публикует выходные данные в пустом action.php страница вместо формальной страницы. Вы все равно могли бы сделать это с помощью javascript, который я перечислил ниже, ЕСЛИ! php и HTML находятся на одной странице, которая есть.

Надеюсь, это поможет

СТАРАЯ ЧАСТЬ НИЖЕ!!

Причина, по которой он выводит его как «{type:message» и прочее, вызвана использованием «json_encode». Если это не проблема, я предполагаю, что вы хотите просто добавить его на страницу вместо этого. Для этого вы могли бы поэкспериментировать с AJAX-запросом, поскольку он может динамически обновлять веб-страницу без перезагрузки. Но что бы я сделал (поскольку я нуб xD), я бы заставил PhP выводить код javascript, который изменяется, и пустой тег. вот так.

 <p id="output"></p>
  

А затем добавьте php для вывода JavaScript.

 echo '<script>var elementOfIntrest = document.getElementById("output");elementOfIntrest.innerHTML = "Hi' . $user_name . ', thank you for the comments. We will get back to you shortly.";</script>';
  

Однако это все равно приведет к перезагрузке веб-страницы с новой информацией на ней.

Я не уверен на 100%, что это будет работать так, как вы хотите (не совсем уверен, чего вы хотите) Но надеюсь, это поможет.

Если вы хотите сделать это с помощью AJAX-запроса, вы можете прочитать больше здесь.