javascript - 不可见的 reCAPTCHA 缺少输入响应

标签 javascript php invisible-recaptcha

我正在尝试创建一个带有不可见的 reCAPTCHA 的页面,但无法使其正常工作。

客户端页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <script src="https://code.jquery.com/jquery-2.2.1.min.js" integrity="sha384-8C+3bW/ArbXinsJduAjm9O7WNnuOcO+Bok/VScRYikawtvz4ZPrpXtGfKIewM9dK" crossorigin="anonymous"></script>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb" crossorigin="anonymous">
    <script>
        $('#formcomplete').click(function (e) {
            grecaptcha.reset();
            document.getElementById('form').checkValidity();
            grecaptcha.execute();
            return false;
        });
        function onSubmit(token) {
            document.getElementById('form').submit();
        }
    </script>
    <script src='https://www.google.com/recaptcha/api.js' async defer></script>
    <style>
        .centerize {
            position: absolute;
            left: 50%;
            transform: translate(-50%, 0);
        }
    </style>
</head>
<body style="background-color: black; overflow: hidden;">
    <form method='post' action='_resources/signup.php' id="form">
        <div style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); max-width: 50%;">
            <div class="form-row">
                <div class="form-group col-md-5">
                    <input type="text" class="form-control" name="name" placeholder="Name" size="64" required>
                </div>
                <div class="form-group col-md-7">
                    <input type='email' class='form-control' name='email' placeholder='email@example.com' size="64" required>
                </div>
            </div>
            <div class="form-check" style="text-align: center;">
                <label class="form-check-label" style="color: white">
                    <input type="checkbox" class="form-check-input" name="emaillist" value="emaillisttrue">
                    Add me to the email list to learn about future releases.
                </label>
            </div>
            <div class="form-check" style="text-align: center;">
                <label class="form-check-label" style="color: white">
                    <input type="checkbox" class="form-check-input" name="tac" value="tactrue" required>
                    I accept the <a href="./legal.html" onclick="window.open(this.href, 'mywin', 'left=20,top=20,width=500,height=500,toolbar=1,resizable=0'); return false;" >Terms and Conditions & Privacy Policy</a>.
                </label>
            </div>
            <button class='btn btn-default centerize' id="formcomplete">Submit</button>
        </div>
        <div id='recaptcha' class="g-recaptcha"
             data-sitekey="keeeeey"
             data-callback="onSubmit"
             data-theme="dark"
             data-size="invisible">
        </div>
    </form>
</body>

和服务器端验证:

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $name = stripslashes($_POST['name']);
    $email = stripslashes($_POST['email']);
    $emaillist = stripslashes($_POST['emaillist']);
    $tac = stripslashes($_POST['tac']);
    //... verify that you have a name email and accepted the terms
    $verify = file_get_contents("https://www.google.com/recaptcha/api/siteverify",false,stream_context_create(array(
        'http' => array(
            'method' => 'POST',
            'content' => http_build_query(array(
                'secret' => 'keeeeey',
                'response' => $_POST['g-recaptcha-response'],
                'remoteip' => $_SERVER['REMOTE_ADDR']
            ))
        )
    )));
    if (json_decode($verify)->success==true) {
        //... handle normal case
    } else {
        var_dump($verify);
        //header("Location: ...");
    }
}

当我浏览到该页面时,一切都显示正常,输入已验证(如果没有,chrome 会显示“请选中此框以继续”),并且一切正常,直到我点击提交。点击提交后,我被定向到表单的 POST 端点,在该端点处 var_dump 抛出令人沮丧的 string(75) "{ "success": false, "error-codes": [ "missing-输入响应“] }”

现在让我困惑的是。如果我浏览到该页面,填写所有详细信息,然后打开 chrome 开发控制台并输入 grecaptcha.execute(); 表单被提交,一切正常,reCAPTCHA 请求正常,并且在成功验证路径服务器端期间发生的所有事情都会发生。我不知道为什么会发生这种情况。

感谢您的帮助。

最佳答案

移动

<script>
        $('#formcomplete').click(function (e) {
            grecaptcha.reset();
            document.getElementById('form').checkValidity();
            grecaptcha.execute();
            return false;
        });
        function onSubmit(token) {
            document.getElementById('form').submit();
        }
    </script>
    <script src='https://www.google.com/recaptcha/api.js' async defer></script>

就在结束body 标记之前以某种方式起作用。在尝试使用 DOM 上的元素或其他东西之前,可能需要先定义 DOM。

关于javascript - 不可见的 reCAPTCHA 缺少输入响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47019543/

相关文章:

javascript - Axios DELETE 对 CORS 服务器的调用触发 promise 在预检 OPTIONS 调用上解决

php - 如何使正则表达式查询更快

php - 如何编写MYSQL查询用户层次关系?

javascript - HTML 必需属性不适用于 google recaptcha

javascript - Google reCAPTCHA V2 JavaScript 我们检测到您的站点未验证 reCAPTCHA 解决方案

javascript - Invisible Recaptcha Challenge 弹出窗口在父点击时消失

javascript - 如何使用Jquery解析以下JSON数据

javascript - 我是否需要关闭每个具有等待结果回调的方法?

javascript - 如何从 Google 应用程序脚本中的 JSON 数组获取数据?

PHP 到 MySql 表单处理多个选择复选框