Хотите интегрировать 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/