Solución:
Código simple para implementar ReCaptcha v3
El código JS básico
El código HTML básico
El código PHP básico
if (isset($_POST['g-recaptcha-response']))
$captcha = $_POST['g-recaptcha-response'];
else
$captcha = false;
if (!$captcha)
//Do something with error
else
$secret = 'Your secret key here';
$response = file_get_contents(
"https://www.google.com/recaptcha/api/siteverify?secret=" . $secret . "&response=" . $captcha . "&remoteip=" . $_SERVER['REMOTE_ADDR']
);
// use json_decode to extract json response
$response = json_decode($response);
if ($response->success === false)
//Do something with error
//... The Captcha is valid you can continue with the rest of your code
//... Add code to filter access using $response . score
if ($response->success==true && $response->score <= 0.5)
//Do something to denied access
Tienes que filtrar el acceso usando el valor de $ response.score. Puede tomar valores de 0.0 a 1.0, donde 1.0 significa la mejor interacción del usuario con su sitio y 0.0 la peor interacción (como un bot). Puede ver algunos ejemplos de uso en la documentación de ReCaptcha.
Supongo que tiene la clave del sitio y el secreto en su lugar. Siga este paso.
En su archivo HTML, agregue el script.
Además, use jQuery para facilitar el manejo de eventos.
Aquí está la forma simple.
Debe inicializar el recaptcha de Google y escuchar el evento listo. A continuación se explica cómo hacerlo.
Aquí está el archivo PHP de muestra. Puede usar Servlet o Node o cualquier idioma de backend en su lugar.
Please check the the captcha form.';
exit;
$secretKey = "put your secret key here";
$ip = $_SERVER['REMOTE_ADDR'];
// post request to server
$url = 'https://www.google.com/recaptcha/api/siteverify?secret=' . urlencode($secretKey) . '&response=' . urlencode($captcha);
$response = file_get_contents($url);
$responseKeys = json_decode($response,true);
header('Content-type: application/json');
if($responseKeys["success"])
echo json_encode(array('success' => 'true'));
else
echo json_encode(array('success' => 'false'));
?>
Aquí está el enlace del tutorial: https://codeforgeek.com/2019/02/google-recaptcha-v3-tutorial/
Espero eso ayude.
Pensé que una demostración de ejemplo de reCaptcha v3 en pleno funcionamiento en PHP, utilizando un formulario Bootstrap 4, podría ser útil para algunos.
Haga referencia a las dependencias que se muestran, intercambie su dirección de correo electrónico y claves (cree sus propias claves aquí), y el formulario está listo para probar y usar. Hice comentarios de código para aclarar mejor la lógica y también incluí el registro de la consola con comentarios y las líneas print_r para permitir ver rápidamente el token de validación y los datos generados desde Google.
La función jQuery incluida es opcional, aunque crea una experiencia de aviso de usuario mucho mejor en esta demostración.
Archivo PHP (mail.php
):
Agregar clave secreta (2 lugares) y la dirección de correo electrónico donde se indique.
"your-secret-key-here",
'response' => $_POST['token'],
'remoteip' => $_SERVER['REMOTE_ADDR']
];
$options = array(
'http' => array(
'header' => "Content-type: application/x-www-form-urlencodedrn",
'method' => 'POST',
'content' => http_build_query($data)
)
);
# Creates and returns stream context with options supplied in options preset
$context = stream_context_create($options);
# file_get_contents() is the preferred way to read the contents of a file into a string
$response = file_get_contents($url, false, $context);
# Takes a JSON encoded string and converts it into a PHP variable
$res = json_decode($response, true);
# END setting reCaptcha v3 validation data
// print_r($response);
# Post form OR output alert and bypass post if false. NOTE: score conditional is optional
# since the successful score default is set at >= 0.5 by Google. Some developers want to
# be able to control score result conditions, so I included that in this example.
if ($res['success'] == true && $res['score'] >= 0.5)
# Recipient email
$mail_to = "[email protected]";
# Sender form data
$subject = trim($_POST["subject"]);
$name = str_replace(array("r","n"),array(" "," ") , strip_tags(trim($_POST["name"])));
$email = filter_var(trim($_POST["email"]), FILTER_SANITIZE_EMAIL);
$phone = trim($_POST["phone"]);
$message = trim($_POST["message"]);
if (empty($name) OR !filter_var($email, FILTER_VALIDATE_EMAIL) OR empty($phone) OR empty($subject) OR empty($message))
# Set a 400 (bad request) response code and exit
http_response_code(400);
echo 'Please complete the form and try again.
';
exit;
# Mail content
$content = "Name: $namen";
$content .= "Email: $emailnn";
$content .= "Phone: $phonen";
$content .= "Message:n$messagen";
# Email headers
$headers = "From: $name <$email>";
# Send the email
$success = mail($mail_to, $subject, $content, $headers);
if ($success)
# Set a 200 (okay) response code
http_response_code(200);
echo 'Thank You! Your message has been successfully sent.
';
else
# Set a 500 (internal server error) response code
http_response_code(500);
echo 'Something went wrong, your message could not be sent.
';
else
echo '
Error! The security token has expired or you are a bot.
';
else
# Not a POST request, set a 403 (forbidden) response code
http_response_code(403);
echo 'There was a problem with your submission, please try again.
';
?>
HTML
Dependencia de Bootstrap CSS y validación del lado del cliente de reCaptchaLugar entre etiquetas: pegue su propia clave de sitio donde se indique.
HTML
Lugar entre etiquetas.
Contact Form
Función jQuery opcional para mejorar la experiencia de usuario (form.js
):
(function ($)
'use strict';
var form = $('.contact_form'),
message = $('.contact_msg'),
form_data;
// Success function
function done_func(response)
message.fadeIn()
message.html(response);
setTimeout(function ()
message.fadeOut();
, 10000);
form.find('input:not([type="submit"]), textarea').val('');
// fail function
function fail_func(data)
message.fadeIn()
message.html(data.responseText);
setTimeout(function ()
message.fadeOut();
, 10000);
form.submit(function (e)
e.preventDefault();
form_data = $(this).serialize();
$.ajax(
type: 'POST',
url: form.attr('action'),
data: form_data
)
.done(done_func)
.fail(fail_func);
); )(jQuery);
No se te olvide comunicar esta reseña si te valió la pena.