I have problem with implementing google captcha v3 with phpmailer. When i fill a form and click send. Error occur : Notice: Undefined index: g-recaptcha-response in form.php on line 6 Error!There was a problem with the Captcha, you lied to us! you are a robot! or you just didnt click it :) The error tells that error is in line 6 in form.php so: JS file
<script src='https://www.google.com/recaptcha/api.js?
render=6LemuWIUAAAAAATQOAxYz-30Uf8VbXery0I9J8ZA'></script>
<script>
grecaptcha.ready(function () {
grecaptcha.execute('6LemuWIUAAAAAATQOAxYz-30Uf8VbXery0I9J8ZA', {
action: 'form'
})
});
</script>
PHP file:
<?php
date_default_timezone_set('Etc/UTC');
ini_set('display_errors',1); error_reporting(E_ALL);
if(isset($_POST['submit'])){
$userIP = $_SERVER["REMOTE_ADDR"];
$recaptchaResponse = $_POST['g-recaptcha-response'];
$secretKey = 'abc...';
$request = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$secretKey}&response={$recaptchaResponse}&remoteip={$userIP}");
if(!strstr($request, "true")){
echo '<div class="alert alert-danger" role="alert"><strong>Error!</strong>There was a problem with the Captcha, you lied to us! you are a robot! or you just didnt click it :)</div>';
}
else{
if(isset($_POST['submit']))
{
$message=
'name: '.$_POST['name'].'<br />
email: '.$_POST['email'].'<br />
mess: '.$_POST['message'].'
';
require "class.phpmailer.php";
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->SMTPAuth = true;
$mail->SMTPSecure = "ssl";
$mail->Host = "abc...";
$mail->Port = 465;
$mail->Encoding = '7bit';
$mail->SMTPDebug = 3;
$mail->Username = 'a@a.pl';
$mail->Password = 'abc';
$mail->SetFrom($_POST['email'], $_POST['name']);
$mail->AddReplyTo($_POST['email'], $_POST['name']);
$mail->WordWrap = 50;
$mail->MsgHTML($message);
$mail->AddAddress('a@a.com');
$result = $mail->Send();
$message = $result ? '<div class="alert alert-success" role="alert">
<strong>Success!</strong>Message Sent Successfully!</div>' : '<div
class="alert
alert-danger" role="alert"><strong>Error!</strong>There was a problem
delivering the message.</div>';
unset($mail);
}
}
}
HTML file:
<form action="form.php" method="POST" class="contact__form g-recaptcha"
id="form" data-sitekey="6LdvpmIUAAAAABEO5KGWX1KsIJgPQnZyAJep4lkw">
<div class="form__div">
<label for="name">Name </label>
<input type="text" name="name" id="name" class="input input__name" required/>
</div>
<div class="form__div">
<label for="email">E-mail </label>
<input type="email" name="email" id="email" class="input input__email " required/>
</div>
<div class="form__div">
<label>Message </label>
<textarea rows="5" aria-label="Write something" name="message" class="input input__mess" placeholder="Write..." minlength="10" maxlength="1000" required></textarea>
</div>
<button name="submit" type="submit" id="submit" class="form__button">Wyślij</button>
</form>
This has nothing to do with PHPMailer - that error occurs before any PHPMailer code is run.
You're looking for a value in the $_POST
array called g-recaptcha-response
, but that does not exist, hence the error. You do not have an input element with that name, which is why it's missing from $_POST
. It may be that the google code adds it dynamically from JS, but there's no evidence of it doing that in what you have posted. I'd suggest you read the recaptcha docs more.
Not specifically a problem here, but you're running a very old version of PHPMailer, and have based your code on an obsolete example.
You are not passing the token to request. You have to set token value in the form. You can do something like this.
grecaptcha.ready(function() {
grecaptcha.execute("KEY_VALUE", {action: 'form'})
.then(function(token) {
localStorage.setItem('recaptcha_token', token)
$('form').prepend('<input type="hidden" name="g-recaptcha-response" value="' + token + '">');
});
});