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