解决了问题,解决方案在底部...... 我恳请改进或改变,因为它不是一个很好的解决方案,它只是有效但不是很好实现
问题
我需要g-recaptcha-response数据将其发送给谷歌并进行验证。
public function check_reCaptcha()
{
$this->data; //this variable holds the response data
$recaptcha = new ReCaptcha($this->secret);
$resp = $recaptcha->verify($gRecaptchaResponse, $remoteIp); // $remoteIp is optional
if ($resp->isSuccess()) {
// return true
} else {
$error = $resp->getErrorCodes();
}
}
执行$ recaptcha-> verfiy我需要$ gRecaptchaResponse。问题是如何获得这些信息。我的reCaptcha小部件不在表单标记中。
我有什么(必须根据解决方案中的说明发送日期进行改进)
点击注册按钮后,代码将被执行
this.register = function () {
var mModel = new Model();
mModel.checkReCaptcha().done(function(data) {
mModel.register().done(function () {
// if register success
}).fail(function (textStatus) {
// if register fails
});
}).fail(function(textStatus) {
// if checkReCaptcha() fails
});
};
我的模型看起来像这样,model.register在这里不重要..在那里我做了所有的注册步骤,我想在检查reCaptcha之后执行它
模型中的checkReCaptcha函数如下所示
this.checkReCaptcha = function()
{
var url = 'php/main.php?controller=Auth&action=check_reCaptcha';
var data = // get cookie data
return this.getServer().post(url, data);
};
其他问题
是否可以手动启动它 https://www.google.com/recaptcha/api.js,我看到它会在提交表单时执行,但我没有表单。
首先尝试
我的HTML。决定添加一个表单标签并将reCaptcha的div放入此表单中。
<form id="form_recaptcha" action="php/getReCaptchaResponse.php" method="post">
<div class="g-recaptcha captcha" data-sitekey="own-data-key"></div>
<input id="form_recaptcha_submit" type="submit" hidden/>
</form>
当用户按下注册
时,我在表单上调用提交$('#myform').submit();
在我准备好的文件中,我执行以下操作
$(document).on('submit', '#form_recaptcha', function(event) {
event.preventDefault();
// if I wouldn't do the preventDefault it works, but then I'm
// redirected, which is absolutely right... my problem is that calling
// preventDefault, results into not loading my g-recaptcha-response
$.ajax({
url: 'php/getReCaptchaResponse.php',
type: 'POST',
success: function(data) {
console.log(data);
}
});
});
getReCaptchaResponse.php正在调用,但没有返回值,因此Google无法生成密钥。
有人知道Google如何开始生成响应代码?
我在ajax请求中调用的PHP文件看起来像这样
if (isset($_POST['g-recaptcha-response'])) {
echo 'if'; // just for debug
return $_POST['g-recaptcha-response'];
} else {
echo 'else'; // just for debug
return false;
}
答案 0 :(得分:1)
<强>解强>
我对我的解决方案不满意,但它是迄今为止唯一有效的解决方案。
HTML
<iframe name="recaptchaIFrame" style="display:none !important;"></iframe>
<form id="form_recaptcha" action="php/getReCaptchaResponse.php" method="post" target="recaptchaIFrame">
<div class="g-recaptcha captcha" data-sitekey="own-data-key"></div>
<input id="form_recaptcha_submit" type="submit" hidden/>
</form>
它显示如果我定位动作,当表单被提交时,到隐藏的iframe,我得到我的g-recaptcha-response数据,页面不会被重定向。正是我需要的。
FILE getReCaptchaResponse.php,在表格动作
中调用现在我需要返回值,我没有设法将此响应保存到隐藏的html标记中或直接在代码中返回。
我的解决方案是将其保存到cookie中并从该cookie中获取,位于代码中需要的位置。
if (isset($_POST['g-recaptcha-response'])) {
$name = 'reCaptchaResponse';
$value = $_POST['g-recaptcha-response'];
$expire = 0;
$path = '';
$domain = '';
$secure = false;
$httponly = true;
setcookie($name, $value, $expire, $path, $domain, $secure, $httponly);
}
现在您已经在cookie中获得了g-recaptcha-response数据,然后您可以在需要时使用它。建议您在将数据发送给Google进行验证后删除(设置为过去)Cookie。
要使用javascript从Cookie获取内容,请查看此回购:https://github.com/js-cookie/js-cookie/tree/v2.0.3
我从PHP服务器端获取了内容。