Javascript 带有recaptcha v3的PHP编译器不';t发送电子邮件-未定义索引:g-recaptcha-response
我在使用phpmailer实现google captcha v3时遇到问题。当我填写表格并单击发送时。发生错误: 注意:第6行form.php中未定义的索引:g-recaptcha-response 错误!验证码有问题,你骗了我们!你是个机器人!或者你只是没有点击它:) 错误表明错误在form.php的第6行,因此: JS文件Javascript 带有recaptcha v3的PHP编译器不';t发送电子邮件-未定义索引:g-recaptcha-response,javascript,php,phpmailer,recaptcha,Javascript,Php,Phpmailer,Recaptcha,我在使用phpmailer实现google captcha v3时遇到问题。当我填写表格并单击发送时。发生错误: 注意:第6行form.php中未定义的索引:g-recaptcha-response 错误!验证码有问题,你骗了我们!你是个机器人!或者你只是没有点击它:) 错误表明错误在form.php的第6行,因此: JS文件 grecaptcha.ready(函数(){ grecaptcha.execute('6LemuWIUAAAAAATQOAxYz-30Uf8VbXery0I9J8ZA'
grecaptcha.ready(函数(){
grecaptcha.execute('6LemuWIUAAAAAATQOAxYz-30Uf8VbXery0I9J8ZA'{
行动:‘表格’
})
});
PHP文件:
<?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);
}
}
}
这与PHPMailer无关-该错误发生在任何PHPMailer代码运行之前
您正在$\u POST
数组中查找名为g-recaptcha-response
的值,但该值不存在,因此出现错误。您没有具有该名称的输入元素,这就是为什么$\u POST
中缺少该元素的原因。可能是google代码从JS动态添加了它,但在您发布的内容中没有证据表明它这样做。我建议你多读一些recaptcha文档
这不是一个特别的问题,但是您运行的是非常旧版本的PHPMailer,并且您的代码基于一个过时的示例。您没有将令牌传递给请求。您必须在表单中设置令牌值。
你可以这样做
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 + '">');
});
});
grecaptcha.ready(函数(){
execute(“KEY_VALUE”,{action:'form'})
.then(功能(令牌){
setItem('recaptcha_标记',标记)
$('form')。前缀(“”);
});
});
<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>
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 + '">');
});
});