Как загрузить данные из PHP после капчи без перезагрузки страницы?
Приветствую.
Опишу ситуацию, чтобы было понятно.
Есть страница сайта. Перед ее отдачей работает код PHP. Этот код проверяет IP-адрес посетителя. Если с IP-адресом все нормально, то посетитель увидит перед собой страницу сайта. Если же IP-адрес попадает под фильтр, то вместо страницы посетитель увидит перед собой капчу. Ну, а как это обычно бывает: если посетитель решает капчу, то ему показывается страница, а если не решает — будет решать капчу до бесконечности, если не надоест, разумеется.
Я не пойму то, как можно отдать посетителю страницу после решения им капчи без перезагрузки страницы. Сайт работает на PHP.
Опишу текущую реализацию, чуть упростив ее сокращением кода.
Встроенный в страницу код проверки
captcha.html
request_response.php
И на этом шаге я застрял: получаю ответ из PHP-обработчика и перезагружаю страницу через JS. Хотелось бы при успешности прохождения капчи как-то отдавать страницу без ее перезагрузки через JS.
Предполагаю, что есть какая-то возможность на этапе проверки IP-адреса в условии if-else прервать выполнение показа страницы и показать ее после прохождения капчи. В PHP/JS я не силен. Подскажите, пожалуйста, решение, если оно есть.
Если это имеет значение, то PHP код проверки подключен файле index.php командой include_once.
Опишу ситуацию, чтобы было понятно.
Есть страница сайта. Перед ее отдачей работает код PHP. Этот код проверяет IP-адрес посетителя. Если с IP-адресом все нормально, то посетитель увидит перед собой страницу сайта. Если же IP-адрес попадает под фильтр, то вместо страницы посетитель увидит перед собой капчу. Ну, а как это обычно бывает: если посетитель решает капчу, то ему показывается страница, а если не решает — будет решать капчу до бесконечности, если не надоест, разумеется.
Я не пойму то, как можно отдать посетителю страницу после решения им капчи без перезагрузки страницы. Сайт работает на PHP.
Опишу текущую реализацию, чуть упростив ее сокращением кода.
Встроенный в страницу код проверки
// вот такой код выполняется перед показом страницы посетителю
// если ip не подходит, то показываем ему капчу (captcha.html)
// если ip нормальный, то показываем страницу (index.html)
<?php
// Проверка IP
$ip = $_SERVER['REMOTE_ADDR'];
if ($ip == "XX.XX.XX.XX") {
include 'captcha.html';
exit;
} else {
// Блок else можно и не использовать
include 'index.html';
exit;
}
captcha.html
<!-- работает через яндекс.капчу -->
<!-- капча запрашивает данные с сервера яндекса через js и вставляет их в атрибут -->
<!-- полученные данные через js отправляют в php обработчик (request_response.php) -->
<!doctype html>
<html lang="en">
<head>
<script src="https://smartcaptcha.yandexcloud.net/captcha.js" defer=""></script>
</head>
<body>
<div
id="smart-captcha"
class="smart-captcha"
data-callback="check_token"
></div>
<script>
function check_token(token) {
// получаю токен капчи из поля
var token_block = document.querySelector("#smart-captcha > input[type=hidden]");
var token = token_block.getAttribute("name");
// формирую данные
var data = {};
data["token"] = token;
// отправляют данные в обработчик
fetch("request_response.php", {
"method": "POST",
"headers": {
"Content-Type": "application/json; charset=utf-8"
},
"body": JSON.stringify(data)
}).then(function(data) {
console.log(data);
if (data["passed"] == "passed") {
// если капча пройдена, то перезагружаю страницу
window.location.reload();
}
})
}
</script>
</body>
</html>
request_response.php
// в обработчике отправляется запрос к серверу яндекса
// яндекс может вернуть два ответа: все хорошо + что-то не то
// если все хорошо, тогда надо показать посетителю страницу
// и делаю я это, отправляя в скрипт о том, что все хорошо
// скрипт перезагружает страницу, если все хорошо
if(isset($_POST)){
// отправка запроса к яндексу
// получение ответа
// формирование json для ответа в js
// отправка ответа в js
echo json_encode($dats);
}
И на этом шаге я застрял: получаю ответ из PHP-обработчика и перезагружаю страницу через JS. Хотелось бы при успешности прохождения капчи как-то отдавать страницу без ее перезагрузки через JS.
Предполагаю, что есть какая-то возможность на этапе проверки IP-адреса в условии if-else прервать выполнение показа страницы и показать ее после прохождения капчи. В PHP/JS я не силен. Подскажите, пожалуйста, решение, если оно есть.
Если это имеет значение, то PHP код проверки подключен файле index.php командой include_once.
Комментарии: 5
Я бы сделал с помощью js
Типо если капча выполнена показывается контент
Типо если капча выполнена показывается контент
// отправляют данные в обработчик
fetch("request_response.php", {
"method": "POST",
"headers": {
"Content-Type": "application/json; charset=utf-8"
},
"body": JSON.stringify(data)
}).then(function(data) {
console.log(data);
if (data["passed"] == "passed") {
// если капча пройдена, то перезагружаю страницу
window.location.reload();
}
})
Тут вместо перезагрузки вставляй в новый контент из data.
А как и откуда его получить, чтобы этот код корректно завелся?
У тебя капча на всех страницах или на одной?
Файл проверки, как уже писал, прописать в index.php корня сайта. Страница с капчей — отдельный HTML файл. При попадании под фильтр, показываю страницу капчи (код выше). В общем, к примеру, если при открытии страницы сайта попадается что-то подозрительное, то это подозрительное отправляется на проверку.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.