2009-02-27 1 views
11

Я пытаюсь реализовать reCAPTCHA в одной из моих форм, но я использую ajax в качестве представления. (Более конкретно прототип Ajax.Updater)using reCAPTCHA с ajax .... проблема загрузки javascript

Как только я представить и ошибки проверить мою форму я пытаюсь загрузить reCAPCHTA виджет штуковину (в моем обновленном сНе элементе), который в основном только вызывает файл JavaScript, как так:

<script type="text/javascript" src="http://api.recaptcha.net/challenge?k=6Le6SwUAAAAAAIWm8wCRFd8SrI-H0R1Yx4Tkw2Ks"></script> 

Однако JS-файл не читается? ... и я пробовал всю комбинацию evalScripts: true и evalJS: «force» и т. Д. В ajax.updater ..... однако я не думаю У меня очень хорошее представление о том, почему файл js не обрабатывается :(

Если кто-то может пролить свет на этот вопрос, я буду очень благодарен.

Спасибо, Эндрю

+2

Вы когда-нибудь находили решение для этого? Я испытываю точно такую ​​же проблему ... Спасибо. –

ответ

0

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

+0

это не так. скопирован неправильно. – Andrew

1

ответить на мой собственный вопрос ...

есть рекапчи AJAX API .... который является довольно простой способ, чтобы обойти эту проблему:

link text

Кроме того, .. документация на сайте http://www.prototypejs.org/api/ajax/updater ..... говорит об опциях evalscript и как только помещает javascript через встроенную функцию eval() .... какой тип винтов меня пытается пытаться выполнить проверку ошибок с помощью WMD ... но это еще одна история.

Andrew

+3

Мертвая ссылка. Именно поэтому ответ infinito84 был downvoted ... – MadTurki

17

Это не решает вашу проблему точной, но «Dark Side of the Carton» имеет некоторый отличный код для проверки ReCaptcha с помощью JQuery AJAX, которые могли бы помочь.

В итоге:

Добавьте следующий Javascript:

$(function() { 
    function validateCaptcha() { 
     var challengeField = $('input#recaptcha_challenge_field').val(), 
      responseField = $('input#recaptcha_response_field').val(); 

     // alert(challengeField); 
     // alert(responseField); 
     // return false; 

     var html = $.ajax({ 
      type: 'POST', 
      url: 'ajax.recaptcha.php', 
      data: "recaptcha_challenge_field=" + challengeField + "&amp;recaptcha_response_field=" + responseField, 
      async: false 
     }).responseText; 

     if (html.replace(/^\s+|\s+$/, '') == "success") { 
      $('#captchaStatus').html(' '); 
      // Uncomment the following line in your application 
      return true; 
     } else { 
      $('#captchaStatus').html(
       'Your captcha is incorrect. Please try again' 
      ); 
      Recaptcha.reload(); 
      return false; 
     } 
    } 

    // Modified as per comments in site to handle event unobtrusively 
    $('#signup').submit(function() { 
     return validateCaptcha(); 
    }); 
}); 

Затем добавьте файл ajax.recaptcha.php, который: «выводит только слово„успех“, если соответствует капчу и сообщение и ответ от reCaptchta, если он терпит неудачу. Это важно, потому что мы ищем слово «успех» в нашей функции validateCaptcha() ».

require_once('/inc/recaptchalib.php'); 
$publickey = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX'; // you got this from the signup page 
$privatekey = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX'; 

$resp = recaptcha_check_answer(
    $privatekey, 
    $_SERVER['REMOTE_ADDR'], 
    $_POST['recaptcha_challenge_field'], 
    $_POST['recaptcha_response_field'] 
); 

if ($resp->is_valid) { 
    ?>success< ? 
} else { 
    die(
     "The reCAPTCHA wasn't entered correctly. Go back and try it again." . 
     "(reCAPTCHA said: " . $resp->error . ")" 
    ); 
} 

Пример в PHP, но я приспособился легко работать с Zope/Python

+0

Хм, вы должны сохранить результат проверки в сеансе, так как можно просто пропустить вызов validateCaptcha и отправить форму без разрешения captcha. Также не забудьте перезагрузить его в сеансе после выполнения действия, защищенного captcha, поэтому одно решение не может использоваться несколько раз. – iGEL

+0

По какой-то причине я получал неопределенный индекс для '$ _POST [" recaptcha_challenge_field "]', пока я не переписал настройку данных в ajax-вызове с помощью JSON. – regularmike

+0

Аякса данные должны быть: 'данные: "recaptcha_challenge_field =" + challengeField + "& recaptcha_response_field =" + responseField,' не '' & –

4

Будьте осторожны при использовании какой-либо клиентский сценарий, такие как JavaScript, для проверки. У вас нет контроля над браузером конечного пользователя. Цель CAPTCHA - предотвратить автоматическое представление формы. Любой, достаточно сложный, чтобы установить это, не будет иметь проблемы с переопределением проверки JavaScript и проверки CAPTCHA. Например, они могут установить validateCaptcha(), чтобы всегда возвращать true, минуя ваши тщательные проверки, или просто отключить JavaScript.

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

Важным моментом является то, что решение о том, следует ли обрабатывать форму, должно быть выполнено на стороне сервера, а не на стороне клиента.

Why client-side validation is not enough

+0

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

+0

Что вы думаете об этом: http://stackoverflow.com/a/21061169/567854 – IJas

-1

У меня были аналогичные проблемы с получением reCaptcha играть красиво, когда загружен на страницу, используя метод .load() JQuery в. Вот страница, которая имеет новое решение: http://www.maweki.de/wp/2011/08/recaptcha-inside-a-with-jquery-ajax-or-load-dynamically-loaded-object/

В основном API reCaptcha использует метод document.write для отображения reCaptcha. Когда вы вызываете jQuery invlued, это не сработает. Используйте этот PHP код вместо загрузки recaptcha.js

<?php 
$api = file_get_contents('http://www.google.com/recaptcha/api/js/recaptcha_ajax.js'); 
$api = str_replace('document.write','$("body").append',$api); 
echo $api; 
?> 

Он просто делает находку для document.write и заменяет его $(selector).append.

Сделано в моей работе.

0

call Recaptcha.reload(); на события обратного вызова в коде Ajax., он будет перезагрузить новый Recapcha каждый раз, когда Ajax представленный

0

Привет Друг я нашел ответ

https://developers.google.com/recaptcha/docs/display?hl=es#AJAX

И в этом, как проверки

http://blog.reaccionestudio.com/comprobar-recaptcha-con-ajax-usando-jquery/

Успех для вас

+0

-1 - Вы должны объяснить ответ в дополнение к публикации ссылок, поэтому он может быть полезен даже тогда, когда ссылки становятся недействительными. Когда вы отредактируете, я удалю downvote. – Tibos