Recientemente he tenido que configurar Google reCaptcha v3 en dos páginas web con PHP a medida, y aún siendo ambas muy parecidas, la solución que me ha funcionado ha sido algo diferente en cada una, seguramente debido a la configuración del servidor del hosting.
Google reCaptcha se ha convertido en la solución más habitual a la hora de evitar el spam a través de formularios de contacto, registro, etc… en una web. La ventaja de esta versión 3, es que en la mayoría de casos resulta invisible para el usuario, y a menos que detecte nada «sospechoso», no deberá hacer nada adicional, ni introducir código, ni buscar los semáforos en un conjunto de fotos, ni siquiera marcar una casilla para confirmar que es humano.

¿Cómo configurar Google reCaptcha v3?
Paso 1: Obtener las claves API de Google
Como ya pasaba con la versión anterior, lo primero que vamos a tener que hacer es configurar en Google nuestro sitio para obtener las claves API.
- Vamos a https://www.google.com/recaptcha/admin/create con nuestra sesión iniciada (o la de la cuenta de Google que queramos asociar)
- Rellenamos los datos del tipo de captcha, los dominios relacionados (podemos relacionar más de un dominio con el mismo captcha)
- Aceptamos las condiciones para optener las claves API
Una vez tenemos la Clave del Sitio Web y la Clave Secreta, ya podemos configurarlo en nuestro sitio en PHP

Paso 2: cargar código del reCaptcha en la web
Una vez tenemos las claves, tendremos que utilizar el siguiente código para cargar la funcionalidad en la cabecera página donde tengamos nuestro formulario, sustituyendo CLAVE_SITIO_WEB por la que nos haya dado Google.
Código entre las etiquetas <head></head> de la página del formulario:
<script src='https://www.google.com/recaptcha/api.js?render=CLAVE_SITIO_WEB'>
</script>
<script>
grecaptcha.ready(function() {
grecaptcha.execute('CLAVE_SITIO_WEB', {action: 'formulario'})
.then(function(token) {
var recaptchaResponse = document.getElementById('recaptchaResponse');
recaptchaResponse.value = token;
});});
</script>
Y añadiremos un campo oculto dentro del formulario:
<input type="hidden" name="recaptcha_response" id="recaptchaResponse">
Paso 3: validar el formulario
La segunda parte sería la validación de ese formulario, correspondería a la parte del servidor, en PHP, donde se verifica que es correcto y envía o no el formulario.
Es en esta segunda parte donde yo he tenido que usar dos códigos diferentes porque no me funcionaba el mismo, y os pongo las dos alternativas por si os ocurriera lo mismo.
El primero es el más habitual y el que podríais probar de entrada:
if (isset($_POST['action']) && ($_POST['action'] == 'process')) {
$recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_secret = 'CLAVE_SECRETA';
$recaptcha_response = $_POST['recaptcha_response'];
$recaptcha = file_get_contents($recaptcha_url . '?secret=' . $recaptcha_secret . '&response=' . $recaptcha_response);
$recaptcha = json_decode($recaptcha);
if($recaptcha->score >= 0.7){
// código para procesar los campos y enviar el form
} else {
// código para lanzar aviso de error en el envío
}
}
Sustituyendo CLAVE_SECRETA por vuestra clave API, tenéis que añadir este script al código donde proceséis el formulario enviado, comprobando que ¢recaptcha->score sea superior al nivel de spam que queráis filtrar.
En este ejemplo filtramos todos los que se consideran con una puntuación igual o mayor a 0.7, pero podríamos modificarlo según nuestras necesidades o el tipo de formulario y cliente que suele acceder.
Aunque este es el código habitual que se suele encontrar y que funciona en muchos casos, como comentaba al principio a mi en un proyecto no me acababa de ir bien, devolvíendome siempre el error missing-input-response.
El problema parece ser el file_get_contents, por lo que probando diferentes opciones encontré esta que utiliza la librería curl en su lugar y me funcionó correctamente:
Segunda opción de validación:
$recaptcha_secret = 'CLAVE_SECRETA';
$recaptcha_response = $_POST['recaptcha_response'];
$url = 'https://www.google.com/recaptcha/api/siteverify';
$data = array( 'secret' => $recaptcha_secret, 'response' => $recaptcha_response, 'remoteip' => $_SERVER['REMOTE_ADDR'] );
$curlConfig = array( CURLOPT_URL => $url, CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => $data );
$ch = curl_init();
curl_setopt_array($ch, $curlConfig);
$response = curl_exec($ch);
curl_close($ch);
$jsonResponse = json_decode($response);
if ($jsonResponse->success === true) {
// Código para procesar el formulario
} else {
// Código para aviso de error
}
Son dos alternativas que hacen lo mismo pero utilizando funciones o librerías de PHP diferentes, y como no siempre los servidores o hostings tienen la misma configuración, va bien tenerlo en cuenta para cuando debemos implementar el Google reCaptcha v3 para diferentes páginas web.
En este otro artículo tenéis el código para la v2 de captcha, aunque recomiendo ya utilizar la nueva.
Más información sobre reCaptcha: https://developers.google.com/recaptcha
¿Eres implementador o desarrollador WordPress?
En la Zona DPW encontrarás más recursos, tutoriales, plantillas, y una biblioteca de snippets para poder utilizar en tu día a día y ganar tiempo en tu trabajo:
ACCEDER AHORA
Comentarios
31 respuestas a «Google reCaptcha v3 y php opciones y problemas»
|
Hola Esther.
Gracias por compartir esta información.
¿Tienes alguna sugerencia para cuando no podemos o no queremos usar el recaptcha de Google?, ¿algún sistema de captcha alternativo que recomiendes?
Saludos
|
Hola Alberto!
La forma más sencilla, para no utilizar ningún script externo, es el llamado «honeypot», que consiste en añadir un campo oculto en el formulario y validar si tiene contenido o no. Teóricamente, los robots lo rellenan y los humanos no, por lo que puedes validar si si ese campo tiene contenido, y si es así bloquear el envío.
En muchas ocasiones con eso es suficiente y te ahorras el Google reCaptcha o cualquier otro.
Saludos!
|
¡Muchas gracias, Esther!
Sí, había oído hablar de esa «técnica» o truco. Lo probaré, sin duda.
Un saludo
|
Muchísimas gracias por la información. Llevaba todo el fin de semana revisando las librerías de php en mi servidor y no encontraba la forma de que funcionara.
|
Genial! Gracias Roberto, me alegra que te haya sido útil.
|
Hola Esther, me gusta tu explicación, soy aficionado solamente, pero tengo una web en php que quiero añadirle el recaptcha V3 de google para evitar los robots.
No tengo claro si la parte de código de validación, la tengo que poner en el archivo (php) donde tengo el formulario que rellena el usuario o en el archivo (php) que recibe los datos (el post) de ese archivo, ya que el método: $_POST[‘…’]) recoge los datos en el archivo de destino, según tengo entendido.
Muchas gracias por tu ayuda.
|
Hola Carlos,
El código de validación ha de ir en el php que recibe los datos, ya sea el mismo en el que está el formulario u otro, ya que a veces se programa todo dentro del mismo archivo y otras se envía a uno diferente.
Espero haberte aclarado la duda!
|
Hola Esther
Yo tengo validado recaptcha en el formulario, pero además quiero añadirlo a cada entrada de mi blog, debajo del botón «publicar comentario»
¿Sabes como hacerlo?
|
Hola Patricia!
Yo para los comentarios uso Akismet, que filtra todo el spam automáticamente y me funciona muy bien.
Si prefieres usar específicamente reCaptcha, hay algún plugin que lo configura en los comentarios, como este: https://es.wordpress.org/plugins/google-captcha/, aunque no lo he probado y no se decirte qué tal funciona.
Un saludo!
|
De acuerdo Esther, entonces instalaré Akismet que he escuchado hablar de él, ya que el otro no lo conozco.
Muchísimas gracias por tu post y tu ayuda.
Un saludo 🙂
|
Hola que tal Esther, gracias por el post, realmente me ayudó.
no encontraba solución al problema de usar file_get_contents.
un post excelente!
|
Hola Rolando,
Muchas gracias! Me alegra que te haya sido útil 🙂
Saludos!
|
Hola, agradecido por tu post, pero sigo teniendo problemas en mi server, en local me funciona el metodo 2, pero no así en el server PHP Version 7.2.11, en el local tengo PHP Version 7.2.26, podra ser este el problema? o el ejemplo 2 debiera funcionar si o si?
Saludos
|
Hola Michael!
Es complicado saber porque no te funciona correctamente, ya que intervienen muchos temas. La opción dos, por ejemplo, usa la librería cUrl de PHP, si tu servidor no la tiene activa no te funcionará. Consulta el soporte téncico y coméntales el problema, seguro que te podrán ayudar.
Saludos!
|
Hola…muchas gracias por compartir la info. Estoy teniendo problemas y veo que en mi consola javascript veo el siguiente problema:
Uncaught (in promise) null
Luego de eso nada me funciona. Busque algunas posibles soluciones pero el problema sigue.
Saludos
|
Hola…ya lo solucioné, no me queda claro como lo hice. Creo que tenia un problema en la definición de los dominios. Tenía un dominio y subdominio y solo dejé el dominio principal.
|
Genial! Me alegra que hayas podido solucionarlo.
Un saludo!
|
Hola Esther. Desde que instale recaptcha v3 por medio de Contact Forum 7, en el navegador me sale «No es seguro» cuando abro mi web. Tengo el certificado válido. Por favor puedes decirme como solucionar este problema. Gracias.
|
Hola Roberto,
Pues es extraño, no me ha ocurrido nunca al implementar reCaptcha. Puedes revisar los avisos de la consola del navegador para ver si te aparece algun error de contenido mixto y su origen, y ver si realmente tiene que ver con la validación de Google.
Saludos!
|
Hola Esther
Gracias por tu información, es de gran ayuda para instalarla en la web,
mi duda va mas por las cookies, Google ha asegurado en anteriores ocasiones que los datos que se capturan a través de reCaptcha no se utilizan para la segmentación de anuncios ni para analizar los intereses y preferencias de los usuarios.
Crees que es así? No pondré en peligro mi web por un tema legal, por si alguien cree que estamos cogiendo sus datos sin permisos?
Recibe un saludo
|
Hola César,
Sí, el tema de la privacidad de los datos nos preocupa a muchos. Yo implemento reCaptcha cuando los otros métodos de validación no acaban de funcionar y el spam llega a ser un problema recurrente, en muchas ocasiones no es así y no es necesario instalarlo.
También hay que tener en cuenta si en esa web está configurado el código de analytics, porque en ese caso Google ya tiene acceso a los datos.
Saludos!
|
Hola, tengo una duda, el reCaptcha es solo para formularios o tambien se puede poner en una página sin formularios? qué utilidad tendría ? gracias!
|
Hola Meri,
En una web el spam nos llega a través de los formularios, ya sean de contacto, comentariios o incluso de registro. En estos casos reCaptcha u otro servicio o plugin de anti-spam nos puede ser útil. Si no tenemos ningún formulario no sería necesario y no lo recomiendo, ya que estás conectando con un servicio externo sin necesidad, y haciendo peticiones externas, que pueden ralentizar la carga, que no vas a utilizar.
Saludos!
|
Hola Esther tengo actualmente instalado Recaptcha v3 y de un tiempo para aca, cuando voy a escribir un mensaje, me aparece un error
El envío se consideró spam.
He retrocedido plugins para ver si existe algun error. Pero nada.
Y no encuentro solución.
|
Hola Carolina,
Imagino que la web está en WordPress, por lo que comentas de los plugins.
Podría ser alguna incompatibilidad o problema con scripts de otros plugins o del tema, es complicado de saber. Yo probaría de desactivar todos los plugins posibles e ir revisando si sigue dando error e ir descartando. Lo mismo para el tema si no encuentras el origen del problema en un plugin.
Saludos!
|
Buenas Esther:
Uso RECAPTCHA 3 en mi web via Contat Form 7 y cada vez que hago un test de velocidad de google con LightHouse veo que el tiempo de carga se ve muy afectado por RECAPTCHA 3 (hasta 1,08 segundos!). Hay algún amanera de recudiere dicho tiempo usado por el JavaScript?? Creo que es una de las cosas que más me penaliza y he llegado a pensar en eliminar Contact Form para cambiar a la version 2 de RECAPTHCA
|
Hola Oscar,
Yo cada vez soy más partidaria de no usar los reCaptcha de Google.
Hay este plugin https://es.wordpress.org/plugins/wpcf7-recaptcha/ que en teoría te permite usar el reCaptcha v2 en las últimas versiones de CF7 en lugar de la v3. Puedes probar a ver si te sirve y te mejora la velocidad.
Saludos!
|
Este funciona:
/* ——————————————————————————
RECAPCHA
——————————————————————————-*/
if(isset($_POST[‘g-recaptcha-response’])){
//La respuesta del recaptcha
$respuesta=$_POST[‘g-recaptcha-response’];
//La ip del usuario
$ipuser=$_SERVER[‘REMOTE_ADDR’];
//Tu clave secretra de recaptcha
$clavesecreta=’TU KEY SECRECT’;
//La url preparada para enviar
$urlrecaptcha=»https://www.google.com/recaptcha/api/siteverify?secret=$clavesecreta&response=$respuesta&remoteip=$ipuser»;
//Leemos la respuesta (suele funcionar solo en remoto)
$respuesta = file_get_contents($urlrecaptcha) ;
//Comprobamos el success
$dividir=explode(‘»success»:’,$respuesta);
$obtener=explode(‘,’,$dividir[1]);
//Obtenemos el estado
$estado=trim($obtener[0]);
if ($estado==’true’){
//Si es ok
echo ‘-> Ok’;
} else if ($estado==’false’){
//Si es error
echo ‘-> Error’;
}
}
|
Gracias!
|
Buenos días
Soy programador y técnico en servidores llevo desde los 90s construyendo webs
Actualmente estoy haciendo un análisis sobre Recapcha Google sobre la necesidad tan imperiosa de los Recapcha de Google la MODA como Gmail mapas de Google que ahora ya están pasando por caja cobran Gmails y mapas por visualizaciones, pero Bueno.
Vamos a ir a la Moda actualmente tengo una versión muy sencillita de Jquery retocada para que no pese conecta con TOKEN de Google todo perfecto en 4 webs
La caña todo OK, pero un detalle descenso en envíos de correos a la gente no le gustan los semáforos
Una técnica para mis clientes que contratan por formulario truco (haz tu reserva en un minuto)
Realmente se necesita un Recapcha si el formulario está mal montado como se hace spam en un formulario si esta mal montado cuando rellenas y te redirigen a otra página dándote el mensajito Hola hemos recibido la notificación de envió entonces tu tiras para atrás y ves el formulario rellenado y sin tope.
Y tengo en otras dos webs PHP Mailer Master es el rey de los formularios que este es con el que trabajo hace años con V3 resultado satisfactorio.
Y con más información que con las V2
|
La alternativa 2 me vino genial para un desarrollo a medida que por obligación debe tener la versión PHP 5.6
Muchas gracias Esther 😀