Как интегрировать reCAPTCHA в форму, использующую PHPMailer?

Пожалуйста, помогите мне интегрировать reCaptcha на сайт. При отправке формы возникает ошибка "Ошибка обработки. Ответ не JSON". Я полагаю, что это связано с частью кода, которая проверяет успешность прохождения reCaptcha. 

Вот фрагмент кода:

```php
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
<?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 = isset($_POST['token']) ? $_POST['token'] : '';

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

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

    $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' => $captcha));
    } else {
        echo json_encode(array('success' => 'false', 'om_score' => $responseKeys["score"], 'token' => $captcha));
    }
}
```

Можете ли вы подсказать, что не так и как это исправить?
  • 19 марта 2025 г. 16:34
Ответы на вопрос 1
Ваша проблема заключается в том, что вы неправильно обрабатываете ответ от Google reCAPTCHA, поэтому возникает ошибка "Ошибка обработки. Ответ не JSON". Давайте пройдемся по основным шагам для корректной интеграции reCAPTCHA с PHPMailer и убедимся, что все работает хорошо.

### Основные шаги для интеграции

1. **Убедитесь, что вы получили правильные ключи от Google reCAPTCHA**: Вам нужно следить за тем, чтобы вы использовали правильные ключи в своем коде. В вашем случае замените `***` в `$secretKey` на ваш секретный ключ.

2. **Проверка на стороне клиента**: Перед отправкой формы с помощью JavaScript убедитесь, что вы правильно настроили reCAPTCHA, и форма не отправляется без успешной проверки.

    Пример JavaScript для инициализации reCAPTCHA v3:
    ```html
    <script src="https://www.google.com/recaptcha/api.js?render=YOUR_SITE_KEY"></script>
    <script>
    grecaptcha.ready(function() {
        grecaptcha.execute('YOUR_SITE_KEY', {action: 'submit'}).then(function(token) {
            document.getElementById('token').value = token;
        });
    });
    </script>
    ```

3. **Обработка ответа в PHP**: Убедитесь, что вы корректно обрабатываете ответ от reCAPTCHA на сервере.

### Обновленный код

Вот обновленный код с учетом указанных выше рекомендаций:

```php
<?php
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 = isset($_POST['token']) ? $_POST['token'] : '';

    $secretKey = 'YOUR_SECRET_KEY'; // Замените на ваш секретный ключ.
    $ip = $_SERVER['REMOTE_ADDR'];

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

    // Получение ответа от reCAPTCHA
    $response = file_get_contents($url);
    $responseKeys = json_decode($response, true);

    // Проверка успешности и наличия нужного балла
    if ($responseKeys['success'] && (isset($responseKeys['score']) && $responseKeys['score'] >= 0.5)) {
        // Здесь вы можете отправить почту, так как проверка прошла успешно
        // Пример:
        // $mail = new PHPMailer();
        // Настройка PHPMailer...
        // $mail->send();

        echo json_encode(array('success' => 'true', 'om_score' => $responseKeys["score"], 'token' => $captcha));
    } else {
        echo json_encode(array('success' => 'false', 'om_score' => isset($responseKeys['score']) ? $responseKeys['score'] : 'N/A', 'token' => $captcha));
    }
}
?>
```

### Примечания

1. Замените `YOUR_SECRET_KEY` на ваш фактический секретный ключ от reCAPTCHA.
2. Убедитесь, что вы правильно добавляете `token` в вашу форму HTML:
    ```html
    <input type="hidden" name="token" id="token">
    ```
3. Проверяйте наличие поля `score` в ответе от reCAPTCHA, поскольку в более ранних версиях может быть возвращено лишь поле `success`.

Теперь протестируйте свой код, и если будут ошибки, проверьте, какая именно информация возвращается от Google. Это поможет в диагностике возможных проблем.
Похожие вопросы