Задать вопрос
@kris_1220

Как добавить reCAPTCHA к форме PHPMailer?

Помогите пожалуйста добавить reCaptha на сайт
При отправки формы появляется ошибка "Ошибка обработки. Ответ не JSON"
Я понимаю, что дело в троках
if($responseKeys["success"] && $responseKeys["score"] >= 0.5) {
    echo json_encode(array('success' => 'true', 'om_score' => $responseKeys["score"], 'token' => $_POST['token']));
} else {
    echo json_encode(array('success' => 'false', 'om_score' => $responseKeys["score"], 'token' => $_POST['token']));
}

Потому что убрав их, форма отправляется, но я так понимаю, капча не работает...

Ниже код:
<?php
// Файлы phpmailer
require 'phpmailer/PHPMailer.php';
require 'phpmailer/SMTP.php';
require 'phpmailer/Exception.php';

# проверка, что ошибки нет
if (!error_get_last()) {

    // Переменные, которые отправляет пользователь
    $name = $_POST['name'];
    $tel = $_POST['tel'];
    $email = $_POST['email'];
    $number = $_POST['number'];
    $text = $_POST['text'];

    $captcha;
if(isset($_POST['token'])){
	$captcha=$_POST['token'];
}

$secretKey = '***';
$ip = $_SERVER['REMOTE_ADDR'];

$url =  'https://www.google.com/recaptcha/api/siteverify?secret=' . $secretKey .  '&response=' . $_POST['token'];

$response = file_get_contents($url);
$responseKeys = json_decode($response,true);

if($responseKeys["success"] && $responseKeys["score"] >= 0.5) {
    echo json_encode(array('success' => 'true', 'om_score' => $responseKeys["score"], 'token' => $_POST['token']));
} else {
    echo json_encode(array('success' => 'false', 'om_score' => $responseKeys["score"], 'token' => $_POST['token']));
}


    // Формирование самого письма
    $title = "Заявка с сайта";
    $body = "
    <h2>Заявка с сайта</h2>
    <b>Имя:</b> $name<br>
    <b>Телефон:</b> $tel<br>
    <b>Почта:</b> $email<br>
    <b>Количество изделий:</b> $number<br>
    <b>Сообщение:</b><br>$text
    ";

    // Настройки PHPMailer
    $mail = new PHPMailer\PHPMailer\PHPMailer();

    $mail->isSMTP();
    $mail->CharSet = "UTF-8";
    $mail->SMTPAuth   = true;
    //$mail->SMTPDebug = 2;
    $mail->Debugoutput = function($str, $level) {$GLOBALS['data']['debug'][] = $str;};

    // Настройки вашей почты
    $mail->Host       = 'smtp.yandex.com'; // SMTP сервера вашей почты
    $mail->Username   = '***'; // Логин на почте
    $mail->Password   = '***'; // Пароль на почте
    $mail->SMTPSecure = 'ssl';
    $mail->Port       = 465;
    $mail->setFrom('***', 'Заявка с сайта'); // Адрес самой почты и имя отправителя

    // Получатель письма
    $mail->addAddress('***');

    // Прикрипление файлов к письму
    if (!empty($file['name'][0])) {
        for ($i = 0; $i < count($file['tmp_name']); $i++) {
            if ($file['error'][$i] === 0)
                $mail->addAttachment($file['tmp_name'][$i], $file['name'][$i]);
        }
    }
    // Отправка сообщения
    $mail->isHTML(true);
    $mail->Subject = $title;
    $mail->Body = $body;

    // Проверяем отправленность сообщения
    if ($mail->send()) {
        $data['result'] = "success";
        $data['info'] = "Сообщение успешно отправлено!";
    } else {
        $data['result'] = "error";
        $data['info'] = "Сообщение не было отправлено. Ошибка при отправке письма";
        $data['desc'] = "Причина ошибки: {$mail->ErrorInfo}";
    }

} else {
    $data['result'] = "error";
    $data['info'] = "В коде присутствует ошибка";
    $data['desc'] = error_get_last();
}

// Отправка результата
header('Content-Type: application/json');
echo json_encode($data);

?>

document.querySelector('form').addEventListener('submit', (e) => {
    e.preventDefault();

    let tk = '';

    grecaptcha.ready(function() {
  grecaptcha.execute('', {action: 'homepage'}).then(function(token) {
    tk = token;
                document.getElementById('token').value = token;

                const data = new URLSearchParams();
                for (const pair of new FormData(document.querySelector('form'))) {
                        data.append(pair[0], pair[1]);
                }

                fetch('mail.php', {
                    method: 'post',
                    body: data,
                })
                .then(response => response.json())
                .then(result => {
                    if (result['om_score'] >= 0.5) {
                        console.log('Человек')
                        // отправка данных на почту
                    } else {
                        console.log('Бот')
                    }
                });
  });
});
});
  • Вопрос задан
  • 20 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы