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

Google reCAPTCHA验证失败求助:已尝试多方案仍未解决

解决Google reCAPTCHA验证返回乱码问题

你的代码存在两个核心问题,直接导致了乱码和验证失败:

  1. POST请求参数传递错误:siteverify接口的POST请求要求将参数放在请求体中,而非URL参数里,你当前的POST请求体是空对象,不符合接口规范。
  2. 响应压缩未处理:Google接口默认返回gzip压缩的响应,Node.js环境下axios不会自动解压,导致你拿到的是二进制压缩数据,表现为乱码。

修正方案

1. 正确传递POST参数

使用URLSearchParams构建表单数据,将secret和前端传来的response令牌放入请求体,而非拼接在URL中。

2. 开启axios解压功能

显式设置decompress: true,让axios自动处理gzip压缩的响应。

3. 确保参数来源正确

从请求的参数中获取前端传来的response令牌,避免直接使用未赋值的变量。

修正后的代码

const express = require('express');
const axios = require('axios');
const app = express();

// 解析表单数据的中间件(如果前端用POST提交表单则需要)
app.use(express.urlencoded({ extended: true }));

// 替换成你的reCAPTCHA服务器端密钥
const RECAPTCHA_SECRET = '你的reCAPTCHA密钥';

app.get('/check', async (req, res) => {
  try {
    const responseToken = req.query.response;
    if (!responseToken) {
      return res.status(400).send('缺少response验证令牌');
    }

    // 构建表单请求体
    const formData = new URLSearchParams();
    formData.append('secret', RECAPTCHA_SECRET);
    formData.append('response', responseToken);

    const result = await axios.post(
      'https://www.google.com/recaptcha/api/siteverify',
      formData,
      {
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
        },
        // 开启自动解压gzip响应
        decompress: true,
      },
    );

    return res.json(result.data);
  } catch (error) {
    console.error('验证出错:', error);
    return res.status(500).send('验证服务异常');
  }
});

app.listen(3000, () => {
  console.log('服务运行在3000端口');
});

额外注意事项

  • 如果前端是通过POST方式提交表单,需要把app.get('/check')改为app.post('/check'),并从req.body.response获取令牌。
  • 一定要使用服务器端密钥作为RECAPTCHA_SECRET,不要用客户端密钥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:10:25