我尝试实现一个简单的代码以在我的网站上使用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>