You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

网页邮件联系表单集成Recaptcha AJAX调用失败技术求助

我太懂这种明明摸得清理论逻辑,但卡在JS实现细节上的憋屈感了!尤其是Recaptcha和AJAX表单的集成,确实容易踩坑,咱们一步步来把它搞定。

第一步:调整HTML表单,确保Recaptcha正确引入

先把Recaptcha的脚本和验证容器加到你的contact.php里:

<head>
  <!-- 引入Recaptcha官方脚本 -->
  <script src="https://www.google.com/recaptcha/api.js" async defer></script>
</head>
<body>
  <!-- 你的联系表单 -->
  <form id="contactForm">
    <!-- 原有表单字段:姓名、邮箱、消息等 -->
    <input type="text" name="name" placeholder="你的姓名" required>
    <input type="email" name="email" placeholder="你的邮箱" required>
    <textarea name="message" placeholder="你的消息" required></textarea>
    
    <!-- Recaptcha验证容器,替换成你的站点密钥 -->
    <div class="g-recaptcha" data-sitekey="YOUR_SITE_KEY_HERE"></div>
    
    <button type="submit">发送消息</button>
  </form>
</body>
第二步:修改AJAX代码,带上Recaptcha响应令牌

你之前的AJAX逻辑需要加上Recaptcha的验证值,并且在提交前先检查用户是否完成了人机验证:

document.getElementById('contactForm').addEventListener('submit', function(e) {
  e.preventDefault(); // 阻止表单默认跳转提交
  
  // 获取Recaptcha的响应令牌
  const recaptchaResponse = document.querySelector('.g-recaptcha-response').value;
  
  // 先检查用户是否完成了验证
  if (!recaptchaResponse) {
    alert('请完成人机验证后再提交!');
    return;
  }
  
  // 收集表单所有数据,包括Recaptcha响应
  const formData = new FormData(this);
  formData.append('g-recaptcha-response', recaptchaResponse);
  
  // 发送AJAX请求到后端处理脚本
  fetch('submit-contact.php', {
    method: 'POST',
    body: formData
  })
  .then(response => response.json())
  .then(data => {
    if (data.success) {
      alert('消息发送成功!我们会尽快回复你');
      document.getElementById('contactForm').reset(); // 重置表单
    } else {
      alert('提交失败:' + data.error);
    }
  })
  .catch(error => {
    console.error('请求出错:', error);
    alert('网络连接出错,请稍后重试');
  });
});
第三步:后端PHP验证Recaptcha有效性

在你的后端处理脚本(比如submit-contact.php)里,必须先验证Recaptcha的合法性,再执行邮件发送逻辑:

<?php
// 替换成你的Recaptcha密钥(这个密钥要保密,别暴露在前端!)
$secretKey = 'YOUR_SECRET_KEY_HERE';
$recaptchaResponse = $_POST['g-recaptcha-response'] ?? '';
$userIp = $_SERVER['REMOTE_ADDR'];

// 向Google发送Recaptcha验证请求
$verifyUrl = "https://www.google.com/recaptcha/api/siteverify?secret={$secretKey}&response={$recaptchaResponse}&remoteip={$userIp}";
$verifyResult = json_decode(file_get_contents($verifyUrl), true);

// 检查验证结果
if (!$verifyResult['success']) {
  echo json_encode([
    'success' => false,
    'error' => '人机验证失败,请重试'
  ]);
  exit;
}

// 到这里说明验证通过,开始处理邮件发送
$name = $_POST['name'] ?? '';
$email = $_POST['email'] ?? '';
$message = $_POST['message'] ?? '';

// 配置邮件参数(可以用mail()函数,也可以用PHPMailer更稳定)
$to = 'your-email@example.com';
$subject = '新的联系消息:' . $name;
$headers = "From: {$email}\r\nReply-To: {$email}\r\nContent-Type: text/html; charset=UTF-8";
$emailBody = "<p>姓名:{$name}</p><p>邮箱:{$email}</p><p>消息内容:<br>{$message}</p>";

// 发送邮件并返回结果
if (mail($to, $subject, $emailBody, $headers)) {
  echo json_encode(['success' => true]);
} else {
  echo json_encode([
    'success' => false,
    'error' => '邮件发送失败,请稍后重试'
  ]);
}
?>
几个关键提醒
  • 密钥替换:一定要把代码里的YOUR_SITE_KEY_HERE和YOUR_SECRET_KEY_HERE换成你在Google Recaptcha控制台获取的专属密钥。
  • 密钥保密:后端的绝对不能泄露,最好存在服务器的环境变量里,不要直接硬编码在代码中。
  • 兼容性:如果需要兼容旧浏览器,可以把fetch换成XMLHttpRequest,逻辑完全一致,只是写法稍有不同。

这样一套流程走下来,应该就能把Recaptcha和你的AJAX表单完美集成了,要是某个环节还卡壳,随时说具体的问题点!

内容的提问来源于stack exchange,提问作者Tommy301

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:41:10