reCAPTCHA服务端集成疑问:如何向验证接口发送POST请求?
如何完成reCAPTCHA服务端验证POST请求
别担心,我来一步步帮你搞定服务端的reCAPTCHA验证请求。核心逻辑其实很清晰,就是把必要参数打包成POST请求发送到Google的验证接口,然后解析返回结果判断是否通过。下面我会用几种常用后端语言给你写示例,你可以直接套用自己在用的技术栈:
通用验证逻辑
不管用什么语言,核心步骤都是这几步:
- 从用户提交的表单里获取
g-recaptcha-response字段的值(这个是客户端reCAPTCHA生成的验证令牌) - 准备三个参数:
secret:你的reCAPTCHA服务端密钥(必须保密,绝对不能写在前端代码里)response:刚才获取的g-recaptcha-response值remoteip:可选,终端用户的IP地址,加上能提升验证准确性
- 向
https://www.google.com/recaptcha/api/siteverify发送POST请求 - 解析返回的JSON结果,检查
success字段是否为true,以此判断验证是否通过
具体语言示例
PHP示例(用cURL实现)
<?php // 从POST表单中获取reCAPTCHA响应令牌 $recaptchaResponse = $_POST['g-recaptcha-response'] ?? ''; // 替换成你自己的服务端secret密钥 $secretKey = '你的实际secret密钥'; // 获取用户IP地址 $userIp = $_SERVER['REMOTE_ADDR']; // 构造POST请求的参数 $postData = http_build_query([ 'secret' => $secretKey, 'response' => $recaptchaResponse, 'remoteip' => $userIp ]); // 初始化cURL会话 $ch = curl_init('https://www.google.com/recaptcha/api/siteverify'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 执行请求并获取响应 $response = curl_exec($ch); curl_close($ch); // 解析JSON格式的响应 $result = json_decode($response, true); // 根据结果判断验证是否通过 if ($result['success']) { // 验证通过,这里写你的表单处理逻辑(比如保存数据、发送邮件等) echo "reCAPTCHA验证通过!表单已提交"; } else { // 验证失败,可打印错误码排查问题 echo "reCAPTCHA验证失败,请重试!"; echo "<br>错误信息:"; print_r($result['error-codes']); } ?>
Python示例(用Requests库,Flask框架为例)
import requests from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/submit-form', methods=['POST']) def submit_form(): # 获取前端传来的reCAPTCHA响应 recaptcha_response = request.form.get('g-recaptcha-response', '') # 替换成你的服务端secret密钥 secret_key = '你的实际secret密钥' # 获取用户IP user_ip = request.remote_addr # 发送POST请求到验证接口 verify_response = requests.post( 'https://www.google.com/recaptcha/api/siteverify', data={ 'secret': secret_key, 'response': recaptcha_response, 'remoteip': user_ip } ) # 解析返回结果 result = verify_response.json() if result['success']: # 验证通过,处理表单逻辑 return jsonify({'status': 'success', 'message': '表单提交成功'}) else: # 验证失败,返回错误信息 error_codes = result.get('error-codes', []) return jsonify({'status': 'failed', 'message': 'reCAPTCHA验证失败', 'errors': error_codes}), 400 if __name__ == '__main__': app.run(debug=True)
Node.js示例(用Axios库,Express框架为例)
const express = require('express'); const axios = require('axios'); const app = express(); // 解析表单数据 app.use(express.urlencoded({ extended: true })); app.post('/submit-form', async (req, res) => { try { // 获取reCAPTCHA响应令牌 const recaptchaResponse = req.body['g-recaptcha-response']; // 替换成你的服务端secret密钥 const secretKey = '你的实际secret密钥'; // 获取用户IP const userIp = req.ip; // 发送验证请求 const verifyResult = await axios.post( 'https://www.google.com/recaptcha/api/siteverify', null, { params: { secret: secretKey, response: recaptchaResponse, remoteip: userIp } } ); if (verifyResult.data.success) { // 验证通过,处理表单 res.send('表单提交成功,reCAPTCHA验证通过'); } else { // 验证失败,返回错误 const errors = verifyResult.data['error-codes'] || []; res.status(400).send(`reCAPTCHA验证失败:${errors.join(', ')}`); } } catch (err) { console.error('验证请求出错:', err); res.status(500).send('服务器内部错误'); } }); app.listen(3000, () => { console.log('服务器运行在 http://localhost:3000'); });
重要注意事项
- 绝对不要泄露你的secret密钥:这个密钥只能在服务端使用,一旦暴露,恶意攻击者可以绕过reCAPTCHA验证
remoteip参数虽然可选,但建议加上,它能帮助Google区分正常请求和恶意请求,提升验证准确率- 如果验证失败,可以查看返回的
error-codes字段,对应官方文档的错误码就能快速排查问题(比如密钥不匹配、响应令牌过期等) - 确保你的服务端可以访问Google的验证接口,如果是国内服务器,可能需要配置代理才能正常请求
内容的提问来源于stack exchange,提问作者cjhiggins
相关产品推荐
相关产品推荐

