服务器端验证Google reCAPTCHA v2时返回乱码问题排查
解决Google reCAPTCHA v2验证API返回乱码的问题
你遇到的问题根源在于请求格式不符合Google reCAPTCHA验证API的要求——siteverify接口并不支持JSON格式的请求体,它只接受**表单编码(application/x-www-form-urlencoded)**的参数传递,这就是为什么你用Axios发JSON请求会返回乱码,而浏览器直接访问(默认GET请求,参数拼接在URL里)能得到正常响应。
你的代码里有两个核心问题:
- 请求头错误设置了
"Content-Type": "application/json",不符合API的参数解析规则 - 用JSON对象传递
payload,API无法正确解析这些参数
这里给你调整后的可行代码:
// 用URLSearchParams生成表单编码的参数 const payload = new URLSearchParams({ secret: process.env.NEXT_PUBLIC_RECAPTCHA_SECRET_KEY ?? "", response: reCaptchaValue, // remoteip是可选参数,不需要的话直接省略即可,不用传undefined }); const verifyResponse = await axios({ method: "POST", url: "https://www.google.com/recaptcha/api/siteverify", data: payload, // Axios会自动识别URLSearchParams类型,自动设置正确的Content-Type,无需手动指定 });
如果你不想使用URLSearchParams,也可以手动拼接表单字符串:
// 手动编码参数并拼接成表单格式 const payload = `secret=${encodeURIComponent(process.env.NEXT_PUBLIC_RECAPTCHA_SECRET_KEY ?? "")}&response=${encodeURIComponent(reCaptchaValue)}`; const verifyResponse = await axios({ method: "POST", url: "https://www.google.com/recaptcha/api/siteverify", data: payload, headers: { "Content-Type": "application/x-www-form-urlencoded", }, });
内容的提问来源于stack exchange,提问作者Deepesh Rijal
相关产品推荐
相关产品推荐

