Установка невидимой reCaptcha v3: настройка и интеграция
v3 подходит для проектов, где важен гладкий UX: эта версия работает без видимого задания, а JavaScript получает токен, который PHP валидирует на сервере по оценке Google. Документация описывает v3 как систему, которая возвращает score без прерывания пользователя.
Сценарии использования recaptcha v3 лучше заранее разделить по цели: отправка формы, вход в личный кабинет, регистрация, подписка, заявка на расчет. Так в консоли проще смотреть recaptcha data и понимать, какие действия получают низкую оценку.
Подключение скрипта v3 и настройка параметра action
Подключите скрипт v3 через render с ключом сайта. Параметр action указывает сценарий: contact, login, register, submit. Так в консоли проще смотреть качество трафика по следующим действиям.
<script src="https://www.google.com/recaptcha/api.js?render=YOUR_SITE_KEY"></script>
<form id="contactForm" action="send.php" method="post">
<input type="text" name="name" required>
<input type="email" name="email" required>
<textarea name="message" required></textarea>
<input type="hidden" name="recaptcha_token" id="recaptchaToken">
<button type="submit">Отправить</button>
</form>
<script>
const siteKey = 'YOUR_SITE_KEY';
const form = document.getElementById('contactForm');
const tokenField = document.getElementById('recaptchaToken');
form.addEventListener('submit', function (event) {
event.preventDefault();
grecaptcha.ready(function () {
grecaptcha.execute(siteKey, { action: 'contact' }).then(function (token) {
tokenField.value = token;
form.submit();
});
});
});
</script>
Документация рекомендует вызывать execute именно в момент защищаемого действия, так как токены действуют две минуты.
Для отладки можно подробнее посмотреть свойства ответа в серверном логе: success, score, action и hostname. Это помогает понять, правильно ли выбран action и не смешиваются ли разные формы в одной статистике.
Серверная проверка оценки пользователя для reCaptcha v3
На стороне сервера PHP отправляет token и secret в API сервиса. Для обычной формы можно начать с порога 0.5, для оплаты поднять до 0.7, для подписки снизить до 0.3 и затем настроить по данным.
<?php
header('Content-Type: application/json; charset=utf-8');
$secretKey = 'YOUR_SECRET_KEY';
$token = $_POST['recaptcha_token'] ?? '';
$expectedAction = 'contact';
$scoreThreshold = 0.5;
if ($token === '') {
http_response_code(400);
echo json_encode([
'success' => false,
'message' => 'Токен не получен.'
]);
exit;
}
$verifyUrl = 'https://www.google.com/recaptcha/api/siteverify';
$postData = http_build_query([
'secret' => $secretKey,
'response' => $token,
'remoteip' => $_SERVER['REMOTE_ADDR'] ?? null
]);
$ch = curl_init($verifyUrl);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $postData,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10
]);
$googleResponse = curl_exec($ch);
curl_close($ch);
$result = json_decode($googleResponse, true);
if (
empty($result['success']) ||
($result['score'] ?? 0) < $scoreThreshold ||
($result['action'] ?? '') !== $expectedAction
) {
http_response_code(403);
echo json_encode([
'success' => false,
'message' => 'Валидация v3 не пройдена.',
'score' => $result['score'] ?? null,
'action' => $result['action'] ?? null,
'error' => $result['error-codes'] ?? []
]);
exit;
}
echo json_encode([
'success' => true,
'message' => 'Валидация пройдена.',
'score' => $result['score']
]);
Отличия серверной валидации v3 от v2
- Числовая оценка score вместо только boolean-ответа success.
- Самостоятельный выбор порогового значения.
- Дополнительная сверка поля action.
- Вывод решения остается на стороне сайта: пропустить, отправить на модерацию или запросить дополнительное подтверждение.
Если количество ложных блокировок растет, не снижайте порог сразу. Сначала сравните action, IP-адреса, user-agent, время отправки и источник перехода. Так настройка будет опираться на факты, а не на догадки.