Comprobar Recaptcha con Ajax usando jQuery
Seguramente muchos uséis en vuestras aplicaciones/páginas web el sistema de captcha de Google, también conocido como «Recaptcha«. Bien, pues hoy vamos a aprender como comprobar si el visitante ha introducido correctamente el captcha sin tener que recargar la pagina, utilizando Ajax através de jQuery.
- Lo primero de todo, tenemos que tener una cuenta de Google y darnos de alta en la web de Recaptcha.
- Aquí tenemos que dar de alta nuestra página web, esto es para que nos proporcionen las claves necesarias que usa el script.
- Ahora nos descargamos la librería PHP desde aquí.
La librería que hemos descargado incluye varios archivos con ejemplos, pero nosotros sólo vamos a utilizar el archivo que contiene la librería, llamado «recaptchalib.php«.
Vamos con el código:
Primero, vamos a crear el archivo «comprobar.php» que es el encargado de comprobar desde el lado servidor si se ha introducido bien el captcha:
require_once('recaptchalib.php'); $privatekey = "tu clave privada"; $resp = recaptcha_check_answer ($privatekey,$_SERVER["REMOTE_ADDR"],$_POST["recaptcha_challenge_field"],$_POST["recaptcha_response_field"]); if (!$resp->is_valid) { //ERROR EN EL CAPTCHA echo 0; }else{ //CAPTCHA CORRECTO echo 1; }
En la variable «$privatekey» tenéis que introducir vuestra clave privada que os han proporcionado al registrar vuestro sitio en la web de Recaptcha.
Ahora vamos a crear nuestro formulario, podeis llamar el archivo como queráis:
- Primero incluimos la librería jQuery:
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script> $(function(){ function captcha(){ var v1 = $("input#recaptcha_challenge_field").val(); var v2 = $("input#recaptcha_response_field").val(); $.ajax({ type: "POST", url: "comprobar.php", data: { "recaptcha_challenge_field" : v1, "recaptcha_response_field" : v2 }, dataType: "text", error: function(){ alert("error petición ajax"); }, success: function(data){ alert(data); } }); } $("#boton").click(captcha); }); </script>
- Expliquemos esto un poco:
- Primero obtenemos los valores del Recaptcha introducidos en el formulario:
var v1 = $("input#recaptcha_challenge_field").val(); var v2 = $("input#recaptcha_response_field").val();
$.ajax({ type: "POST", //Método a usar url: "comprobar.php", //Url del archivo data: "recaptcha_challenge_field="+v1+"&recaptcha_response_field="+v2, /*data: son los valores que le mandamos a 'comprobar.php' por el método POST*/ dataType: "html", //el tipo de dato que se espera recibir error: function(){ alert("error petición ajax"); //muestra una alerta si no se realiza la petición }, success: function(data){ alert(data); /*devuelve el resultado de la petición en la variable 'data' y lo muestra en una alerta*/ } });
$("#boton").click(captcha);
<form action="enviar_email.php" method="post"> <?php //muestra el recaptcha en el formulario require_once('recaptchalib.php'); $publickey = "tu clave publica"; echo recaptcha_get_html($publickey); ?> <input type="button" value="aceptar" id="boton" /> </form>
En la variable «$publickey» va vuestra clave pública.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>https://blog.reaccionestudio.com/</title> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <script> $(function(){ function captcha(){ var v1 = $("input#recaptcha_challenge_field").val(); var v2 = $("input#recaptcha_response_field").val(); $.ajax({ type: "POST", url: "comprobar.php", data: "recaptcha_challenge_field="+v1+"&recaptcha_response_field="+v2, dataType: "html", error: function(){ alert("error petición ajax"); }, success: function(data){ alert(data); } }); } $("#boton").click(captcha); }); </script> </head> <body> <form action="enviar_email.php" method="post"> <?php require_once('recaptchalib.php'); $publickey = "tu clave pública"; echo recaptcha_get_html($publickey); ?> <input type="button" value="aceptar" id="boton" /> </form> </body> </html>
Para personalizarlo, yo haría que en el «success:» del método «$.ajax» de jQuery, si la variable «data» es incorrecta me mostrara un mensaje avisando al visitante, y si es correcto, que mande el formulario. Algo como esto:
success: function(data){ if(data == 0){ $("#msjform").html("El código de seguridad introducido es incorrecto."); Recaptcha.reload(); //recarga Recaptcha. }else if(data == 1){ $("#formulario").submit(); } }