weranda
@weranda

Как загрузить данные из PHP после капчи без перезагрузки страницы?

Приветствую.

Опишу ситуацию, чтобы было понятно.
Есть страница сайта. Перед ее отдачей работает код 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 я не силен. Подскажите, пожалуйста, решение, если оно есть.

Если это имеет значение, то сайт работает на MODX и PHP подключен к нему прямо в файле index.php командой include_once.
  • Вопрос задан
  • 145 просмотров
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Предполагаю, что есть какая-то возможность на этапе проверки IP-адреса в условии if-else прервать выполнение показа страницы и показать ее после прохождения капчи.
Нет такой возможности.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы