Как использовать hCaptcha на чистом PHP

Хотите интегрировать hCaptcha на ваш сайт при помощи PHP? Нет ничего проще. Это займёт всего несколько секунд.

Шаг 1: Зарегистрируйтесь на hCaptcha.com

На этом шаге вам понядобится получить «site key» и «secret» для дальнейшей работы.

Шаг 2: Добавьте hCaptcha в шаблон вашего сайта

A. Добавьте JavaScript библиотеку на страницу между тегами <head> или <body>:

<script src='https://www.hCaptcha.com/1/api.js' async defer></script>

B. Добавьте HTML код в то место страницы, где вы хотите видеть кнопку hCaptcha, например, внутри страницы авторизации.

<div class="h-captcha" data-sitekey="your_site_key"></div>

Не забудьте заменить «your_site_key» на ключ сайта, полученный на первом шаге.

Шаг 3: Проверьте результат на бэкенде

<?php
$data = array(
            'secret' => "my-secret (should start with 0x..)",
            'response' => $_POST['h-captcha-response']
        );
$verify = curl_init();
curl_setopt($verify, CURLOPT_URL, "https://hcaptcha.com/siteverify");
curl_setopt($verify, CURLOPT_POST, true);
curl_setopt($verify, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($verify, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($verify);
// var_dump($response);
$responseData = json_decode($response);
if($responseData->success) {
    // your success code goes here
} 
else {
   // return error to user; they did not pass
}

Не забудьте заменить «your_site_key» на ключ сайта, полученный на первом шаге.

Так делать НЕ нужно:

<?php
 
  if(isset($_POST['h-captcha-response']) && !empty($_POST['h-captcha-response']))
  {
        $secret = 'your_secret_key';
        $verifyResponse = file_get_contents('https://hcaptcha.com/siteverify?secret='.$secret.'&response='.$_POST['h-captcha-response'].'&remoteip='.$_SERVER['REMOTE_ADDR']);
        $responseData = json_decode($verifyResponse);
        if($responseData->success)
        {
            $succMsg = 'Your request have submitted successfully.';
        }
        else
        {
            $errMsg = 'Robot verification failed, please try again.';
        }
   }
?>

Не рекомендую использовать метод GET, для осуществелния запросов к API, чтобы не упереться в лимит длины строки URL

FAQ

Q: Как проверить, что всё работает правильно?

A: Вы увидите оба счётчика «served» и «solved» в консоли hCaptcha.com вашего аккаунта.

Q: Как запретить отправку формы на сайте, пока пользователь не получить валидный ответ от hCaptcha?

A: В упрощённом варианте примерно так:

$("form").submit(function(event) {

   var hcaptchaVal = $('[name=h-captcha-response]').value;
   if (hcaptchaVal === "") {
      event.preventDefault();
      alert("Please complete the hCaptcha");
   }
});

Q: Как должен выглядеть исчерпывающий пример контактной формы на PHP?

A: Полный пример. Сохраните данный сниппет в файл contact-form.php и не забудьте указать ваши «secret» и «site» ключи.

<?php
if(isset($_POST['submit'])):
    if(isset($_POST['h-captcha-response']) && !empty($_POST['h-captcha-response'])):
        // get verify response
        $data = array(
              'secret' => "my-secret",
              'response' => "my-response"
          );
        $verify = curl_init();
        curl_setopt($verify, CURLOPT_URL,   "https://hcaptcha.com/siteverify");
        curl_setopt($verify, CURLOPT_POST, true);
        curl_setopt($verify, CURLOPT_POSTFIELDS, http_build_query($data));
        curl_setopt($verify, CURLOPT_RETURNTRANSFER, true);
        $verifyResponse = curl_exec($verify);
        $responseData = json_decode($verifyResponse);
    $name = !empty($_POST['name'])?$_POST['name']:'';
    $email = !empty($_POST['email'])?$_POST['email']:'';
    $message = !empty($_POST['message'])?$_POST['message']:'';
        if($responseData->success):
      //contact form submission code
      $to = 'your@email.com';
      $subject = 'New contact form has been submitted';
      $htmlContent = "
        <h1>Contact request details</h1>
        <p><b>Name: </b>".$name."</p>
        <p><b>Email: </b>".$email."</p>
        <p><b>Message: </b>".$message."</p>
      ";
      // Always set content-type when sending HTML email
      $headers = "MIME-Version: 1.0" . "rn";
      $headers .= "Content-type:text/html;charset=UTF-8" . "rn";
      // More headers
      $headers .= 'From:'.$name.' <'.$email.'>' . "rn";
      //send email
      @mail($to,$subject,$htmlContent,$headers);
      
            $succMsg = 'Your contact request has been submitted successfully.';
      $name = '';
      $email = '';
      $message = '';
        else:
            $errMsg = 'hCaptcha verification failed. Please try again.';
        endif;
    else:
        $errMsg = 'Please click on the hCaptcha button.';
    endif;
else:
    $errMsg = '';
    $succMsg = '';
  $name = '';
  $email = '';
  $message = '';
endif;
?>
<html>
    <head>
      <title>Using hCaptcha with PHP</title>
       <script src="https://www.hCaptcha.com/1/api.js" async defer></script>
    </head>
    <body>
    <div>
    <h2>Contact Form</h2>
        <?php if(!empty($errMsg)): ?><div class="errMsg"><?php echo $errMsg; ?></div><?php endif; ?>
        <?php if(!empty($succMsg)): ?><div class="succMsg"><?php echo $succMsg; ?></div><?php endif; ?>
    <div>
      <form action="" method="POST">
        <input type="text" class="text" value="<?php echo !empty($name)?$name:''; ?>" placeholder="Your full name" name="name" >
                <input type="text" class="text" value="<?php echo !empty($email)?$email:''; ?>" placeholder="Email adress" name="email" >
                <textarea type="text" placeholder="Message..." required="" name="message"><?php echo !empty($message)?$message:''; ?></textarea>
        <div class="h-captcha" data-sitekey="<YOUR-SITE-KEY>"></div>
        <input type="submit" name="submit" value="SUBMIT">
      </form>
    </div>      
    <div class="clear"> </div>
  </div>
  </body>
</html>

Источник: https://www.kobzarev.com/programming/using-hcaptcha-with-php/

Михаил Кобзарёв

Суровый русский тимлид. Жил в Магадане, в офисе московских веб студий и в Тульской деревне. Виртуозно знает WordPress, PHP, ООП, Vue.js и вот это вот все. Делает крутые высоконагруженные сайты, поэтому уже почти захватил весь рынок WordPress разработки в России. Не дает никому делать сайты без спроса. Ведет блог о разработке, дайджест в телеграмме и в ВК. Любит сиськи, баню и радиоэлектронику. 100% патриот (но это не точно). Тролль 542 уровня. Ездит в отпуск раз в 5 лет.

Добавить комментарий

%d такие блоггеры, как: