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