1
votes

I'm trying to implement mail contact form on my web page but regard so effort, I could not success. I used php captcha which is familiar to me on my previous project, but could not use it with AJAX call form.

I know in theory how process should go, but have no enough JavaScript skills to implement it at all. The problem is I have to implement captcha code into exist JavaScript and that make me trouble.

HTML FILE "contact.php" (part):

<head>
    <script src="https://www.google.com/recaptcha/api.js"></script>
</head>
<form id="contactForm" name="sentMessage"  method="POST" novalidate>
      .......
      <div class="form-group">
        <input class="form-control" id="name" type="tel" placeholder="Your Name *" required data-validation-required-message="Please enter your name.">
        <p class="help-block text-danger"></p>
      </div>
      ........
      <div class="form-group col-right-12">
        <div class="g-recaptcha btn" id="captcha" data-sitekey="6Lfi2k0UAxxxxxxxxxxxxxxxxxxxxxxxxx"></div>
      </div>
    </div>
    <div class="col-md-6">
      <div class="form-group leftt" style="border:1px solid #000; text-align:left;">
          <textarea class="form-control" id="message" placeholder="Your Message *" required data-validation-required-message="Please enter a message."></textarea>
          <p class="help-block text-danger"></p>
    </div>
    <div class="clearfix"></div>
    <div class="col-lg-12 leftt">
      <button id="sendMessageButton" class="btn btn-primary btn-xl text-uppercase" type="submit">Send Message</button>
    </div>
  </div>
</form>

JavaScript File contact_me.js

  $(function() {

  $("#contactForm input,#contactForm textarea").jqBootstrapValidation({
    preventSubmit: true,
    submitError: function($form, event, errors) {
      // additional error messages or events
    },
    submitSuccess: function($form, event) {
      event.preventDefault(); // prevent default submit behaviour
      // get values from FORM
      var name = $("input#name").val();
      var email = $("input#email").val();
      var phone = $("input#phone").val();
      var message = $("textarea#message").val();
      var firstName = name; // For Success/Failure Message
      var captcha = grecaptcha.render(); // IS THIS CORRECT VAR DEFINITION?

      // Check for white space in name for Success/Fail message
      if (firstName.indexOf(' ') >= 0) {
        firstName = name.split(' ').slice(0, -1).join(' ');
      }
      $this = $("#sendMessageButton");
      $this.prop("disabled", true); // Disable submit button until AJAX call is complete to prevent duplicate messages
      $.ajax({
        url: "././mail/contact_me.php",
        type: "POST",
        data: {
          name: name,
          phone: phone,
          email: email,
          message: message,
          captchaResponse: captcha
 ???? HOW TO CHECK IF CAPTCHA RESPONSE IS SUCCESS OR FALSE ????
        },
        cache: false,
        success: function() {
          // Success message
          $('#success').html("<div class='alert alert-success'>");
          $('#success > .alert-success').html("<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>&times;")
            .append("</button>");
          $('#success > .alert-success')
            .append("<strong>Your message has been sent. </strong>");
          $('#success > .alert-success')
            .append('</div>');
          //clear all fields
          $('#contactForm').trigger("reset");
        },
        error: function() {
          // Fail message
          $('#success').html("<div class='alert alert-danger'>");
          $('#success > .alert-danger').html("<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>&times;")
            .append("</button>");
          $('#success > .alert-danger').append($("<strong>").text("Sorry " + firstName + ", it seems that my mail server is not responding. Please try again later!"));
          $('#success > .alert-danger').append('</div>');
          //clear all fields
          $('#contactForm').trigger("reset");
        },
        complete: function() {
          setTimeout(function() {
            $this.prop("disabled", false); // Re-enable submit button when AJAX call is complete
          }, 1000);
        }
      });
    },
    filter: function() {
      return $(this).is(":visible");
    },
  });

  $("a[data-toggle=\"tab\"]").click(function(e) {
    e.preventDefault();
    $(this).tab("show");
  });
});

/*When clicking on Full hide fail/success boxes */
$('#name').focus(function() {
  $('#success').html('');
});`

PHP SCRIPT THAT SEND MAIL:

<?php
//
require_once("recaptchalib.php");

error_reporting(E_ALL & ~E_NOTICE);

if(empty($_POST['name'])      ||
   empty($_POST['email'])     ||
   empty($_POST['phone'])     ||
   empty($_POST['message'])   ||
   empty($_POST['captchaResponse']) ||
   !filter_var($_POST['email'],FILTER_VALIDATE_EMAIL))
   {
   echo "No arguments Provided!";
   $return = "No arguments Provided!";
   return false;
   }

    $captcha = $_POST['g-recaptcha-response'];
    $secret = "6Lfxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

    $response=json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secret."&response=".$captcha."&remoteip=".$_SERVER["REMOTE_ADDR"]), true);

    $verify=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$secret}&response={$response}");

        $captcha_success=json_decode($verify);
        if ($captcha_success['success']==false) {
            //This user was not verified by recaptcha.
            return false;
        }
        else if ($response['success']!=false) {
            //This user is verified by recaptcha

                $name = strip_tags(htmlspecialchars($_POST['name']));
                $email_address = strip_tags(htmlspecialchars($_POST['email']));
                $phone = strip_tags(htmlspecialchars($_POST['phone']));
                $message = strip_tags(htmlspecialchars($_POST['message']));

                $to = "[email protected]"; 
                $email_subject = "New message from  $name";
                $email_body = "New message from website contact form.\n\n"."DETAILS:\n\nName: $name\n\nEmail: $email_address\n\nPhone: $phone\n\nMessage:\n$message\n\n";
                $headers = "From: $email_address\n"; 
                $headers .= "Reply-To: $email_address";   
                mail($to,$email_subject,$email_body,$headers);
            return true;    
        }     

?>`

At the end, I try to debug scripts with Mozilla Firefox debuger and find something I could not resolve what purpose is: DEBUG -> blob:https://www.google.com/477e0820-9f2a-4cac-8928-a4c51e87a79f

Could not load the source for blob:https://www.google.com/477e0820-9f2a-4cac-8928-a4c51e87a79f. [Exception... "Failed to open input source 'file:////www.google.com/477e0820-9f2a-4cac-8928-a4c51e87a79f'" nsresult: "0x80520001 (NS_ERROR_FILE_UNRECOGNIZED_PATH)" location: "JS frame :: resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/shared/DevToolsUtils.js :: mainThreadFetch :: line 540" data: yes] Stack: mainThreadFetch@resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/shared/DevToolsUtils.js:540:5 _getSourceText/<@resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/server/actors/source.js:404:27 process@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:922:23 walkerLoop@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:806:7 scheduleWalkerLoop/<@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:742:11 Line: 540, column: 0

1

1 Answers

0
votes

Check out this link. I made a help file about this that provides the JavaScript (jQuery mostly) to get this accomplished.

The information you need is here!

Offhand I can see that you aren't getting the response from your PHP. For example, you will have to put an argument inside the success: function(argument) {} to even know if it was successful. Whatever you echo in PHP will show up as the value of that argument.