谷歌reCaptcha - 如何获得g-recaptcha-response - 没有FORM TAG

时间:2015-09-29 15:18:55

标签: javascript php recaptcha

解决了问题,解决方案在底部...... 我恳请改进或改变,因为它不是一个很好的解决方案,它只是有效但不是很好实现

问题

我需要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;
}

1 个答案:

答案 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服务器端获取了内容。