reCAPTCHA + Ajax 永远无法通过验证

reCAPTCHA + Ajax is never passing validation

提问人:Nellie 提问时间:5/27/2023 更新时间:5/27/2023 访问量:37

问:

我有这个表格:

<form id="contact-form" method="post">
<label for="nombre">Nombre:</label>
<input id="nombre" type="text" name="nombre" placeholder="Nombre y Apellidos" required="" />
<label for="email">Email:</label>
<input id="email" type="email" name="email" placeholder="[email protected]" required="" />
<label for="mensaje">Mensaje:</label>
<textarea id="mensaje" name="mensaje" placeholder="Mensaje" required=""></textarea>
<div class="g-recaptcha" data-sitekey="XXXX"></div>
<input id="submit" type="submit" name="submit" value="Enviar" />
<span id="error-message" style="color: red;"></span>

使用此 php 代码进行提交:

<?php

if (isset($_POST['submit'])) {
    
    $ip = $_SERVER['REMOTE_ADDR'];
    $response = $_POST['g-recaptcha-response'];
    $secretkey = "XXXX";
    $url = "https://www.google.com/recaptcha/api/siteverify?secret=$secretkey&response=$response&remoteip=$ip";
    $data = file_get_contents($url);
    $row = json_decode($data, TRUE);
    
    if ($row['success'] == "true"){
        $nombre = $_POST['nombre'];
        $email = $_POST['email'];
        $mensaje = $_POST['mensaje'];
        $para = '[email protected]';
        $titulo = 'New contact form entry';
        $header = 'From: ' . $email;
        $msjCorreo = "Nombre: $nombre\n E-Mail: $email\n Mensaje:\n $mensaje";
        
        if (mail($para, $titulo, $msjCorreo, $header)) {
        echo json_encode(['success' => true, 'message' => '¡Gracias por tu mensaje!']);
        } else {
        echo json_encode(['success' => false, 'message' => 'No ha sido posible enviar tu mensaje. Prueba a contactarme vía RRSS, ¡por favor!']);
        }
        
    } else {
        echo json_encode(['success' => false, 'message' => 'Oops, you\'re a robot!']);
    }
    exit;
}

?>

还有这个ajax位,因为如果用户尝试在不验证reCAPTCHA的情况下提交表单,我希望页面不会刷新:

    <script>
    $(document).ready(function() {
        $('#contact-form').submit(function(event) {
            event.preventDefault();

            var form = $(this);
            var url = form.attr('action');

            $.ajax({
                type: 'POST',
                url: url,
                data: form.serialize(),
                dataType: 'json',
                success: function(response) {
                    if (response.success) {
                        alert(response.message);
                        form.trigger('reset');
                    } else {
                        $('#error-message').text(response.message);
                    }
                },
                error: function() {
                    $('#error-message').text('An error occurred. Please try again later.');
                }
            });
        });
    });

</script>

如果没有 Ajax 验证,表单就像一个魅力:只有在 reCAPTCHA 通过验证时才会提交信息,否则将重新加载页面。但是 Ajax 请求总是返回“出错”,即使我通过了 reCAPTCHA。关于我做错了什么的任何想法?此刻有点迷茫。谢谢!

jQuery Ajax 表单 验证 验证码

评论

0赞 Barmar 5/27/2023
使用 DevTools 的“网络”选项卡查看来自服务器的实际响应。
0赞 Nellie 5/27/2023
@Barmar通过 reCAPTCHA 后单击提交只会生成一个新行,其中包含以下信息: 名称“contacto.php” 状态“200” 键入“xhr” 启动器“jquery.min.js:2” 大小“2.3 kB” 时间“70-90ms”。顶部图形中没有移动
0赞 Barmar 5/27/2023
这和我的建议有什么关系?使用“网络”选项卡查看提交表单时发送的内容以及回复内容。
0赞 Barmar 5/27/2023
该错误可能是因为返回的 JSON 存在问题。
0赞 Nellie 5/27/2023
感谢您的回复@Barmar但不幸的是,我不是这方面的专家,我无法理解我在“网络”选项卡中看到的任何内容......

答: 暂无答案