Проверка Captcha на той же странице с использованием AJAX

Хорошо, я уже некоторое время работаю над этим кодом. Я начал с предустановленного кода от SecurImages и настраивал его, чтобы попытаться проверить капчу И отправить форму. Загвоздка в том, что наша форма отправляется на сторонний сайт, который ее создал и отправляет данные в свою базу данных, а у меня нет доступа к их коду. Они используют несколько скрытых полей для извлечения информации, например, они ссылаются на свой общий веб-сайт, а затем проверяют, была ли страница отправлена ​​через форму, затем проверяют детали отправки, чтобы определить, какую форму и куда отправить информацию. Моя проблема в том, что я могу либо получить код для проверки и не отправлять форму, либо я могу отправить форму и не проверять капчу. Кажется, я не могу сделать и то, и другое. В настоящее время я могу правильно проверить капчу, но форма отправляется неправильно.

        function processForm()
    {
        new Ajax.Request('<?php echo $_SERVER['PHP_SELF'] ?>', {
            method: 'post',
            parameters: $('zoho1').serialize(),
            onSuccess: function(transport) {
                try {
                    var r = transport.responseText.evalJSON();


                    if (r.error == 0) {
                    alert ("You are the man!");


                    } else {
                        alert("There was an error with your submission.\n\n" + r.message);


                    }
                } catch(ex) {
                    alert("There was an error parsing the json");


                }
            },
            onFailure: function(err) {
                alert("Ajax request failed");
            }
        });
        return false;
    }

Когда пользователь нажимает кнопку отправки, он запускает этот запрос AJAX.

function process_si_zoho1()
{
if ($_SERVER['REQUEST_METHOD'] == 'POST' && @$_POST['do'] == 'contact') {
    // if the form has been submitted

    foreach($_POST as $key => $value) {
        if (!is_array($key)) {
            // sanitize the input data
            if ($key != 'LEADCF3') $value = strip_tags($value);
            $_POST[$key] = htmlspecialchars(stripslashes(trim($value)));
        }
    }
    /*
    $name    = @$_POST['First Name'] . @$_POST['Last Name'];    // name from the form
    $email   = @$_POST['Email'];   // email from the form
    $mainphone     = @$_POST['Phone'];     // url from the form
    $mobile = @$_POST['Mobile']; // the message from the form
    $state = @$_POST['State']; // the state from the form
    $type = @$_POST['LEADCF4']; // Type of student from form
    $enrollment = @$_POST['LEADCF2']; //Expected enrollment
    $time = @$_POST['LEADCF5']; //Intended enrollment status
    $degree = @$_POST['LEADCF6']; //Intended degree
    $message =  @$_POST['LEADCF3']; //How did you hear about TTU?
    $comments = @$_POST['Description']; //Comments*/
    $captcha = $_POST['captcha_code']; // the user's entry for the captcha code
    //$name    = substr($name, 0, 64);  // limit name to 64 characters

    $errors = array();  // initialize empty error array

    if (isset($GLOBALS['DEBUG_MODE']) && $GLOBALS['DEBUG_MODE'] == false) {
        // only check for errors if the form is not in debug mode




        if (strlen($email) == 0) {
            // no email address given
            $errors['email_error'] = 'Email address is required';
        } else if ( !preg_match('/^(?:[\w\d]+\.?)+@(?:(?:[\w\d]\-?)+\.)+\w{2,4}$/i', $email)) {
            // invalid email format
            $errors['email_error'] = 'Email address entered is invalid';
        }

        if (strlen($message) < 10) {
            // message length too short
            $errors['message_error'] = 'Please enter a message';
        }
    }

    // Only try to validate the captcha if the form has no errors
    // This is especially important for ajax calls
    if (sizeof($errors) == 0) {
        require_once dirname(__FILE__) . '/securimage.php';
        $securimage = new Securimage();

        if ($securimage->check($captcha) == false) {
            $errors['captcha_error'] = 'Incorrect security code entered';
        }
    }

   if (sizeof($errors) == 0) {
        // no errors, send the form
       // header('http://crm.zoho.com/crm/WebToLeadForm');

       /*if (isset($GLOBALS['DEBUG_MODE']) && $GLOBALS['DEBUG_MODE'] == false) {
            //send the message with mail()
            header('location:http://www.tntemple.edu/request-information-online-learning-thank-you');
        }*/

        $return = array('error' => 0, 'message' => 'OK');
        die(json_encode($return));
    } else {
        $errmsg = $captcha_error;
        foreach($errors as $key => $error) {
            // set up error messages to display with each field
            $errmsg .= " - {$error}\n";
        }

        $return = array('error' => 1, 'message' => $errmsg);
        die(json_encode($return));
    }


} // POST
} // function process_si_zoho1()

Эта функция запускается сразу после загрузки страницы и проверяет, была ли страница отправлена. Закомментированные переменные изначально были частью кода, но я решил, что они нам не нужны, поэтому закомментировал их. Исходный код был предназначен для отправки результатов формы получателю, но нам нужно, чтобы он «возвращал истину» для отправки формы.

<form action="https://crm.zoho.com/crm/WebToLeadForm" id="zoho1" method="POST" name="leadForm" onsubmit="return processForm()">

Это форма с действием и onSubmit. Надеюсь, я достаточно ясно выразился. Спасибо за помощь. Я новичок в программировании за пределами HTML, но большую часть времени начинаю очень быстро.

Кроме того, в идеале мы будем перенаправлять на другой URL-адрес после успешной отправки формы.


person Menelmor    schedule 01.05.2013    source источник
comment
Вы не можете отправить форму с помощью функции header(), которая будет перенаправлять только браузер. Если вы хотите, чтобы они заполнили форму на вашем сайте, которая отправляет сообщения на другой сайт, вам нужно будет использовать cURL или что-то подобное, чтобы сделать http-запрос от их имени. Если вы не хотите этого делать, тогда форма должна будет публиковаться напрямую поставщику без капчи, поскольку вы действительно не можете заставить их браузер выполнять 2 формы с 1 отправкой.   -  person drew010    schedule 03.05.2013
comment
есть ли способ вернуть значение функции processForm () true, если captcha проверяется? это кажется главной проблемой. Я отказался от функции header (), просто забыл отредактировать ее из кода, хотя она закомментирована.   -  person Menelmor    schedule 03.05.2013
comment
@ drew010 есть ли способ получить значение функции processForm (), чтобы вернуть истину, если капча проверяется?   -  person Menelmor    schedule 03.05.2013
comment
Не совсем, поскольку вызов ajax в processForm () является асинхронным, функция немедленно возвращает false, а обратный вызов onSuccess в запросе ajax вызывается после успешного завершения запроса, что произойдет после того, как событие onsubmit формы уже завершилось.   -  person drew010    schedule 07.05.2013
comment
@ drew010 Спасибо, разобрался. Мне пришлось добавить строку document.forms ['formname']. Submit (); В конечном итоге я пытался получить форму для отправки в действие. Спасибо за помощь.   -  person Menelmor    schedule 07.05.2013


Ответы (1)


По сути, чтобы вернуть действие формы, я просто добавил

if (r.error == 0) {
reloadCaptcha()
document.forms['formname'].submit()

Он возвращается в поле действия, как если бы кнопка отправки была нажата без аргумента "return false"

person Menelmor    schedule 07.05.2013