Как использовать 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» ключи.

<?phpif(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". "\r\n";      $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";      // More headers      $headers .= 'From:'.$name.' <'.$email.'>' . "\r\n";      //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>

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *