Рабочий вариант recaptcha v3 + ajax (рабочий вариант на данный момент)
Cерверная часть php (размещаем в код ТДС показа формы):
$sSecretKey = "ваш секретный ключ recatpcha";
if (Core_Array::getPost('g-recaptcha-response'))
{
$sResponse = Core_Array::getPost('g-recaptcha-response');
$sUrl = 'https://www.google.com/recaptcha/api/siteverify';
$Core_Http = Core_Http::instance('curl')
->clear()
->method('POST')
->url($sUrl)
->additionalHeader('Accept-Encoding', 'gzip, deflate')
->data('secret', $sSecretKey)
->data('response', $sResponse)
->execute();
$oAnswer = json_decode($Core_Http->getDecompressedBody(), true);
if ($oAnswer["score"] >= 0.5)
{
// Данные формы
$form_name = Core_Array::getPost('name');
$form_email = Core_Array::getPost('email');
$form_text = Core_Array::getPost('message');
// Тема
$form_subject = 'Тема';
$message = null;
// Собираем сообщение
$message .= 'Имя: '.$form_name."\r\n\r\n";
$message .= 'Email: '.$form_email."\r\n\r\n";
$message .= 'Сообщение: '.$form_text."\r\n\r\n";
$oCore_Mail_Driver = Core_Mail::instance()
->to('rz300@ya.ru')
->from('no.reply@host.ru')
->subject($form_subject)
->message(trim($message))
->contentType('text/plain')
->header('Precedence', 'bulk')
->send();
$result = array('status' => true, 'message' => 'ok','result' => 'success');
echo json_encode($result);
exit();
}
}
добавляем в <head>
<script src='https://www.google.com/recaptcha/api.js?render=публичный ключ рекапчи' async="async" defer="defer"></script>
Код javascript
grecaptcha.ready(function () {
grecaptcha.execute('публичный ключ рекапчи', {
action: 'send'
}).then(function(token) {
// add token to form
$('.formCallBack').prepend('<input type="hidden" name="g-recaptcha-response" value="' + token + '">');
});
});
$('.formCallBack').submit(function() {
var data = $(this).serializeArray();
$.ajax({
type: 'post',
url: './',
data: data,
dataType: 'html',
success: function(e) {
//console.log(true);
$('.formCallBack').html('<p>Ваша заявка отправлена, спасибо!</p>');
$('.formCallBack .btn').css('display', 'none');
},
error: function(e) {
console.log(false);
}
});
return false;
});