PHP实现Google Recaptcha v2验证后提交原有表单的方法咨询
实现步骤
1. 修改HTML表单
把原表单的action指向你的Recaptcha验证PHP文件,同时新增一个隐藏字段保存原action地址,再加入Recaptcha v2的验证组件:
<form method="POST" action="recaptcha-verify.php"> <!-- 保留原表单的所有字段(包括隐藏字段) --> <input type="hidden" name="original_action" value="原表单的action地址,比如https://example.com/original-handler.php"> <input type="hidden" name="原隐藏字段1" value="值1"> <input type="hidden" name="原隐藏字段2" value="值2"> <!-- 其他可见表单字段 --> <input type="text" name="username" placeholder="用户名"> <!-- 加入Google Recaptcha v2验证框 --> <div class="g-recaptcha" data-sitekey="你的Site Key"></div> <script src="https://www.google.com/recaptcha/api.js"></script> <button type="submit">提交</button> </form>
2. 编写Recaptcha验证及表单转发的PHP文件(recaptcha-verify.php)
先完成Recaptcha的有效性验证,验证通过后,把所有表单数据(包括原隐藏字段)转发到原action地址:
<?php // 1. 验证Recaptcha响应 $secretKey = "你的Secret Key"; $response = $_POST['g-recaptcha-response'] ?? ''; $remoteIp = $_SERVER['REMOTE_ADDR']; // 向Google发送验证请求 $verifyUrl = "https://www.google.com/recaptcha/api/siteverify"; $verifyData = [ 'secret' => $secretKey, 'response' => $response, 'remoteip' => $remoteIp ]; $ch = curl_init($verifyUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $verifyData); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $verifyResult = curl_exec($ch); curl_close($ch); $responseKeys = json_decode($verifyResult, true); // 2. 验证成功则转发表单数据到原action if ($responseKeys["success"] === true) { // 获取原action地址 $originalAction = $_POST['original_action'] ?? ''; if (empty($originalAction)) { die("原action地址无效"); } // 收集所有表单字段,排除Recaptcha相关和原action字段 $formData = []; foreach ($_POST as $key => $value) { if ($key !== 'g-recaptcha-response' && $key !== 'original_action') { $formData[$key] = $value; } } // 使用CURL转发POST请求到原action $ch = curl_init($originalAction); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $formData); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 跟随跳转 curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); // 直接输出原action的响应给用户 curl_exec($ch); curl_close($ch); } else { // 验证失败,返回错误提示 echo "Recaptcha验证失败,请重试!"; // 可以在这里添加返回表单页面的链接 echo '<br><a href="javascript:history.back()">返回表单</a>'; } ?>
注意事项
- 替换代码中的
你的Site Key和你的Secret Key为你在Google Recaptcha控制台获取的密钥。 - 确保服务器支持CURL扩展,如果不支持,可以用
file_get_contents结合流上下文来发送请求(CURL稳定性更强)。 - 原表单的所有字段(包括隐藏字段)会被完整转发,不需要额外修改。
内容的提问来源于stack exchange,提问作者user2713512
相关产品推荐
相关产品推荐

