首页 > 解决方案 > 什么是 Google 的 reCAPTCHA v3 中的重复或超时错误消息

问题描述

我在 html 页面中使用 Google 的 reCaptcha v3,它仍然是 beta 版本。(reCaptcha v3 文档

html 页面由两个按钮组成,单击每个按钮会导致使用 jquery ajax 调用后端 Web 服务方法,即单击这些按钮时不会提交表单。如果单击“联系我们”按钮,则调用 Web 服务方法 ContactUs,如果单击“购买”按钮,则调用 Web 服务的“购买”方法。

如果我在页面呈现后单击“联系我们”按钮,则会收到如下响应,这是我所期望的,因为我不是机器人。

{成功:true,challenge_ts:“2018-05-12T05:40:23Z”,主机名:“localhost”,得分:0.9}

然后,如果我单击另一个按钮,即购买按钮,我总是会得到如下响应。

{成功:假,错误代码“:[“超时或重复”]}

问题

为什么当我点击购买按钮时,recaptcha 的响应总是错误的,上面显示超时或重复的错误消息?

我只是想确保机器人没有点击这些按钮,我认为 recaptcha v3 会对此有所帮助,但似乎整个页面需要回发,即每次点击按钮后都需要提交表单工作。

html代码

<!DOCTYPE html>
<html>

<head>
    <title>reCaptcha v3</title>
    <meta charset="utf-8" />
    <script src="Scripts/jquery-1.11.3.min.js" type="text/javascript"></script>
    <script src='https://www.google.com/recaptcha/api.js?render=keyValue'></script>
    <script>
        function verify(action) {
            grecaptcha.execute('clientkeyValue')
                .then(function (token) {
                    $.ajax({
                        type: "POST",
                        url: "SomeWebService.asmx/VerifyCaptchaV3",
                        data: JSON.stringify({ response: token }),
                        success: function (r) {
                            if (r && JSON.parse(r).success === true) {
                                verified = true;

                                if (action === "contactus") {
                                    //code for calling ContactUs method in web service
                                } else if (action === "buy") {
                                    //code for calling Buy method in web service
                                }
                            } else {
                                verified = false;
                            }
                        },
                        contentType: "application/json; charset=utf-8",
                        dataType: "json"
                    });
                });
            }
    </script>
</head>

<body>
    <form action="javascript:grecaptcha.reset();" method="post">
        <div id="example3"></div>
        <br>
        <input type="submit" value="Contact Us" id="submit" onclick="verify('contactus'); return false;">
        <input type="submit" value="Buy" id="submit1" onclick="verify('buy'); return false;">
    </form>
</body>

</html>

C#中的Web服务方法调用服务器端recaptcha siteVerify

public string VerifyCaptchaV3(string response) {
    string url = "https://www.google.com/recaptcha/api/siteverify?secret=someValue&response=" + response;
    return (new System.Net.WebClient()).DownloadString(url);
}

标签: javascriptjqueryrecaptcha

解决方案


即使对于不同的令牌值,我也收到相同的错误。我发现在验证后将 api.js 脚本删除并重新添加到页面可以使后续验证成功。


推荐阅读