Home > Mobile >  AJAX error function invoked instead of success
AJAX error function invoked instead of success

Time:03-15

I'm new to using PHP. I'm implementing an email subscription form that is wrapped in a google captcha function. I'm using ajax to call the server-side code. The issue I'm having is the success() method inside the ajax is not being invoked when the function executes correctly.

Some details: the 3rd party email subscription returns a json object with a single key-value pair, {message: "you've been added"} or {message:"error,try again"}

The function has run 'successfully if we hit the else clasue in the php file. when this happens, it runs the error() callback for some reason? even though i have a status 200 enter image description here

I suspect im not returning valid json or something? Thanks in advance!

Here is my JS

$(".subscribe-form").submit(function (e) {
e.preventDefault();
var form = $(this);
var formData = form.serialize();
var formAction = form.attr("action");
var formMethod = form.attr("method");
var formResponse = $("#form-response");

grecaptcha.ready(function () {
  grecaptcha
    .execute("6Lcgdq4UAAAAAFjthnpc_WQ4leumC1UmlyLk0OwR", {
      action: "submit",
    })
    .then(function (token) {
      var recaptchaResponse = document.getElementById("recaptchaResponse");
      recaptchaResponse.value = token;
      $.ajax({
        url: "/wp-content/themes/hello-elementor/submit.php",
        type: "POST",
        data: formData,
        dataType: "json",
        success: function (data) {
          console.log(data);
          if (data.error) {
            formResponse.html(data.error);
          } else {
            formResponse.html(data.success);
          }
        },
        error: function (data) {
          console.log(data);
          formResponse.html("Error, please try again");
        },
      });
    });
});

});

Here is my sumbit.php - I've removed the secret for obvious reasons.

<?php
$fname = $_POST['fname'];
$lname = $_POST['lname'];
$email = $_POST['email'];    
$ttrurl = "https://3rdpartysubsciptionservice/addEmailDetails.aspx?first_name=$fname&last_name=$lname&email=$email";
$url = "https://www.google.com/recaptcha/api/siteverify";
$data = [
    'secret' => "secret_code",
    'response' => $_POST['recaptcha_response'],
    'remoteip' => $_SERVER['REMOTE_ADDR']
  ];
$options = array(
    'http' => array(
      'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
      'method'  => 'POST',
      'content' => http_build_query($data)
    )
);
$context  = stream_context_create($options);
$response = file_get_contents($url, false, $context);
$res = json_decode($response, true);

// Take action based on the score returned
if ($res['success'] == false && $res['score'] <= 0.5) {
    // Score less than 0.5 indicates suspicious activity. Return an error
    $error = "Something went wrong. Please try again later";
    $output = array("error" => $error, "success" => "");
    http_response_code(400);
    echo json_encode($output);
} else {
    // This is a human. Insert the message into database OR send a mail
    $curl = curl_init();
    curl_setopt_array($curl, array(CURLOPT_URL => $ttrurl));
    $ttrres = curl_exec($curl);
    curl_close($curl);
    $message = json_decode($ttrres, true);
    $output = array("error" => "", "success" => json_encode($message));
    http_response_code(200);
    echo json_encode($output);
}

?>

CodePudding user response:

please note that you set dataType: "json" in your ajax and your response does not seem to be json. use this code on top of your php code:

header('Content-Type: application/json; charset=utf-8');
  • Related