Last active
August 21, 2019 22:44
-
-
Save parzibyte/a4938b522fafa4befae2958af60d6875 to your computer and use it in GitHub Desktop.
reCAPTCHA v2 & PHP - https://parzibyte.me/blog/2019/08/21/recaptcha-v2-php-ejemplo-integracion/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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