У меня есть сайт Wordpress, и я хочу защитить пользовательскую контактную форму с помощью Google reCaptcha v3. К сожалению, мой код кажется неправильным, и я не смог найти проблему, пожалуйста, помогите.
Это моя форма
<?php
// reCAPTCHA v3
define('SITE_KEY', 'Key');
define('SECRET_KEY', 'SCRT_KEY');
echo '<script src = "https://www.google.com/recaptcha/api.js?render=' . SITE_KEY . '"></script>';
?>
<form action = "<?php echo get_home_url(); ?>/sent" method = "POST" id = "footer-form">
<!--INPUT FIELDS HERE-->
<input type = "hidden" id = "g-recaptcha-response" name = "g-recaptcha-response" />
<button class = "button_1" type = "submit">
Send
</button>
</form>
<script>
grecaptcha.ready(function() {
grecaptcha.execute("KEY IS HERE", {action: "homepage"})
.then(function(token) {
console.info(token);
document.getElementById("g-recaptcha-response").value=token;
});
});
</script>
Моя форма отправляет сообщения в этот php-файл
// reCAPTCHA v3
define('SITE_KEY', 'KEY');
define('SECRET_KEY', 'SCRT_KEY');
$Response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret = ".SECRET_KEY."&response = {$_POST['g-recaptcha-response']}");
$Return = json_decode($Response);
if ($Return->success == true && $Return->score > 0.5){
EMAIL CODE HERE
}
вот об этом.. первая часть, похоже, работает, потому что мое значение поля g-recaptcha получило токен сеанса
но $Response всегда ложный (я думаю, что file_get_contents не работает?)
Я надеюсь, что кто-нибудь сможет мне помочь, но я не хочу использовать плагин. Спасибо
Этот код адаптирован из этого руководства:
https://thewikihow.com/video_61QBrGpwQGg?si=TU3BUsN1RXN9jpmq
У этого парня была та же проблема, но решения не было:
@aynber К сожалению, я не думаю, что это действительно так… хочу придерживаться базового php
Использование реализации PHP cURL по-прежнему остается базовым PHP. Он более портативен, поскольку некоторые серверы allow_url_fopen отключены, что не позволяет file_get_contents получать данные URL.
file_get_contents, используемый с URL-адресами HTTP, вернет false, если код состояния HTTP ответа указывает на ошибку. В этом случае вам нужно будет передать контекст HTTP-потока с установленным для ignore_errors значением true, чтобы получить доступ к телу ответа.
И file_get_contents с URL-адресом HTTP будет использовать метод запроса GET, но конечная точка проверки требует запроса POST. Вы можете использовать file_get_contents для выполнения запросов POST, но для этого также требуется контекст HTTP-потока, явно указывающий, какой method использовать.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проблема заключалась в том, что у file_get_contents() отсутствовал контекст...
Google Api принимает только запросы POST. Нужен stream_context_create()...
Вероятно, вам следует использовать cURL вместо file_get_contents, это более настраиваемо и надежно.