Я использую reCaptcha v3 от Google на html-странице, которая все еще находится в бета-версии.( reCaptcha v3 docs )
HTML-страница состоит из двух кнопок, при нажатии каждой из которых вызывается метод внутреннего веб-сервиса с использованием jquery ajax, т. Е. При щелчке по ним не передается формакнопок.Если нажата кнопка Contact Us , то вызывается метод веб-службы ContactUs, а если нажата кнопка Buy , то вызывается метод Buy веб-службы.
Если янажмите кнопку «Связаться с нами» после рендеринга страницы, затем я получу ответ, как показано ниже, что я и ожидаю, поскольку я не бот.
{success: true, challenge_ts: "2018-05-12T05: 40: 23Z ", имя хоста:" localhost ", оценка: 0,9}
Затем, если я нажимаю другую кнопку, например кнопку" Купить ", я всегда получаю ответ, как показано ниже.
{success: false, коды ошибок ": [" timeout-or-duplicate "]}
Вопрос
Почему ответиз recaptcha всегда false с указанным выше сообщением об ошибке timeout-or-duplicate, когда я нажимаю кнопку Buy?
Я просто хочу убедиться, что бот не нажимает эти кнопки, и я подумал, что 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 # для вызова серверного сайта recaptchaVerify
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);
}