首页 > 解决方案 > 如何在服务器请求方法中验证 recaptcha 响应测试?

问题描述

我有下面的代码,一旦发送表单,我想检查它是否用户通过了recaptcha 测试。我该怎么做?搜索了很多东西,我找不到适合我的方法..

<html>
  <head>
        <script type="text/javascript">
        
        var verifyCallback = function(response) {
           alert(response);
        };
    
          var onloadCallback = function() {
            grecaptcha.render('example3', {
              'sitekey' : '6LdlRIgaAAAAAJXOu3EsuGVnKVjmSaWfSbuwSHLI',
              'callback' : verifyCallback,
              'theme' : 'dark'
            });
          };
          
        </script>
  </head>

  <body>
      
      <?php
        if ($_SERVER['REQUEST_METHOD'] == 'POST')
        {
            // here I want to verify if the use user passed the recaptcha
            {
                some code
            }
        }
      ?>
 
    <form method="POST">
      <div id="example3"></div>
      <br>
      <input type="submit" value="Submit">
    </form>
    
    <script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit"
        async defer>
    </script>
    
  </body>
</html>

标签: phprecaptcha

解决方案


您应该查找reCAPTCHA 的服务器端验证文档: https ://developers.google.com/recaptcha/docs/verify

如文档中所述,您必须通过 PHP CURL 发送 API 请求:

URL: https://www.google.com/recaptcha/api/siteverify METHOD: POST

所以是这样的:

function validate_captcha($secret, $response, $remoteip) {

    $captcha_url = "https://www.google.com/recaptcha/api/siteverify";
    $captcha_url .= "?secret=".$secret;
    $captcha_url .= "&response=".$response;
    $captcha_url .= "&remoteip=".$remoteip;
    
    $ch = curl_init($captcha_url);

    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    
    $data = curl_exec($ch);
    
    curl_close($ch);
     
    $response=json_decode($data,true);
    
    if ($response["success"]) {
        return true;
    }
    else {
        return false;
    }

}

你这样调用函数:

$captcha_is_ok = validate_captcha(
  "......mySecret.....", 
  $_POST['g-recaptcha-response'],
  $_SERVER['REMOTE_ADDR']);

if ($captcha_is_ok) {
  ... do something cool ...
} else {
  ... don't do something cool ...
}

推荐阅读