Как решить тайм-аут Google v3 reCaptcha? - PullRequest
0 голосов
/ 20 марта 2019

У нас есть PHP-форма с несколькими вкладками и временем ожидания для reCaptcha. Все делается на одной странице и работает отлично, если форма заполнена менее чем за 3 минуты.

Идея решения состоит в том, чтобы переместить обработку формы и reCaptcha на дополнительную страницу для обработки.

Проблема в том, что страница формы опрашивает сервис Google на предмет reCaptcha и собирает значение токена в скрытое поле.

<input type="hidden" name="recaptcha_response" id="recaptchaResponse">

Проблема в том, как запросить этот токен на странице обработки на стороне сервера? Вот код, используемый на странице формы на стороне клиента. Мне нужно как-то восстановить значение токена, чтобы применить его как:

$ recaptcha_response

Вот рабочая версия на странице формы. Требование о публикации токена со страницы формы легко снять, но вы не знаете, как создать токен для использования на странице сервера.

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['recaptcha_response'])) {

// Build POST request:
$recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_secret = RECAPTCHA_SECRET_KEY;
$recaptcha_response = $_POST['recaptcha_response'];
$remoteip = $_SERVER['REMOTE_ADDR'];

// Make and decode POST request:
$recaptcha = file_get_contents($recaptcha_url . '?secret=' . $recaptcha_secret . '&response=' . $recaptcha_response. '&remoteip='.$remoteip);
$recaptcha = json_decode($recaptcha);

// Take action based on the score returned:
if ($recaptcha->score >= 0.5) {

РЕДАКТИРОВАТЬ ДОБАВИТЬ: Выполнение инициализации reCaptcha до отправки задержит проблему синхронизации, так как это, кажется, вариант:

https://developers.google.com/recaptcha/docs/v3

"2. Вызовите grecaptcha.execute для действия или при загрузке страницы"

1 Ответ

2 голосов
/ 27 марта 2019
<script type="text/javascript">
function grecaptcha_execute(){
    grecaptcha.execute('RECAPTCHA_SITE_KEY', {action: 'homepage'}).then(function(token) {
        document.getElementById('recaptchaResponse').value=token;
    });
}
grecaptcha.ready(function() {
    grecaptcha_execute();
});
</script>

<?php
if ($recaptcha->success) {
    echo '<p style="color: #0a860a;">CAPTCHA was completed successfully!</p>';
}else{
    $error_codes = 'error-codes';
    if (isset($Retorno->$error_codes) && in_array("timeout-or-duplicate", $Retorno->$error_codes)) {
        $captcha_msg = "The verification expired due to timeout, please try again.";
    ?>
    <script>grecaptcha_execute();</script>
    <?php
    } else {
        $captcha_msg = "Check to make sure your keys match the registered domain and are in the correct locations.<br> You may also want to doublecheck your code for typos or syntax errors.";
    }
    echo '<p style="color: #f80808;">reCAPTCHA error: ' . $captcha_msg . '</p>';
}
?>
...