В Google reCaptcha параметр g-recaptcha-response пустой
Я пытаюсь подключить Google reCaptcha на свой сайт, но иногда (примерно 50/50) рекаптча не возвращает параметр g-recaptcha-response (он пустой). ПРи попытке запустить функцию капчи grecaptcha.execute() выдаёт Алерт "Не удается связаться с сервисом reCAPTCHA. Проверьте подключение к Интернету и повторите попытку."
Браузер последней версии, ВПН нет, Сайт прокинут через прокси CloudFlare
PHP обработчик:
if (isset($form['g-recaptcha-response']) && !empty($form['g-recaptcha-response'])) {
$data = array(
'secret' => $optionsForm['recaptcha_secret_key'],
'response' => $form['g-recaptcha-response']
);
$verify = curl_init();
curl_setopt($verify, CURLOPT_URL, "https://www.google.com/recaptcha/api/siteverify");
curl_setopt($verify, CURLOPT_POST, true);
curl_setopt($verify, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($verify, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($verify, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($verify);
// d($response);
if ($response == true) {
$email = $form['email'];
$is_valid = preg_match(
'/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/',
$email,
$matches,
PREG_OFFSET_CAPTURE
);
// Проверка на маты и нежелательные слова
foreach ($badWords as $badWord) {
if (strpos(strtolower($email), strtolower(trim($badWord))) !== FALSE) {
$respCode = 4; // Найджены слова их блеклиста
echo json_encode(array('respCode' => $respCode));
wp_die();
}
}
if ($is_valid) {
$emailChack = $wpdb->get_row("SELECT email FROM $table_name WHERE email='" . $email . "'", OBJECT);
if ($emailChack->email) {
$respCode = 1; // Адрес уже есть
} else {
$wpdb->insert(
$table_name,
[
'email' => esc_sql($email),
'ip' => getIP(),
'page' => esc_sql($_POST['page']),
'date' => current_time('mysql')
]
);
$respCode = 2; // Адрес добавлен
}
} else {
$respCode = 3; // Непверный формат
}
}
}
Форма:
<form id="subscribeForm" method="post" class="offset-md-2 col-md-8">
<div class="d-flex input-container">
<input type="email" placeholder="E-mail" name="email" require>
<button
class="js-subscribeForm btn btn-js g-recaptcha"
data-sitekey="<?=$optionsForm['recaptcha_site_key']?>"
data-callback='sendForm'
type="submit">
<?=$optionsForm['btn_text']?>
</button>
<p class="subscribeForm-msg js-subscribeFormMsg error js-requiredField"><?=$optionsForm['required_field']?></p>
<p class="subscribeForm-msg js-subscribeFormMsg error js-errorMsg"><?=$optionsForm['error_msg']?></p>
<p class="subscribeForm-msg js-subscribeFormMsg error js-badWordsMsg"><?=$optionsForm['bad_words_msg']?></p>
<p class="subscribeForm-msg js-subscribeFormMsg error js-wrongFormat"><?=$optionsForm['wrong_format']?></p>
<p class="subscribeForm-msg js-subscribeFormMsg error js-alreadyExist"><?=$optionsForm['already_exist']?></p>
<p class="subscribeForm-msg js-subscribeFormMsg success js-successMsg"><?=$optionsForm['success_msg']?></p>
</div>
<?php if(isset($optionsForm['subscribe']) && !empty($optionsForm['subscribe'])): ?>
<p><?=$optionsForm['subscribe']?></p>
<?php endif; ?>
</form>
JS:
window.sendForm = function(e) {
let $curForm = $('#subscribeForm'),
$curEmail = $curForm.find('input[type="email"]').val(),
$subscribeFormMsg = $('.js-subscribeFormMsg'),
$requiredField = $('.js-requiredField'),
$errorMsg = $('.js-errorMsg'),
$badWordsMsg = $('.js-badWordsMsg'),
$successMsg = $('.js-successMsg'),
$wrongFormat = $('.js-wrongFormat'),
$alreadyExist = $('.js-alreadyExist'),
isValid = $curForm.find('input[type="email"]').val().toLowerCase()
.match(
/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
)
$subscribeFormMsg.removeClass('show')
if (isValid) {
grecaptcha.execute()
$.ajax({
type: 'POST',
url: window.ajaxurl,
data: {
action: 'post_subscribe',
form: $curForm.serialize(),
page: location.href
},
success: function(result) {
switch (JSON.parse(result).respCode) {
case 1: // Адрес уже есть
$alreadyExist.addClass('show')
break;
case 2: // Адрес добавлен
$successMsg.addClass('show')
break;
case 3: // Непверный формат
$wrongFormat.addClass('show')
break;
case 4: // Найдены слова их блеклиста
$badWordsMsg.addClass('show')
break;
default:
$errorMsg.addClass('show')
break;
}
}
})
} else {
if ($curEmail) {
$wrongFormat.addClass('show')
} else {
$requiredField.addClass('show')
}
}
return false;
}