2009-02-27 30 views
11

Estoy tratando de implementar reCAPTCHA en uno de mis formularios, ... pero estoy usando ajax como el envío. (Más específicamente, el Ajax.Updater prototipo)usando reCAPTCHA con ajax .... javascript problema de carga

vez enviada y error de comprobación de mi formulario intento cargar el widget de manivela de reCAPCHTA (en mi elemento div actualizado), que, básicamente, sólo llama a un archivo JavaScript, así:

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

¿Sin embargo, el archivo JS no se está leyendo? ... y probé toda la combinación de evalScripts: true y evalJS: 'force' etc. en el ajax.updater ..... sin embargo, no creo Tengo una muy buena comprensión de por qué el archivo js no está procesando :(

Si alguien puede arrojar algo de luz sobre este tema lo agradeceré.

Gracias, Andrew

+2

¿Alguna vez encontró una solución para esta? Estoy experimentando exactamente el mismo problema ... Gracias. –

Respuesta

0

Si ese es el código de fragmento de código literal que está usando, no ha cerrado la etiqueta ... por lo que no serían evaluados.

+0

no lo es. copiado mal – Andrew

1

para responder a mi propia pregunta ...

no es una API AJAX reCAPTCHA .... que es la forma bastante fácil de solucionar este problema:

link text

Además, .. la documentación en el sitio http://www.prototypejs.org/api/ajax/updater ..... habla sobre la opción evalscript y cómo solo coloca cualquier javascript a través de la función nativa eval() ... que me molesta al intentar implementar la comprobación de errores con WMD ... pero esa es otra historia.

Andrew

+3

Enlace muerto. Exactamente por qué la respuesta de infinito84 fue downvoted ... – MadTurki

17

esto no aborda el problema exacto, pero 'Dark Side of the Carton' tiene algo de código excelente para validar reCAPTCHA a través de jQuery AJAX que podría ayudar.

En resumen:

Agregue el siguiente 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(); 
    }); 
}); 

A continuación, agregue el archivo ajax.recaptcha.php el cual: "salidas sólo la palabra‘éxito’si el código de imagen y un mensaje coincide y la respuesta de reCaptchta si falla. Esto es importante porque estamos buscando la palabra éxito en nuestra función 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 . ")" 
    ); 
} 

El ejemplo está en PHP, pero adaptado fácilmente para trabajar con Zope/Python

+0

Hmm, debe almacenar el resultado de la validación en la sesión, ya que uno podría omitir la llamada validateCaptcha y enviar el formulario sin resolver el captcha. También recuerde reiniciarlo en la sesión después de realizar la acción protegida de captcha, por lo que una solución no se puede usar varias veces. – iGEL

+0

Por alguna razón, estaba obteniendo un índice indefinido para '$ _POST [" recaptcha_challenge_field "]' hasta que reescribí la configuración de datos en la llamada ajax con JSON. – regularmike

+0

datos ajax deben ser: ' datos: "recaptcha_challenge_field =" + challengeField + "& recaptcha_response_field =" + responseField,' 'no &' –

4

Tenga cuidado al usar cualquier tipo de script del lado del cliente, tales como JavaScript, para su validación. Usted no tiene control sobre el navegador del usuario final. El objetivo de un CAPTCHA es evitar envíos automáticos de un formulario. Cualquiera que sea lo suficientemente sofisticado como para configurarlo no tendrá problemas para anular la validación de JavaScript y la comprobación de CAPTCHA. Por ejemplo, podrían establecer validateCaptcha() para que siempre devuelva verdadero, omitiendo sus controles detallados o simplemente deshabilitar JavaScript.

Dicho esto, no hay nada de malo en realizar todo el envío del formulario con ajax y usar los resultados del control CAPTCHA para determinar si el formulario se procesa o no.

El punto importante es que la decisión de manejar o no el formulario tiene que tomarse en el lado del servidor, no en el del lado del cliente.

Why client-side validation is not enough

+0

derecho, también querría hacer el registro de entrada del lado del servidor. Pero la validación del lado del cliente es útil para que los visitantes legítimos puedan obtener retroalimentación sin perder toda la presentación del formulario cuando accidentalmente escriben las palabras incorrectamente. Algunos de los desafíos de captcha pueden ser difíciles. – regularmike

+0

qué tal mi idea sobre esto: http://stackoverflow.com/a/21061169/567854 – IJas

-1

he tenido problemas similares con conseguir reCaptcha a jugar muy bien cuando se cargan en la página utilizando el método de jQuery .load(). Aquí hay una página que tiene una solución novedosa: http://www.maweki.de/wp/2011/08/recaptcha-inside-a-with-jquery-ajax-or-load-dynamically-loaded-object/

Básicamente, la API reCaptcha utiliza el método document.write para mostrar el reCaptcha. Cuando obtienes jQuery invloved esto no funcionará. Utilice el código PHP en lugar de carga 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; 
?> 

Simplemente hace un hallazgo para document.write y lo reemplaza con $(selector).append.

Hice mi trabajo de implementación.

0

llamada Recaptcha.reload(); en caso de devolución de llamada en el código Ajax., se volverá a cargar nueva Recapcha cada vez que el Ajax presentó