2016-03-26 2 views
1

У меня есть проблема с тем, как программа ive проверяет правильность посылки почты почтой.PHP Form, MailFonction и Google reCaptcha Validation Issue

Успех Captcha отлично работает. Когда сбой captcha, я получил правильное сообщение на странице формы, но программа PHP все еще позволяет отправить электронное письмо. Мне просто нужно знать, как настроить функцию почты только с частью успеха.

Может ли кто-нибудь помочь мне исправить проверку reCaptcha?

спасибо.

Вот исходный код PHP:

<?php 
if (isset($_POST["submit"])) { 

    $url = 'https://www.google.com/recaptcha/api/siteverify'; 
    $privatekey = "MASKED"; 

    $response = file_get_contents($url."?secret=".$privatekey."&response=".$_POST['g-recaptcha-response']."&remoteip=".$_SERVER['REMOTE_ADDR']); 
    $data = json_decode($response); 

    if(isset($data->success) AND $data->success==true){ 

     header('Location: appel_de_service.php?CaptchaPass=True'); 

    }else{ 

     header('Location: appel_de_service.php?CaptchaFail=True'); 

    } 

$to = "MASKED"; 
$from = $_POST['courriel']; 
$from_name = $_POST['nom_responsable']; 
$subject = "Reception d'un appel de service "; 
$nom_compagnie = $_POST['nom_compagnie']; // required 
$adresse = $_POST['adresse']; // required 
$ville = $_POST['ville']; 
$province = $_POST['province']; 
$code_postale = $_POST['code_postale']; 
$nom_responsable = $_POST['nom_responsable']; 
$courriel = $_POST['courriel']; 
$telephone = $_POST['telephone']; 
$marque = $_POST['marque']; 
$numero_modele = $_POST['numero_modele']; 
$garantie = $_POST['garantie']; 
$description = $_POST['description'];    
$disponibilite = $_POST['disponibilite']; // required 
$coordonnees = $_POST['coordonnees']; // required 

$headers = 'MIME-Version: 1.0' . "\r\n"; 
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; 
$headers .= "Reply-to: $courriel"; 

$message = " 
<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"> 
<html> 
<head> 
<title>Appel de service (rempli sur le site internet)</title> 
<style type=\"text/css\"> 
h1,h2,h3,h4,h5,h6 { 
    font-family: Cambria, \"Hoefler Text\", \"Liberation Serif\", Times, \"Times New Roman\", serif; 
    color: #272727; 
} 
</style> 
</head> 
<body> 
<h2 style=\"font-size: 1.25em; font-family: Gotham, ʼHelvetica Neueʼ, Helvetica, Arial, sans-serif;\">Vous avez re&ccedil;u une demande d'appel de service en ligne.</h2> 
<table width=\"500\" border=\"1\" cellpadding=\"5\" cellspacing=\"2\"> 
    <tbody> 
    <tr> 
     <td colspan=\"2\" align=\"left\" valign=\"middle\" bgcolor=\"#84BDEC\"><h3>Informations sur l'adresse du service</h3></td> 
    </tr> 
    <tr> 
     <td width=\"155\" align=\"left\" valign=\"middle\" bgcolor=\"#D5D5D5\">Nom de la compagnie</td> 
     <td width=\"313\" align=\"left\" valign=\"middle\">$nom_compagnie</td> 
    </tr> 
    <tr> 
     <td align=\"left\" valign=\"middle\" bgcolor=\"#D5D5D5\">Adresse</td> 
     <td align=\"left\" valign=\"middle\">$adresse</td> 
    </tr> 
    <tr> 
     <td align=\"left\" valign=\"middle\" bgcolor=\"#D5D5D5\">Ville</td> 
     <td align=\"left\" valign=\"middle\">$ville</td> 
    </tr> 
    <tr> 
     <td align=\"left\" valign=\"middle\" bgcolor=\"#D5D5D5\">Province</td> 
     <td align=\"left\" valign=\"middle\">$province</td> 
    </tr> 
    <tr> 
     <td align=\"left\" valign=\"middle\" bgcolor=\"#D5D5D5\">Code postale</td> 
     <td align=\"left\" valign=\"middle\">$code_postale</td> 
    </tr> 
    <tr> 
     <td align=\"left\" valign=\"middle\" bgcolor=\"#D5D5D5\">Nom du responsable</td> 
     <td align=\"left\" valign=\"middle\">$nom_responsable</td> 
    </tr> 
    <tr> 
     <td align=\"left\" valign=\"middle\" bgcolor=\"#D5D5D5\">T&eacute;l&eacute;phone</td> 
     <td align=\"left\" valign=\"middle\">$telephone</td> 
    </tr> 
    <tr> 
     <td align=\"left\" valign=\"middle\" bgcolor=\"#D5D5D5\">Adresse courriel</td> 
     <td align=\"left\" valign=\"middle\">$courriel</td> 
    </tr> 
    </tbody> 
</table> 
<br> 
<table width=\"500\" border=\"1\" cellpadding=\"5\" cellspacing=\"2\"> 
    <tbody> 
    <tr> 
     <td colspan=\"2\" align=\"left\" valign=\"middle\" bgcolor=\"#84BDEC\"><h3>Informations sur le produit</h3></td> 
    </tr> 
    <tr> 
     <td width=\"155\" align=\"left\" valign=\"middle\" bgcolor=\"#D5D5D5\">Marque</td> 
     <td width=\"313\" align=\"left\" valign=\"middle\">$marque</td> 
    </tr> 
    <tr> 
     <td align=\"left\" valign=\"middle\" bgcolor=\"#D5D5D5\">Num&eacute;ro de mod&egrave;le</td> 
     <td align=\"left\" valign=\"middle\">$numero_modele</td> 
    </tr> 
    <tr> 
     <td align=\"left\" valign=\"middle\" bgcolor=\"#D5D5D5\">Garantie</td> 
     <td align=\"left\" valign=\"middle\">$garantie</td> 
    </tr> 
    <tr bgcolor=\"#D5D5D5\"> 
     <td colspan=\"2\" align=\"left\" valign=\"middle\">Description du probl&egrave;me :</td> 
    </tr> 
    <tr> 
     <td height=\"75\" colspan=\"2\" align=\"left\" valign=\"top\">$description</td> 
    </tr> 
    </tbody> 
</table> 
<br> 
<table width=\"500\" border=\"1\" cellpadding=\"5\" cellspacing=\"2\"> 
    <tbody> 
    <tr> 
     <td colspan=\"2\" align=\"left\" valign=\"middle\" bgcolor=\"#84BDEC\"><h3>Pr&eacute;f&eacute;rences pour le rendez-vous</h3></td> 
    </tr> 
    <tr> 
     <td width=\"155\" align=\"left\" valign=\"middle\" bgcolor=\"#D5D5D5\">Disponibilit&eacute;</td> 
     <td width=\"313\" align=\"left\" valign=\"middle\">$disponibilite</td> 
    </tr> 
    <tr> 
     <td align=\"left\" valign=\"middle\" bgcolor=\"#D5D5D5\">Coordonn&eacute;es</td> 
     <td align=\"left\" valign=\"middle\">$coordonnees</td> 
    </tr> 
    </tbody> 
</table> 
</body> 
</html> 
"; 

// Always set content-type when sending HTML email 

mail($to, $subject, $message, $headers); 

} 

?> 

ответ

0

Решенный. Проблема заключалась в построении PHP if() и else(), которые должны быть после заполнения коллекции данных в форме.

Вот правильный код:

<?php 
if (isset($_POST["submit"])) { 

    $url = 'https://www.google.com/recaptcha/api/siteverify'; 
    $privatekey = "PRIVATE_KEY"; 

    $response = file_get_contents($url."?secret=".$privatekey."&response=".$_POST['g-recaptcha-response']); 
    $data = json_decode($response); 

    if(isset($data->success) AND $data->success==true){ 

     $to = "[email protected]"; 
     $from = $_POST['courriel']; 
     $from_name = $_POST['nom_responsable']; 
     $subject = "Reception d'un appel de service "; 
     $nom_compagnie = $_POST['nom_compagnie']; 
     $adresse = $_POST['adresse']; 
     $ville = $_POST['ville']; 
     $province = $_POST['province']; 
     $code_postale = $_POST['code_postale']; 
     $nom_responsable = $_POST['nom_responsable']; 
     $courriel = $_POST['courriel']; 
     $telephone = $_POST['telephone']; 
     $marque = $_POST['marque']; 
     $numero_modele = $_POST['numero_modele']; 
     $garantie = $_POST['garantie']; 
     $description = $_POST['description'];    
     $disponibilite = $_POST['disponibilite']; 
     $coordonnees = $_POST['coordonnees']; 

     $headers = 'MIME-Version: 1.0' . "\r\n"; 
     $headers .= 'Content-type: text/html; charset=UTF-8' . "\r\n"; 
     $headers .= "Reply-to: $courriel"; 

     $message = " 
     "; 

     if(mail($to, $subject, $message, $headers)){ 
        header('Location: appel_de_service.php?CaptchaPass'); 

     }else{ 
      echo "mail could not be sent"; 
     } 
    }else{ 
       header('Location: appel_de_service.php?CaptchaFail'); 
    } 

}else{ 
    header('Location: appel_de_service.php?CaptchaError'); 

} 

?> 
0

Вопрос может быть по многим причинам. Самые популярные причины, из-за которых не удалось подключить плагин Google reCpatcha, заключается в том, что способ, которым пользователь проверяет аякс с помощью jquery или javascript и php, неверен. Следующий код, который я вам покажу (если вы уже проверили учетную запись в Goolge Recaptcha), научит вас проверять ответ reCaptcha после нажатия кнопки с помощью php, ajax и jquery. Приветствую!

Скачать библиотеку recpatcha здесь https://mega.nz/#!qw4Snb6Z!3Mgq2UvD3PmQJ9ts9sQdHcV86Le8-wtz05IEr2b-3mw

<html> 
<head> 
    <title>Example</title> 
</head> 
<script src='https://www.google.com/recaptcha/api.js'></script> 
<script> 
//This is our DOM on JQUERY or JAVASCRIPT named as main.js 
$(function() { 
    //First we have to listen on a event click (button) and extract the values of the inputs 
    $('body').on('click','.myButtonClass', function() { 
     $email = $('#emailID').val(); 
     $password = $('#passwordID').val(); 
     $recaptcha = $('textarea').val(); 
     //We save in a object our values 
     $x = { 
      action:'validate', 
      email:$email, 
      password:$password 
      captcha:$recaptcha 
     }; 

     //We execute ajax calling a php file for POST method 
     $.post('file.php',$x,function(callback) { 
      $('.answer').html(callback); 
     }); 

    }); 
}); 

/*END OF DOM AND MAIN.JS*/ 
</script> 

<body> 


<form> 
    <input type="email" id="emailID" placeholder="Write here your email"> 
    <input type="password" id="passwordID" placeholder="Write here your password"> 
    <input type="button" class="myButtonClass"> 
</form> 
<!--Your div recaptcha. This give you the page recaptcha google when you are into your configuration Change the XXXX for your SITE KEY numbers and letters --> 
<div class="g-recaptcha" data-sitekey="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"></div> 
<!--This will be where we display the answer with ajax, in the element who have the class answer--> 
<div class="answer"></div> 


</body> 
</html> 


<?php 
//this is your file.php 
require_once 'recaptchalib.php'; 
//BEGIN OUR PHP FILE WHERE WE'LL RECIEVE ALL THE DATA FROM THE AJAX FILE 
    //we save the action sended trough ajax 
    $action = $_POST['action']; 
    if ($action == 'validate') : 
    //WE SAVE A EMAIL 
     $email = addslashes($_POST['email']); 
    //WE SAVE THE PASSWORD FOR THIS EXAMPLE 
     $password = addslashes($_POST['password']); 
     //We paste here one more time our secret key 
     $secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; 
     $response = null; 
     $reCaptcha = new ReCaptcha($secret); 
     $captcha = $_POST["captcha"]; 
     //WE VALIDATE IF THE INPUTS ARE CORRECTLY INPUT 
     $input  = strlen($email)*strlen($password); 

     if ($_POST["captcha"]) : 
      $response = $reCaptcha->verifyResponse(
        $_SERVER["REMOTE_ADDR"], 
        $captcha 
       ); 
     endif; 
     //We validate if exists a response success from google recaptcha and if is it, we continue 
     if ($response != null && $response->success) : 
      //if the inputs were in 
      if ($input > 0) : 
       echo 'OWW YEAH, YOU VALIDATE CORRECTLY GOOGLE RECAPTCHA AND YOUR EMAIL IS '.$email.' AND YOUR PASSWORD IS: '.$password; 
      else : 
       echo 'Sorry but you are not fill all the inputs. All are required, please refresh the page and try it again'; 
      endif; 
     else : 
      echo 'Hey, man! Chillout, first validate the google recpatcha and fill the inputs and click the button for continue. Thanks'; 
     endif; 
    endif; 
/*END OF PHP FILE*/ 

//BEGIN OUR FORM IN HTML 

?> 
+0

ReCaptcha работает хорошо, это просто как PHP сказать, если результаты является Success = Отправить почту, если Сбой = получить ответ, что проверка была ошибкой. Я не очень хорошо знаю PHP-программирование. Я стараюсь, чтобы все получилось. Если reCatpcha FAIL, я хочу остановить отправку почтового процесса, и если это SUCCESS, я хочу отправить почту. Это просто основы, которые я действительно не знаю в PHP. Когда вы не знаете все значения, функции и var, это довольно сложно, потому что у кого-то нет навыков. –

+0

Ive тестирует его и не работает. –

+0

Могу ли я просто пропустить «mail ($ to, $ email_subject, $ email_body, $ headers)»; часть в раздел успеха и электронная почта будут отправлены в успех, а не в фазе? –