← 返回博客

reCAPTCHA 国内加载不出来怎么办:原因、3 种替代方案,3 分钟换成国内可直连的行为验证码

2026-11-03 · 8 分钟阅读
reCAPTCHA行为验证码人机验证短信轰炸网站安全

结论先说:reCAPTCHA 在国内加载不出来,是因为它的脚本和验证页面都挂在 Google 的域名上,这些域名在中国大陆无法稳定访问。 换成官方的 recaptcha.net 镜像域名可以临时救急,但资源仍然在 Google 手里,稳定性和可控性都不由你决定。要长期稳定,最省事的做法是换成国内可直连的行为验证码:前端两段代码、后端一个校验接口,通常几分钟就能完成,也不需要人工审核。

reCAPTCHA 为什么在国内打不开

reCAPTCHA 不是一段纯前端代码,它要实时向 Google 拉取脚本、验证组件和风控结果。你在页面上看到的是这样一个链条:

  1. 页面加载 https://www.google.com/recaptcha/api.js;
  2. 脚本再去 www.gstatic.com 拉验证组件的资源;
  3. 用户勾选或滑动后,组件向 Google 换一个 token;
  4. 你的后端拿 token 去 Google 校验。

第 1 步和第 2 步的域名在中国大陆都无法稳定访问,所以最常见的结果是:验证框一直转圈、显示「无法连接」,或者干脆留一块空白。如果你的表单在拿到 token 之前把提交按钮禁用了,用户就会觉得「表单卡死、点不动」——问题不在你的表单,而在那个加载不出来的第三方脚本。

reCAPTCHA v3 更隐蔽:它是隐形的,不显示勾选框,只在后台算一个分数。脚本加载失败时页面看起来正常,但 grecaptcha 根本不存在,调用执行 token 的那行代码会报错;即使你兜底放行,也等于这段时间完全没有验证。

recaptcha.net 镜像能救急,但不解决根本问题

Google 为 google.com 访问受限的地区提供了一个镜像域名 recaptcha.net,把脚本地址里的 www.google.com/recaptcha/ 换成 www.recaptcha.net/recaptcha/,部分场景下能加载出来。

它适合做临时过渡,但有三个明显局限:

  • 可用性不由你控制:镜像是否稳定、什么时候调整,取决于 Google,你没有任何 SLA;
  • 数据和风控仍在境外:用户的验证行为会发往 Google,涉及数据出境,是否满足你的合规要求需要自行评估;
  • 版本升级不可预期:Google 调整 reCAPTCHA 策略或接口时,国内站点只能被动跟随。

如果你的站点面向国内用户、表单又是登录、注册、发短信这类高频入口,把可用性押在一个随时可能连不上的境外服务上,风险太高。

三种替代方案怎么选

方案大陆可直连接入成本费用主要问题
recaptcha.net 镜像时好时坏最低,只改域名免费仍依赖 Google,随时可能失效
Cloudflare Turnstile波动较大低免费脚本走境外域名,大陆可达性不稳定
国内行为验证码(不墨等)稳定低,前后端各一段有免费试用,之后按需付费需要注册账号、配置域名白名单

Cloudflare Turnstile 的优点是免费、接入简单,但它的脚本同样走 Cloudflare 的境外域名,在中国大陆的可达性会波动——很多国内站点弃用它,原因就在这里。极验、腾讯云验证码这类国内商业方案功能更全,价格和接入门槛以各家官网为准,适合有企业采购流程的团队。

如果你是小站、个人开发者,或者只想尽快把表单救回来,国内的行为验证码更合适:滑动一下就能通过,按量付费,先用免费额度验证效果。不墨行为验证码提供一个月免费试用(每位用户一次),开通后拿到产品 ID 就能接。

3 分钟换掉 reCAPTCHA:完整接入步骤

下面以不墨行为验证码为例。它的「3 分钟接入」向导把开通、拿 Key、复制代码串成了一条线,全程不需要人工审核,填完域名就能拿到可用的代码。

第 1 步:开通并填域名

打开 3 分钟接入向导,填写你的网站域名。向导会顺手开通一个月免费试用并生成产品 ID。

域名白名单是必须的:只有白名单里的域名才能正常加载 SDK。本地调试时 localhost 和 127.0.0.1 不受限制,所以你可以先在本地跑通再上线。填主域名即可(例如 example.com),它会覆盖 www 和其它子域名。

第 2 步:拿 API KEY

向导会自动创建一个 API KEY。这个 Key 只给服务端用,不要写进前端代码、不要提交到 Git 仓库。产品 ID 可以公开,API KEY 不行。

第 3 步:前端放容器、加载 SDK

在表单里放一个容器和一个隐藏字段:

<!-- 滑块显示的位置 -->
<div id="BUMO_CAPTCHA"></div>
<!-- 把验证结果随表单提交给后端 -->
<input type="hidden" name="captchaId" id="captchaId" />

页面底部加载 SDK 并初始化:

<script src="https://cdn.bumo.cc/apps/captcha-sdk/captcha.js"></script>
<script>
  new window.BumoCaptcha({
    containerId: 'BUMO_CAPTCHA',
    id: '你的产品ID',
    successCallback: function (captchaId) {
      document.getElementById('captchaId').value = captchaId;
    },
  });
</script>

successCallback 里的 captchaId 是一次验证的凭证,必须交给后端二次校验。前端「滑动通过」不等于验证通过。

如果担心 CDN 缓存旧版本,可以按官方文档的写法给脚本地址加一分钟粒度的时间戳:captcha.js?t=...。

第 4 步:后端校验,通过后再执行业务

在登录、注册、发短信这些接口里,先校验 captchaId,再往下走。Node.js 18+ 可以直接用 fetch:

async function verifyCaptcha(captchaId) {
  try {
    const res = await fetch('https://captcha.bumo.cc/api/captcha/server/get-result', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        authorization: 'Bearer 你的APIKEY', // 只放服务端
        'x-id': '你的产品ID',
        referer: 'https://你的域名', // 必须在白名单里
      },
      body: JSON.stringify({ r: captchaId }),
      signal: AbortSignal.timeout(10000),
    });
    const json = await res.json();
    if (json.success) return json.data.p === true;
    if (json.code === 20001) return true; // 超过速率限制,放行以免影响业务
    return false;
  } catch (e) {
    // 服务端也不可达时,SDK 会给出 NOSERVER_ 开头的 ID,放行
    return String(captchaId).startsWith('NOSERVER_');
  }
}

校验通过再发短信或创建账号:

app.post('/api/send-code', async (req, res) => {
  const ok = await verifyCaptcha(req.body.captchaId);
  if (!ok) return res.status(400).json({ message: '请先完成验证' });
  // 这里再走频控和短信发送
});

Python、PHP、curl 的等价代码在向导第 3 步可以直接切换标签复制,不用自己拼请求头。

第 5 步:等第一次验证自动确认

代码上线后,在你的页面上完成一次滑动验证,向导会自动检测到并标记接入成功。整个过程不需要人工审核,也不用发邮件等开通。

迁移时最容易踩的 4 个坑

1. API KEY 泄露到前端。 校验接口必须由你的后端调用。把 Key 写进前端 JS 等于把额度送给别人。

2. 忘记配置域名白名单。 典型现象是本地能跑、线上 401/403。白名单按域名匹配,换了域名或加了子域名要同步补上。

3. 没有超时和兜底。 校验请求一定要设 10 秒超时。验证码服务不可用时,前端会给出 NOSERVER_ 开头的 ID,此时应该放行,避免验证码故障把登录和注册一起拖垮。接口返回 code 20001(超过速率限制)也建议放行。

4. 把 captchaId 当长期凭证。 它是一次验证的凭证,校验通过后就应该执行业务并丢弃,不要缓存起来重复使用。

常见问题

换成国内验证码,海外用户还能用吗?

可以。行为验证码走的是 cdn.bumo.cc 和 captcha.bumo.cc,海外也能访问。反而是 reCAPTCHA 在国内不可用,换过来之后全球用户都能正常验证。

免费试用到期后会自动扣费吗?

不会。试用是一个月的免费额度,到期后需要自己购买续期,不续期就停止服务,不会自动扣款。

滑动验证会不会拖慢页面?

SDK 是异步加载的,只在需要验证的页面引入即可。相比 reCAPTCHA 在国内转圈十几秒最后失败,滑动的实际体验通常是一两秒。

只用前端校验行不行?

不行。前端只负责收集行为轨迹并给出 captchaId,真正的判定在服务端。只做前端等于把门锁装在门外面。

一句话总结

reCAPTCHA 在国内的问题不是配置问题,是域名根本连不上;recaptcha.net 只能临时救急。 面向国内用户的站点,直接换成国内可直连的行为验证码更省心:3 分钟接入向导 填域名、拿 Key、复制前后端代码,第一次验证通过就自动确认接入,全程不需要人工。想先看效果,可以去 在线 DEMO 滑一次,或看产品介绍。