Сообщение Ajax всегда приводит к ошибке, даже если все кажется правильным

Я пытаюсь обработать капчу при проверке формы с помощью Google reCaptcha. По сути, моя функция проверки вызывается с помощью onSubmit в теге формы, а затем вызывает вторую функцию для работы с recaptcha api.

Вот код:

        var returnValue;

        var myData = {
            privatekey  : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            remoteip : ip,
            challenge : challenge,
            response : response
        };

        $.ajax({
            url: "http://www.google.com/recaptcha/api/verify",
            type: "POST",
            data: JSON.stringify(myData),
            dataType: "text",
            success: function(data) {
                var result = data.split("\n");
                if (result[0] == "true") {
                    returnValue = true;
                }
                else {
                    returnValue = false;
                }
            },
            error: function(jqXHR, textStatus, errorThrown) {
                alert("There was an error submitting the captcha.  Please contact an administrator. \n\nError:\n" + textStatus, errorThrown);
                returnValue = false;                    
            },
            complete: function(jqXHR, textStatus) {
                return returnValue;
            }
        });

Используя LiveHTTPHeaders в Firefox, я вижу, что запрос отправляется в службу, и похоже, что все отправляется правильно. Я получаю ответ HTTP/1.1 200 OK, но каждый раз код переходит к функции ошибки. Когда функция ошибки запускается, jqXHR:

Объект {readyState=0, status=0, statusText="ошибка"}

textStatus — «ошибка», а errorThrown — «»

Я пытался сделать это несколькими способами, включая $.POST и используя .done(), .fail(), .always(), и он всегда ведет себя одинаково.

Я видел здесь некоторые другие публикации, связанные с проблемами с междоменными запросами, но ни одна из этих ситуаций не кажется актуальной, потому что я на самом деле выполняю междоменный запрос, и это, казалось, были проблемы там, где они были делал запросы к файлу в том же домене, и он неправильно обрабатывался как междоменный запрос.

Я в своем уме здесь .. любая помощь будет принята с благодарностью.


person Redit0    schedule 08.10.2012    source источник
comment
вам, вероятно, не следует публиковать свой закрытый ключ в вопросе SO.   -  person jbabey    schedule 09.10.2012
comment
Дополнительное примечание: I've tried doing this a number of ways, including $.POST, and using .done(), .fail(), .always(), and it always behaves the same. Эти 3 метода служат той же цели, что и ошибка, успех и завершение. Функционально теперь должна быть разница, за исключением того, что теперь они предпочтительнее при подготовке к успеху, ошибке и завершению, которые в соответствии с документацией будут признаны устаревшими в будущем.   -  person Nope    schedule 09.10.2012


Ответы (2)


Я видел здесь некоторые другие сообщения, связанные с проблемами с междоменными запросами, но ни одна из этих ситуаций не кажется актуальной, потому что я на самом деле выполняю междоменный запрос.

Когда я запускаю этот код, я получаю сообщение об ошибке:

XMLHttpRequest cannot load http://www.google.com/recaptcha/api/verify.
Origin http://fiddle.jshell.net is not allowed by Access-Control-Allow-Origin.

Так что это междоменная проблема. Возможно, вы захотите сделать междоменный запрос, но Google не настроен для этого.

Я почти уверен, что рекапча должна быть реализована с кодом на стороне сервера. Если вы делаете это полностью на клиенте с JS, тогда клиент может солгать и сказать, что он прошел капчу, когда это не так.

person Quentin    schedule 08.10.2012
comment
Спасибо за информацию. Я никогда не видел эту ошибку, но в итоге я реализовал капчу другого типа. Я бы хотел использовать что-то на стороне сервера, но сайт, на который я пытаюсь добавить это, представляет собой просто чистый html, и я не хочу переделывать все это:/ (плюс клиент не хочет платить столько, лол). - person Redit0; 10.10.2012

function check(){
    $.post('check.php',{
        'check':1,
        'challenge':$('#recaptcha_challenge_field').val(),
        'response':$('#recaptcha_response_field').val()},
        function(a){
            console.log(a);
        });
}

проверить.php:

if($_POST){
    if(isset($_POST['check'])){
        $url = 'http://www.google.com/recaptcha/api/verify';

        $data = array(
            'privatekey'=>  "**********************************",
            'remoteip'  =>  $_SERVER['REMOTE_ADDR'],
            'challenge' =>  $_POST['challenge'],
            'response'  =>  $_POST['response'],
        );
        $options = array(
            'http' => array(
                'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
                'method'  => 'POST',
                'content' => http_build_query($data),           
            ),
        );
        echo print_r($data,true);
        die(file_get_contents($url, false, stream_context_create($options)));
    }
}

Внимание! У вас есть только один вариант для проверки! (Ссылка)

person Community    schedule 09.01.2014