Skip to content

Instantly share code, notes, and snippets.

@parzibyte
Last active August 21, 2019 22:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save parzibyte/a4938b522fafa4befae2958af60d6875 to your computer and use it in GitHub Desktop.
Save parzibyte/a4938b522fafa4befae2958af60d6875 to your computer and use it in GitHub Desktop.
<?php
/*
Integrar reCAPTCHA v2 con PHP
https://parzibyte.me/blog
Programado por Luis Cabrera Benito
____ _____ _ _ _
| _ \ | __ \ (_) | | |
| |_) |_ _ | |__) |_ _ _ __ _____| |__ _ _| |_ ___
| _ <| | | | | ___/ _` | '__|_ / | '_ \| | | | __/ _ \
| |_) | |_| | | | | (_| | | / /| | |_) | |_| | || __/
|____/ \__, | |_| \__,_|_| /___|_|_.__/ \__, |\__\___|
__/ | __/ |
|___/ |___/
Blog: https://parzibyte.me/blog
Ayuda: https://parzibyte.me/blog/contrataciones-ayuda/
Contacto: https://parzibyte.me/blog/contacto/
*/
# Aquí pon la clave secreta que obtuviste en la página de developers de Google
define("CLAVE_SECRETA", "TU_CLAVE_VA_AQUÍ");
# Comprobamos si enviaron el dato
if (!isset($_POST["g-recaptcha-response"]) || empty($_POST["g-recaptcha-response"])) {
exit("Debes completar el captcha");
}
# Antes de comprobar usuario y contraseña, vemos si resolvieron el captcha
$token = $_POST["g-recaptcha-response"];
$verificado = verificarToken($token, CLAVE_SECRETA);
# Si no ha pasado la prueba
if ($verificado) {
/**
* Llegados a este punto podemos confirmar que el usuario
* no es un robot. Aquí debes hacer lo que se deba hacer, es decir,
* comprobar las credenciales, darle acceso, etcétera, pues
* ya ha pasado el captcha
*/
echo "Has completado la prueba :)";
} else {
exit("Lo siento, parece que eres un robot");
}
/**
* Verifica el token del captcha y regresa true o false
* true en caso de que el usuario haya pasado la prueba
* false en caso contrario
*
* Más información: https://parzibyte.me/blog/2019/08/21/peticion-http-php-json-formulario/
*
* @author parzibyte
* @see https://parzibyte.me/blog
*/
function verificarToken($token, $claveSecreta)
{
# La API en donde verificamos el token
$url = "https://www.google.com/recaptcha/api/siteverify";
# Los datos que enviamos a Google
$datos = [
"secret" => $claveSecreta,
"response" => $token,
];
// Crear opciones de la petición HTTP
$opciones = array(
"http" => array(
"header" => "Content-type: application/x-www-form-urlencoded\r\n",
"method" => "POST",
"content" => http_build_query($datos), # Agregar el contenido definido antes
),
);
# Preparar petición
$contexto = stream_context_create($opciones);
# Hacerla
$resultado = file_get_contents($url, false, $contexto);
# Si hay problemas con la petición (por ejemplo, que no hay internet o algo así)
# entonces se regresa false. Este NO es un problema con el captcha, sino con la conexión
# al servidor de Google
if ($resultado === false) {
# Error haciendo petición
return false;
}
# En caso de que no haya regresado false, decodificamos con JSON
# https://parzibyte.me/blog/2018/12/26/codificar-decodificar-json-php/
$resultado = json_decode($resultado);
# La variable que nos interesa para saber si el usuario pasó o no la prueba
# está en success
$pruebaPasada = $resultado->success;
# Regresamos ese valor, y listo (sí, ya sé que se podría regresar $resultado->success)
return $pruebaPasada;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment