我试图在我的网站上使用谷歌reCaptcha,在遵循几个教程之后,我在我的HTML页面上使用如下:
<section class="row" id="Contact">
<div class="col-full">
<form method="post" action="contact.php">
<input name="sender" placeholder="Name" size="30"><br><br>
<input name="senderEmail" placeholder="Email" size="30"><br><br>
<textarea rows="10" cols="30" name="message" placeholder="Message"></textarea><br><br>
<div class="g-recaptcha" data-sitekey="6LdFOQcTAAAAABKsku3bD6Mp3HuGYNDRN1tLlSkw"></div><br>
<input type="submit" name="submit">
</form>
</div>
</section>
在<head>
标签内使用以下内容:
<script src='https://www.google.com/recaptcha/api.js'></script>
表单加载如下PHP脚本,如Google的教程所示:
<?php
require_once('recaptchalib.php');
echo "<pre> _POST: =========n";
print_r($_POST);
echo "n=========n</pre>";
$privatekey = "privatekey";
$resp = recaptcha_check_answer ($privatekey,
$_SERVER["REMOTE_ADDR"],
$_POST["recaptcha_challenge_field"],
$_POST["recaptcha_response_field"]);
if (!$resp->is_valid)
{
die ("The reCAPTCHA wasn't entered correctly. Go back and try it again." .
"(reCAPTCHA said: " . $resp->error . ")");
}
?>
问题是我总是得到错误incorrect-captcha-sol
,不能理解为什么。我从PHP脚本得到的输出是:
_POST: =========
Array
(
[g-recaptcha-response] => 03AHJ_VusLbTZVbhMBH2-cyOdbM81IoG7ShDtTmyVa8e34PbghyKaRYnrb4bbeuPoJXFa-2sD5B-UIOWq_zClya-VOtq8iLHXBkAR0PrElQYiQjKTm2POkjci43-yEaenh1tu_M4vKsjJGswKFlVs6IdlWhdVaMdznLBeutgHjiHRBy7fzAi0It0x5IadwMxAqVpmG7F1gRvUcQmakij4ObTqPUK4lPdc84HkkKmY62uJ45d8DwKSeR2ifRg6wL9JFxpcZkjSp4oIlltin2uCMiBDU58QQQLLKPJuSKcmm-N5p7OEt7E6gc4UZyTLpKrJ-9mMUusvLpixwFHop0e5155vEZssxzu6Zizo-LyB1mX3XOrQ8LEceydssgLvl9gJBC4f9zDBKPQdLmjfxVKdPCXLtUZVNbMDYe7cNL7gsgwJC-hLbZYTh6UV1nUdKnFnkHAACjI7M28hpKWdiyIwcJ5UAzTMPfIllMw
)
=========
为什么我没有recaptcha_challenge_field
或recaptcha_response_field
字段在我的POST,我怎么能解决它?
我使用的验证码如下:
在header中:
<script src='https://www.google.com/recaptcha/api.js'></script>
这是你想要实际验证码的位置:
<div class="g-recaptcha" data-sitekey="PUBLIC_KEY_HERE"></div>
你可以把这个添加到div中来改变主题:data-theme="theme"
这是PHP脚本:
if(isset($_POST['g-recaptcha-response']))
$captcha=$_POST['g-recaptcha-response'];
if(!$captcha){
//Captcha hasn't been checked
}
$response=json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=SECRET_KEY_HERE&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR']), true);
if($response['success'] == false){
//Captcha incorrect
}
else {
//Success code here
}
从我可以看到你没有一个else
选项后,你检查的答案。你检查它是否错了,但没有什么告诉它如果用户输入正确该怎么做。试着添加如下内容:
if (!$resp->is_valid) {
die ("The reCAPTCHA wasn't entered correctly. Go back and try it again." . "(reCAPTCHA said: " . $resp->error . ")");
}
else {
//Code for success here
}
我使用Google New reCaptcha
https://github.com/google/recaptcha
规范
是单机包。
captcha失败后,我使用jquery代码重新加载capctha
grecaptcha.reset();
因为recapctha响应在验证后过期,captcha没有重新加载,所以它会一次又一次地发送过期响应,直到你不重新加载页面以获得新的captcha码。
验证代码
require('/path/to/recaptcha/autoload.php');
$recaptcha = new ReCaptchaReCaptcha($secret);
$resp = $recaptcha->verify($gRecaptchaResponse, $remoteIp);
if ($resp->isSuccess()) {
} else { $errors = $resp->getErrorCodes();
foreach ($errors as $code) {
echo "<div class="alert alert-danger">$code</div>";
}
echo "<p><strong>Note:</strong> Error code <tt>missing-input-response</tt> may mean the user just didn't complete the reCAPTCHA.</p>";
}