我正在写这封信,是因为该网站上的任何问题都无法真正帮助我弄清楚为什么reCaptcha没有得到验证。我在页面上使用了两个reCaptcha的V2和Invisible。不幸的是,我正在使用的项目非常老,虽然看起来像是ASP.NET MVC,但我看不到任何控制器或模型,因此我不知道它的真正写法。 ASP.NET WebForms中的项目,并且reCaptcha可以完美地工作。问题是我必须在旧站点上使用JavaScript,直到发布新站点为止,而新站点将不再使用几个月。
这是我的表格:
<form id="form" action="?" method="post">
<fieldset>
<div class="form-group">
<div class="row">
<div class="col-md-12">
@* RECAPTCHA V2 WIDGET *@
<div id="captcha2" class="g-recaptcha"
data-sitekey="6LdOZWkUAAAAAE1EhMyhMPF5IwM3lflaeyZ2VWaB"></div>
<br />
@* MESSAGE FROM RECAPTCHA *@
<div id="msg" class="msg-error error"></div>
<br>
@* SUBMIT BUTTON FOR VALIDATION & RECAPTCHA *@
<input id="submit" type="submit" name="buttonSubmit" class="btn btn-success btn-large"
value="Submit Information Request" />
<input type="hidden" name="registerDate" value="@DateTime.Now" />
</div>
</div>
</div>
@* RECAPTCHA INVISIBLE WIDGET *@
<div id="captchaI" class="g-recaptcha"
data-sitekey="6LduaWkUAAAAAHp0EU5JXdTIszKR-g2AZfDqmLiv"
data-callback="submit"
data-size="invisible">
</div>
</fieldset>
这是我的JavaScript:
<script>
$('#submit').click(function () {
//var obj =
//{
// secret: "MY_PRIVATE_KEY",
// response: grecaptcha.getResponse()
//};
//var json = JSON.stringify(obj);
//window.location = "https://www.google.com/recaptcha/api/siteverify?" + json;
//var respJSON = '{"success": true | false, "challenge_ts": timestamp, "hostname":string}';
//var respObj = JSON.parse(respJSON);
//alert(respObj.success + "\n" + respObj.challenge_ts + "\n" + respObj.hostname);
//--------------------------------------------------------------------
alert("NO JSON\n" + grecaptcha.getResponse()); //I GET A HASHED RESPONSE
var response = grecaptcha.getResponse();
var stringy = JSON.stringify("STRINGIFY\n" + response);
alert(stringy); //I GET A HASHED RESPONSE
var parsy = JSON.parse("PARSED" + response);
alert(parsed); //I GET NOTHING
//--------------------------------------------------------------------
//var pk = 'MY_PRIVATE_KEY';
//var url = "https://www.google.com/recaptcha/api/siteverify?secret=";
//$.post(url,
// {
// "secret": pk,
// "response": "&response=" + response
// },
// function (response) {
// alert(response);
// });
//alert(response);
//JSON.stringify(response);
//alert(response);
//$('#msg').prepend(response);
//if (!response) {
// $('#msg').text("No Response from Captcha.");
//}
});
如您所见,我正在将jQuery与JSON结合使用。我试图以多种方式从reCaptcha中获取响应,通常在#msg div中发布消息,但在那里什么都没有显示。
我知道Google Developers reCaptcha Guide是什么 说,但实际上如何实现它没有帮助。请提供帮助,因为没有其他解决方案可以通过siteverify验证响应,使用由于代理人的控制而无法使用的PHP,或者像《开发人员指南》一样没有帮助。
答案 0 :(得分:0)
您似乎正在尝试验证响应客户端。那行不通。 Google仅会验证您向他们注册的网址发送的响应。因此,您需要验证响应服务器端。
首先,从小部件中获取哈希代码
addresses = [['123 street name', 'New Orleans', 'LA', 12345],['New Orleans', 'LA', 12345]]
for address in addresses:
if len(address) > 3:
street = address[0]
city = address[1]
city = city.lstrip()
state = address[2]
state = state.lstrip()
zip_code = address[3]
else:
street = "-"
city = address[0]
city = city.lstrip()
state = address[1]
state = state.lstrip()
zip_code = address[2]
下一步,将响应发送到您的服务器。
var captchaResponse = window.grecaptcha.getResponse();
if (captchaResponse === "") {
alert("Please check \"I'm not a robot'\"");
return;
}
出于我的目的,我需要发布跨网域。您可能可以删除crossDomain参数。
然后,这是我处理帖子的终点。根据您的项目状态,您可能需要为此使用经典的ASP.NET表单。
$.ajax({
type: "POST",
url: newRequestUrl,
crossDomain: true,
xhrFields: {
withCredentials: false
},
data: {
request: JSON.stringify(request),
recaptchaResponse: recaptchaResponse
},
error: function (x1, x2, x3, x4) {
alert("Error: unable to process request");
window.grecaptcha.reset();
},
success: function (respose) {
window.grecaptcha.reset();
alert("Request received");
}
});
最后,确认响应。
[AllowAnonymous]
public JsonResult NewRequest(string request, string recaptchaResponse)
{
if (VerifyRecaptchaResponse(recaptchaResponse, Request.UserHostAddress) == false)
{
return Json(new { Error = "Invalid reCAPTCHA response" });
}
return Json(true);
}
希望这会有所帮助。