Ejemplo de cómo implementar Google Captcha en php (reCaptcha v2)

[…]


por

Google Captcha se ha convertido en uno de los métodos más utilizados para filtrar y evitar la constante afluencia de correos spam en los formularios de nuestra web.

Google Captcha php

 

Si trabajas con WordPress o algún otro CMS, ya existen muchos plugins o módulos preparados para implementarlo, pero si estás maquetando o programando una web a medida, deberás añadirlo de forma manual a tus formularios.

Aunque es bastante sencillo e intuitivo, os dejo un ejemplo de cómo implementar Google reCaptcha en un formulario de una web desarrollado en PHP

 

  1. Al inicio de la página, incluimos la llamada al archivo con las funciones necesarias para validar el código captcha en php
 require_once "includes/recaptchalib.php";

Aquí puedes descargarte el archivo para subirlo a tu servidor

2.  En la cabecera de la página (entrey) añadimos llamada al script de google, en este caso añadimos el parámetro hl que hace referencia al idioma en que quieres que aparezca

<script src="https://www.google.com/recaptcha/api.js?hl=es" async defer></script>

 

3. En el de la página, en el lugar del formulario que queremos que aparezca el captcha:

<div class="g-recaptcha" data-sitekey="CLAVE EJEMPLO"></div>

 

Ojo, el parámetro data-sitekey lo debes personalizar añadiendo el que Google te dé al dar de alta la web que quieras proteger. Para dar de alta la web y obtener el API key, accede aquí

4. Al procesar el formulario verificas que el código es correcto:

    
 $secret = "CLAVE_SECRETA";
 $response = null;
 // comprueba la clave secreta
 $reCaptcha = new ReCaptcha($secret);
 if ($_POST["g-recaptcha-response"]) {
     $response = $reCaptcha->verifyResponse(
     $_SERVER["REMOTE_ADDR"],
     $_POST["g-recaptcha-response"]
     );
  }
 
 if ($response != null && $response->success) {
    // Si el código es correcto, seguimos procesando el formulario como siempre
  } else {
    // Si el código no es válido, lanzamos mensaje de error al usuario
  }

 

Problema con Google reCaptcha: la respuesta es siempre no válido

Recientemente me he encontrado un problema al implementar el código de reCaptcha.

Después de haberlo hecho de la misma forma en decenas de sitios, al hacerlo en una web de un cliente la respuesta era siempre que el código no era válido.

No se exactamente la razón ni el problema, pero después de descartar muchas otras cosas, he llegado a la conclusión de que está relacionado con la configuración del servidor. En cualquier caso, he encontrado otra forma de hacerlo que sí me ha funcionado.

La dejo aquí por si te encuentras con el mismo caso.

Los primeros 3 puntos serían iguales, lo que cambiaría es el punto 4, al procesar el formulario, que sustituiríamos por:

 

$secret = "6Le_AyoTA-EJEMPLO-6kY6w_fcPMwEqL";
if (isset($_POST['g-recaptcha-response'])) {
$captcha = $_POST['g-recaptcha-response']; 
$url = 'https://www.google.com/recaptcha/api/siteverify';
$data = array(
'secret' => $secret,
'response' => $captcha,
'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) {
// Si el código es correcto, seguimos procesando el formulario como siempre 
} else { 
// Si el código no es válido, lanzamos mensaje de error al usuario 
}

 

Si necesitas el mismo código pero en ASP clásico, puedes encontrar un ejemplo en este artículo

Y si necesitas ayuda con el código de reCaptcha v3, aquí tienes información

 

¿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

24 respuestas a «Ejemplo de cómo implementar Google Captcha en php (reCaptcha v2)»

  1. Avatar de Cristina Moran

    |

    Muchas gracias! Siempre me sirven tus ejemplos!

    1. Avatar de esther

      |

      Gracias a ti!

  2. Avatar de Leire

    |

    Soy novato en esto y aun siguiendo tu ejemplo no he sido capaz de que funcione, tengo un formulario en HTML y el que recepciona los datos y lo envia a mi correo en PHP, y me siguen llegando los correos sin hacer caso de la recaptcha de google, que ni me solicita rellenarla.

    te podría enviar mis 2 formularios para saber donde esta el error,

    Gracias

    1. Avatar de esther

      |

      Hola!

      En éste ejemplo, el archivo que contiene el formulario y el captcha es un php, donde has de incluir el archivo «recaptchalib.php» que comento en el punto 1.

      Saludos!

  3. Avatar de Antonio

    |

    Hola, tengo unos formularios en wordpress hechos en html, sin plugin, mediante post y action a un php en el que se integran los datos en mi crm y no consigo añadir el captcha de google a mis formularios, ¿podría ayudarme?

    Saludos

    1. Avatar de esther

      |

      Hola Antonio! Como es un caso muy concreto, si quieres envíame un email o un formulario de contacto y miramos el tema a ver si puedo ayudarte, ok?

      Saludos!

  4. Avatar de Gabriel

    |

    Hola, queria hacerte una consulta, porque yo logre hacer todo, pero no me verifica, resuelvo el Recaptcha y me da como verificado, pero si no lo hago, me sale un cartel de NO verificado, pero el formulario me lo envia igual,

    por lo que encontre en tu web, creo que puede ser por
    1
    require_once «includes/recaptchalib.php»;

    donde va eso???

    yo tengo el formulario en un html, de ahi va a un enviar.php donde esta todo el codigo recaptcha y cuando termina va a un cont.php, donde doy las gracias

    1. Avatar de esther

      |

      Hola Gabriel!
      En tu caso la instrucción del include debería ir en el archivo enviar.php, que es donde debes hacer la comprobación de si es correcto o no y ese caso enviar o no el formulario.

      Saludos!

  5. Avatar de Avi

    |

    Tal y como comentabas, me daba error siempre a mi también y has venido a dar con la solución después de un rato de lucha! Muchas gracias!

    1. Avatar de esther

      |

      Genial! Me alegra que te haya servido.
      Saludos!

  6. Avatar de Victor

    |

    Gracias esthersola!! tu ejemplo json me salvó!! Parece que la config de este server tenía algo porque mi código siempre funcionaba bien hasta ayer! Estuve lidiando con ese error hasta que probé tu solución, muchas gracias de nuevo.

    1. Avatar de esther

      |

      Genial! Me alegra haberte ayudado Victor.

  7. Avatar de Kara

    |

    Buenas noches, estoy intentando hacer, pero me sale un error «ERROR para el propietario del sitio web: la clave del sitio web no es válida» – en lugar de salir el codigo verifcacion
    que puedo hacer? el formulario es en HTML con PHP? y si lo tengo en php como lo haria.

    1. Avatar de esther

      |

      Hola Kara,
      En el artículo comento la opción que encontré para solucionar el error de «no válido», si te sigue fallando puedes probar con la nueva versión de reCaptcha 3 que está más actualizado.

      Saludos!

  8. Avatar de Daniel Bordón

    |

    Hola,
    Muy buen artículo, funciona perfecto el código, excelente

    1. Avatar de esther

      |

      Muchas gracias Daniel!

  9. Avatar de KIKE

    |

    Tenia el mismo problema que mencionas, con tu ayuda pude solucionarlo, MUCHAS GRACIAS

    1. Avatar de esther

      |

      De nada Kike! Me alegra haberte ayudado.

  10. Avatar de Patricio

    |

    Hola,

    Que debo poner en REMOTE_ADDR? en la función que valida la respuesta?

    1. Avatar de esther

      |

      Hola Patricio,
      No has de poner nada, $_SERVER[«REMOTE_ADDR»] es una variable de php que muestra la IP desde la que se está conectando el usuario.

      Saludos!

  11. Avatar de Eve

    |

    Muchas gracias, tenia el problema que comentas al final y funciono de maravilla!

    1. Avatar de esther

      |

      Gracias Eve! Me alegro mucho que te haya servido.

  12. Avatar de Fejame

    |

    Me ayudo mucho. gracias por el aporte

  13. Avatar de macmanzanero

    |

    Me estaba volviendo loco con el reCaptcha, siempre lo recibía no válido. Gracias a tu aporte lo he solucionado.