Google reCAPTCHA验证失败求助:已尝试多方案仍未解决
解决Google reCAPTCHA验证返回乱码问题
你的代码存在两个核心问题,直接导致了乱码和验证失败:
- POST请求参数传递错误:
siteverify接口的POST请求要求将参数放在请求体中,而非URL参数里,你当前的POST请求体是空对象,不符合接口规范。 - 响应压缩未处理: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
相关产品推荐
相关产品推荐

