Javascript Google reCaptcha不工作
我写这篇文章是因为这个网站上的任何问题都没有真正帮助我弄清楚为什么reCaptcha没有得到验证。我在我的页面上使用了两个reCaptcha的V2和Invisible。不幸的是,我正在使用的项目非常古老,虽然它看起来像是ASP.NET MVC,但我没有看到任何控制器或模型,所以我不知道它真正是用什么编写的。我正在ASP.NET WebForms中重建项目,我让reCaptcha在其中完美地工作。问题是,在我发布新站点之前,我必须对旧站点使用JavaScript,而新站点将在几个月内发布 这是我的表格:Javascript Google reCaptcha不工作,javascript,json,recaptcha,invisible-recaptcha,Javascript,Json,Recaptcha,Invisible Recaptcha,我写这篇文章是因为这个网站上的任何问题都没有真正帮助我弄清楚为什么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>
@*RECAPTCHA V2小部件*@
@*来自RECAPTCHA的消息*@
@*“提交”按钮以进行验证和重述TCHA*@
@*RECAPTCHA不可见小部件*@
以下是我的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.");
//}
});
$(“#提交”)。单击(函数(){
//var obj=
//{
//秘密:“我的私钥”,
//响应: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);
//警报(respObj.success+“\n”+respObj.challenge\u ts+“\n”+respObj.hostname);
//--------------------------------------------------------------------
警报(“无JSON\n”+grecaptcha.getResponse());//我得到一个哈希响应
var response=grecaptcha.getResponse();
var stringy=JSON.stringify(“stringify\n”+响应);
警报(stringy);//我得到一个散列响应
var parsy=JSON.parse(“已解析”+响应);
警惕(解析);//我什么也没得到
//--------------------------------------------------------------------
//var pk='MY_PRIVATE_KEY';
//变量url=”https://www.google.com/recaptcha/api/siteverify?secret=";
//$.post(网址:,
// {
//“秘密”:pk,
//“响应”:“&response=“+response
// },
//功能(响应){
//警报(响应);
// });
//警报(响应);
//stringify(响应);
//警报(响应);
//$('#msg')。前置(应答);
//如果(!响应){
//$('#msg').text(“验证码无响应”);
//}
});
如您所见,我将jQuery与JSON结合使用。我曾尝试以多种方式从reCaptcha中获取响应,通常在#msg div中发布消息,但没有显示任何内容
我知道那是什么
但是它对于如何实际实现这一点并没有什么帮助。请提供帮助,因为没有其他解决方案使用siteverify验证响应、使用PHP(由于代理控制,我无法使用PHP),或者与《开发人员指南》一样,没有什么帮助。看起来您正在尝试验证响应客户端。那不行。谷歌将只验证从您注册的url发送的响应。因此,您需要验证响应服务器端 首先,从小部件获取哈希代码
var captchaResponse = window.grecaptcha.getResponse();
if (captchaResponse === "") {
alert("Please check \"I'm not a robot'\"");
return;
}
接下来,将响应发送到服务器
$.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");
}
});
出于我的目的,我需要跨域发布。您可能可以删除crossDomain参数
那么,这就是我处理这篇文章的目的。根据您的项目状态,您可能需要使用经典的ASP.NET表单
[AllowAnonymous]
public JsonResult NewRequest(string request, string recaptchaResponse)
{
if (VerifyRecaptchaResponse(recaptchaResponse, Request.UserHostAddress) == false)
{
return Json(new { Error = "Invalid reCAPTCHA response" });
}
return Json(true);
}
最后,验证响应
private static bool VerifyRecaptchaResponse(string recaptchaResponse, string remoteIp)
{
var recaptchaApiUrl = ConfigurationManager.AppSettings["recaptchaApiUrl"];
var secret = ConfigurationManager.AppSettings["recaptchaSecretKey"];
var postData = string.Format(CultureInfo.InvariantCulture, "&secret={0}&remoteip={1}&response={2}", secret, remoteIp, recaptchaResponse);
var postDataAsBytes = Encoding.UTF8.GetBytes(postData);
var request = WebRequest.Create(recaptchaApiUrl);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postDataAsBytes.Length;
var dataStream = request.GetRequestStream();
dataStream.Write(postDataAsBytes, 0, postDataAsBytes.Length);
dataStream.Close();
var response = request.GetResponse();
using (var stream = response.GetResponseStream())
{
if (stream == null) return false;
using (var reader = new StreamReader(stream))
{
var serializer = new JavaScriptSerializer();
var text = reader.ReadToEnd();
var responseFromServer = serializer.DeserializeObject(text) as Dictionary<string, object>;
if (responseFromServer == null) return false;
if (responseFromServer.ContainsKey("success") == false) return false;
if (responseFromServer["success"] is bool == false) return false;
return (bool)responseFromServer["success"];
}
}
}
private static bool verifyRecaptCharResponse(字符串RecaptCharResponse,字符串remoteIp)
{
var repactchaapirl=ConfigurationManager.AppSettings[“repactchaapirl”];
var secret=ConfigurationManager.AppSettings[“recaptchaSecretKey”];
var postData=string.Format(CultureInfo.InvariantCulture,&secret={0}&remoteip={1}&response={2}),secret,remoteip,recaptchaResponse;
var postDataAsBytes=Encoding.UTF8.GetBytes(postData);
var request=WebRequest.Create(recaptchaApiUrl);
request.Method=“POST”;
request.ContentType=“application/x-www-form-urlencoded”;
request.ContentLength=postDataAsBytes.Length;
var dataStream=request.GetRequestStream();
写入(postDataAsBytes,0,postDataAsBytes.Length);
dataStream.Close();
var response=request.GetResponse();
使用(var stream=response.GetResponseStream())
{
if(stream==null)返回false;
使用(变量读取器=新的流读取器(流))
{
var serializer=新的JavaScriptSerializer();
var text=reader.ReadToEnd();
var responseFromServer=serializer.DeserializeObject(文本)作为字典;
if(responseFromServer==null)返回false;
if(responseFromServer.ContainsKey(“success”)==false)返回false;
如果(responseFromServer[“success”]为bool==false),则返回false;
返回(bool)responseFromServer[“成功”];
}
}
}
希望这能有所帮助。FYI而不是
/
每行只需使用/*[code]*/
。这很好,这是我在新网站中拥有的,因为它是一个WebForms项目。它在那里工作,但是当前的网站,我正在用新网站替换的网站,没有后端代码。这就是问题所在。我认为这个项目是在MVC中完成的,但我没有看到控制器或模型让我对我的前任所做的事情感到困惑。网站本身由.cshtml文件组成。那么,有没有一种方法可以将C#代码放到视图中并使其工作?我认为它在视图中工作得很好。我很好奇,你试过右键点击cshtml文件并选择“转到控制器”吗?我没有试过,因为我必须使用部署的fil