集成reCAPTCHA的Ajax表单始终验证失败,请求排查问题
问题排查与修复
你的Ajax请求始终触发error回调,主要是以下几个问题导致的:
1. PHP代码语法错误(if语句缺失大括号)
原PHP中if ($row['success'] == "true")没有包裹大括号,导致后续代码逻辑混乱——只有$nombre = $_POST['nombre'];属于这个if分支,其余代码会无条件执行,包括else块,最终引发语法错误,返回的内容不是合法JSON,Ajax无法解析。
2. 表单缺少action属性
你的form标签未设置action属性,Ajax里form.attr('action')会获取到undefined,请求地址错误,导致请求失败。
3. reCAPTCHA验证逻辑错误
$row['success']是布尔值(true/false),不是字符串,用== "true"判断会导致验证逻辑失效。
4. PHP输出内容不纯净
原代码末尾有多余的<p>?></p>,会输出额外HTML内容,破坏JSON格式,导致Ajax解析失败。
修正后的代码
表单代码(补充action属性)
<form id="contact-form" method="post" action="submit-form.php"> <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="ejemplo@correo.com" 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> </form>
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']) { $nombre = $_POST['nombre']; $email = $_POST['email']; $mensaje = $_POST['mensaje']; $para = 'my-email@gmail.com'; $titulo = 'New contact form entry'; $header = 'From: ' . $email; $msjCorreo = "Nombre: $nombre\nE-Mail: $email\nMensaje:\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代码(优化调试信息)
<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'); grecaptcha.reset(); // 重置reCAPTCHA } else { $('#error-message').text(response.message); } }, error: function(xhr) { console.log(xhr.responseText); // 打印错误信息便于调试 $('#error-message').text('An error occurred. Please try again later.'); } }); }); }); </script>
额外提示:需确保页面已正确引入jQuery库和reCAPTCHA官方脚本,否则reCAPTCHA无法加载,Ajax也无法正常运行。
内容的提问来源于stack exchange,提问作者Nellie
相关产品推荐
相关产品推荐

