reCAPTCHA 国内加载不出来怎么办:原因、3 种替代方案,3 分钟换成国内可直连的行为验证码
结论先说:reCAPTCHA 在国内加载不出来,是因为它的脚本和验证页面都挂在 Google 的域名上,这些域名在中国大陆无法稳定访问。 换成官方的 recaptcha.net 镜像域名可以临时救急,但资源仍然在 Google 手里,稳定性和可控性都不由你决定。要长期稳定,最省事的做法是换成国内可直连的行为验证码:前端两段代码、后端一个校验接口,通常几分钟就能完成,也不需要人工审核。
reCAPTCHA 为什么在国内打不开
reCAPTCHA 不是一段纯前端代码,它要实时向 Google 拉取脚本、验证组件和风控结果。你在页面上看到的是这样一个链条:
- 页面加载
https://www.google.com/recaptcha/api.js; - 脚本再去
www.gstatic.com拉验证组件的资源; - 用户勾选或滑动后,组件向 Google 换一个 token;
- 你的后端拿 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 滑一次,或看产品介绍。