БЕЗОПАСНОСТЬ / Google Recaptcha V3 + ajax

Заметка создана: 02 октября 2024 г.
Рабочий вариант 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;
   });