我在html页面中使用Google的reCaptcha v3,它仍处于测试阶段。 (reCaptcha v3 docs)
html页面由两个按钮组成,每个按钮都会导致使用jquery ajax调用后端Web服务方法,即单击这些按钮时不会提交表单。如果单击联系我们按钮,则会调用Web服务方法ContactUs,如果单击购买按钮,则会调用Web服务的Buy方法。
如果我在页面渲染后单击“联系我们”按钮,那么我会收到如下所示的响应,这是我所期望的,因为我不是机器人。
{success:true,challenge_ts:“2018-05-12T05:40:23Z”,主机名:“localhost”,得分:0.9}
然后,如果我点击另一个按钮,即购买按钮,我总会得到如下的回复。
{success:false,error-codes“:[”timeout-or-duplicate“]}
问题
当我点击“购买”按钮时,为什么recaptcha的响应总是为false,并且上面的错误消息是超时或重复?
我只是想确保机器人没有点击这些按钮,我认为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);
}
答案 0 :(得分:2)
即使对于不同的令牌值,我也收到了同样的错误。我发现在验证后删除并重新添加api.js脚本到页面允许后续验证成功。
答案 1 :(得分:0)
您不应每页多次验证reCaptcha。这是不必要的,并且会产生多余的网络流量和过多的资源使用。
第一次验证后,您应将分数结果保存在服务器端(例如,作为会话变量),以备后用。