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

Node.js中Google Recaptcha返回字符串而非JSON的问题

解决Google Recaptcha验证API返回字符串而非JSON的问题

你的问题出在POST请求的参数传递方式不符合Google Recaptcha接口的预期,导致接口返回文本格式而非JSON,进而无法直接通过scoreRecaptcha.data.success获取验证状态。

问题分析

Google的siteverify接口支持GET和POST请求,但:

  • 若使用POST,需将参数放在请求体中,并设置Content-Type为application/x-www-form-urlencoded
  • 你的代码用POST但把参数拼在URL里,这种情况下接口可能返回纯文本而非JSON,axios无法自动解析为对象

解决方案

方案1:改用GET请求(更简洁)

siteverify接口完全支持GET请求,直接通过params传递参数,axios会自动解析JSON响应:

async function validateCaptcha(req) {
  const recaptcha = process.env.CAPTCHA_PRIVATE;
  const token = req.body.token;
  const scoreRecaptcha = await axios.get(
    'https://www.google.com/recaptcha/api/siteverify',
    {
      params: {
        secret: recaptcha,
        response: token
      }
    }
  );
  return scoreRecaptcha.data.success;
}

方案2:规范使用POST请求

如果坚持用POST,需将参数放在请求体,并设置正确的请求头:

async function validateCaptcha(req) {
  const recaptcha = process.env.CAPTCHA_PRIVATE;
  const token = req.body.token;
  const scoreRecaptcha = await axios.post(
    'https://www.google.com/recaptcha/api/siteverify',
    new URLSearchParams({
      secret: recaptcha,
      response: token
    }),
    {
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
      }
    }
  );
  return scoreRecaptcha.data.success;
}

临时兼容方案(若以上方法仍不生效)

如果接口还是返回字符串,可以手动解析响应:

async function validateCaptcha(req) {
  const recaptcha = process.env.CAPTCHA_PRIVATE;
  const token = req.body.token;
  const scoreRecaptcha = await axios.post(
    `https://www.google.com/recaptcha/api/siteverify?secret=${recaptcha}&response=${token}`
  );
  // 手动解析字符串为JSON对象
  const responseData = JSON.parse(scoreRecaptcha.data);
  return responseData.success;
}

内容的提问来源于stack exchange,提问作者David Jiménez Lamas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:45:46