Недавно мой сайт получал много спама через форму оплаты, и я решил, что мне нужно добавить captcha
чтобы предотвратить это.
Я искал несколько вариантов, и я решил пойти с Googles reCaptcha
, Кажется, его достаточно легко настроить и использовать, но я столкнулся с несколькими проблемами.
Во-первых, я включил это script
в заголовке формы:
<script src='https://www.google.com/recaptcha/api.js'></script>
Затем я включил на самом деле captcha
Сам у подножия формы:
<div class="g-recaptcha" data-sitekey="6LdOVv4SAAAAAJ4muJvo_vD7vsd9T9QIfkEwcO7y"></div>
Когда я отправляю форму, я делаю следующее:
$captcha = $_POST["g-recaptcha-response"]; //Get Captcha token
$secret_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //Get Secret key
$google_response = http_get("https://www.google.com/recaptcha/api/siteverify", array("secret"=>$secret, "response"=>$captcha), $info); //perform Get request
print_r($info);
Но ничего не происходит, на самом деле страница, которая раньше работала, просто зависает и даже не отображает сообщение об ошибке. Есть идеи, что я могу делать не так? Исходя из моего понимания документации, ответ будет в JSON
и успех будет либо истинным, либо ложным, я хотел бы продолжить оплату, если верно, или остановить и вернуться к форме, если ложь.
Буду признателен за любую оказанную помощь. Или, если у кого-то есть альтернативное решение для добавления капчи, я хотел бы изучить это.
Попробуйте запустить Google Recaptcha 2015:
==PHP Verification==
if(isset($_POST['submit'])){
$userIP = $_SERVER["REMOTE_ADDR"];
$recaptchaResponse = $_POST['g-recaptcha-response'];
$secretKey = "SECRET_KEY";
$request = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$secretKey}&response={$recaptchaResponse}&remoteip={$userIP}");
if(!strstr($request, "true")){
echo "NOPE (Failed Verification)";
}
else{
echo "YUP (Successful Verification)";
}
}
Не используйте file_get_contents. Google рекомендует использовать POST-запросы называть их API. GET-запросы, как указано выше, могут привести к нескольким проблемам:
Следовательно, использовать что-то вроде этого:
// Get resource
$curl = curl_init();
// Configure options, incl. post-variables to send.
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => 'https://www.google.com/recaptcha/api/siteverify',
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => array(
'secret' => 'your_secret_code_here',
'response' => $_POST['g-recaptcha-response']
)
));
// Send request. Due to CURLOPT_RETURNTRANSFER, this will return reply as string.
$resp = curl_exec($curl);
// Free resources.
curl_close($curl);
// Validate response
if(strpos($resp, '"success": true') !== FALSE) {
echo "Verified.";
} else {
echo "Not verified.";
}
Кроме того, часть проверки более консервативна в том, что она принимает как «проверенная».