简体   繁体   中英

PHP Form, MailFonction and Google reCaptcha Validation Issue

I have a issue with the way ive program the captcha verification with the mail fonction.

The Captcha Success are working fine. When the captcha fail, i got the proper message into the form page, but PHP programation still let the email sent. I just need to know how can i set the mail function with the success part only.

Can anyone help me fix the reCaptcha validation?

Thank you.

Here is the PHP source code:

<?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);

 }

 ?> 

The issue could be for many reasons. The most popular reasons thats failed the reCpatcha Google Plugin is because the way that the user validate trough ajax with jquery or javascript and php are wrong. The next code that I will show you (assuming that you already have verified an account in Goolge Recaptcha), will teach you how to validate a reCaptcha answer after you are click in a button with php, ajax and jquery. Greetings!

Download the recpatcha library from here 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

?>

Resolved. The problem was the construction of the PHP if() and else() need to be after the Data collection filled into the form.

Here are the proper code :

<?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 = "who@domain.com";
        $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');

}

?> 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM