Google recaptcha验证(siteVerify)返回false



我尝试实现一个简单的代码以在我的网站上使用recaptcha,但即使此简单代码也不起作用。

问题是验证函数始终返回一个bool(false)值。我已经检查了几次键,但它们是正确的键

<head>
 <script src="https://www.google.com/recaptcha/api.js" async defer></script>
</head>
<body>
 <?php require_once "recaptchalib.php";  ?> 
    <?php
        if(isset($_POST['new_comment']) && !empty($_POST['new_comment'])):
            if(isset($_POST['g-recaptcha-response']) && !empty($_POST['g-recaptcha-response'])) :
                $secret = "mysecretkey";
                    var_dump ($_POST['g-recaptcha-response']);
                $ip = $_SERVER['REMOTE_ADDR'];
                $verifyResponse = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secret.'&response='.$_POST['g-recaptcha-response'].'&remoteip='.$ip);
                    echo ("verifyresponse");
                    var_dump ($verifyResponse);
                $responseData = json_decode($verifyResponse, true);
                    echo ("responseData");
                    var_dump ($ResponseData);
                if ($response != null && $response->success) :
                    echo 'Form info successfully submitted';
                else:
                    $errMsg = 'Robot verification failed, please try again.';
                    echo $errMsg ;
                endif;
            else:
                $errMsg = 'Please click on the reCAPTCHA box.';
                echo $errMsg ;
            endif;
        else:
            $errMsg = '';
            $succMsg = '';
        endif;
        ?>
        <form name="form1" action="thisfile.php" method="post">
                    Enter Comment :<br />
                    <textarea name="new_comment" cols="75" rows="10"></textarea><br />
                    <div class="g-recaptcha" data-sitekey="mysitekey"></div>
                    <input type="submit" value="Envoyer" />
        </form>
</body>
</html>

var_dump ($_POST['g-recaptcha-response'])给出了预期的长字符链,但是var_dump ($verifyResponse)给出了bool(false)值,我从未看到var_dump ($ResponseData)

谁能帮我找出此代码怎么了?

我将问题缩小到file_get_content调用返回" false"值而不是预期

的事实

{ "成功":是的, "挑战_ts":" 2017-12-10t15:09:12z", "主机名":" mydomain" }

是什么让我发疯的是,如果呼应完整的字符串并将其直接复制在浏览器中,那么我得到了正确的答案(上图),所以我无法弄清楚发生了什么问题...

这是我的代码的当前"剥离到骨头"版本(我已经删除了json_decode呼叫,之后的所有内容,只要我遇到错误的回报值,我知道其余的就无法正常工作)

<!doctype html>
<html>
<head>
    <script src="https://www.google.com/recaptcha/api.js" async defer>
</script>
</head>
<body>
    <?php
        define('GOOGLE_RECAPTCHA_KEY','xxx');
        define('GOOGLE_RECAPTCHA_SECRET_KEY','yyy');
        $message = false;
      if ( isset( $_POST['new_comment'], $_POST['g-recaptcha-response'] ) && !empty( $_POST['new_comment'] ) && !empty( $_POST['g-recaptcha-response'] ) ){
      echo 'Sauvegarde du commentaire' ;
            $secret = GOOGLE_RECAPTCHA_SECRET_KEY;
            $ip = $_SERVER['REMOTE_ADDR'];
                            var_dump($_POST['g-recaptcha-response']);
            $getResponse = 'https://www.google.com/recaptcha/api/siteverify?secret='.$secret.'&response='.$_POST['g-recaptcha-response'];
                            var_dump($getResponse);
            $GoogleResponse = file_get_contents($getResponse) ;
                            var_dump($GoogleResponse) ;
      }
    ?>
    <form method='post'>
        Enter Comment :<br />
        <textarea name='new_comment' cols='75' rows='10'></textarea>
        <?php
            if( !empty( $message ) )echo $message;
        ?>
        <br />
        <div class='g-recaptcha' data-sitekey='<?php echo GOOGLE_RECAPTCHA_KEY;?>'></div>
        <input type='submit' value='Envoyer' />
    </form>
</body>
</html>

检查变量:

if ($responseData!= null && $responseData['success']) {

代码的其他编辑:

$secret = "Add Your Secret Key"; // may be you are adding here public key instead of private ? check it
$response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secret."&response=".$_POST['g-recaptcha-response']);
$response = json_decode($response, true); // if you add "true" then the response will be an array
if($response["success"] === true){
    echo "Form Submit Successfully.";
}else{
    echo "You are a robot";
}

我也建议您查看这些教程:

Google recaptcha教程

和此recaptcha示例来自GitHub:

require('/path/to/recaptcha/src/autoload.php');
$recaptcha = new ReCaptchaReCaptcha($secret);
$resp = $recaptcha->verify($gRecaptchaResponse, $remoteIp);
if ($resp->isSuccess()) {
    // verified!
    // if Domain Name Validation turned off don't forget to check hostname field
    // if($resp->getHostName() === $_SERVER['SERVER_NAME']) {  }
} else {
    $errors = $resp->getErrorCodes();
}

github链接

我认为失败的原因如下。

第一个问题是将true用作json_encode的第二个参数 - 这将数据以阵列格式放置,但您正在尝试使用对象语法访问返回的JSON字符串的status属性。

$responseData = json_decode($verifyResponse, true);

,应该是

$responseData = json_decode($verifyResponse);

第二期 - 在这里二合一。$response在哪里定义?第二个是如上所述 - 使用对象语法而不是数组。

if ($response != null && $response->success)

应该是(假设$responseData = json_decode( $verifyResponse );

if ( $verifyResponse != null && $responseData->success==1 )

以下是我的测试 - 或多或少是相同的,但较旧的PHP版本,因此使用卷曲牙套代替结肠样式。

<!doctype html>
<html>
    <head>
        <script src="https://www.google.com/recaptcha/api.js" async defer></script>
    </head>
    <body>
        <?php
            define('GOOGLE_RECAPTCHA_KEY','xxxyyyzzz');
            define('GOOGLE_RECAPTCHA_SECRET_KEY','aaabbbccc');
            $message = false;
            if ( isset( $_POST['new_comment'], $_POST['g-recaptcha-response'] ) && !empty( $_POST['new_comment'] ) && !empty( $_POST['g-recaptcha-response'] ) ){
                $secret = GOOGLE_RECAPTCHA_SECRET_KEY;
                $ip = $_SERVER['REMOTE_ADDR'];
                $response = file_get_contents( 'https://www.google.com/recaptcha/api/siteverify?secret=' . $secret . '&response=' . $_POST['g-recaptcha-response'] . '&remoteip=' . $ip );
                $json = json_decode( $response );
                /* 
                    You need to use $json->success not $response->success 
                    and because you are trying to use object syntax rather
                    than array syntax json_decode does not need 2nd param `true`
                */
                if( $response && !is_null( $response ) && $json->success==1 ){
                    $message='Form info successfully submitted';
                }else{
                    $message = 'Robot verification failed, please try again.';
                }
            }
        ?>
        <form method='post'>
            Enter Comment :<br />
            <textarea name='new_comment' cols='75' rows='10'></textarea>
            <?php
                if( !empty( $message ) )echo $message;
            ?>
            <br />
            <div class='g-recaptcha' data-sitekey='<?php echo GOOGLE_RECAPTCHA_KEY;?>'></div>
            <input type='submit' value='Envoyer' />
        </form>
    </body>
</html>

最新更新