Php 将ReCaptcha与jQuery Validate一起使用,给出正确的响应,但给出错误
我正在使用jqueryvalidate为我的网站创建一个注册表单,底部有一个reCaptcha。以下是检查表单错误的脚本(仅编辑为相关部分):Php 将ReCaptcha与jQuery Validate一起使用,给出正确的响应,但给出错误,php,javascript,jquery,jquery-validate,recaptcha,Php,Javascript,Jquery,Jquery Validate,Recaptcha,我正在使用jqueryvalidate为我的网站创建一个注册表单,底部有一个reCaptcha。以下是检查表单错误的脚本(仅编辑为相关部分): $(文档).ready(函数(){ jQuery.validator.addMethod(“checkCaptcha”,函数(){ var phpquery=$.ajax({url:“verify.php”, 类型:“POST”, async:false, 数据:{repactcha_challenge_字段:repactcha.get_challeng
$(文档).ready(函数(){
jQuery.validator.addMethod(“checkCaptcha”,函数(){
var phpquery=$.ajax({url:“verify.php”,
类型:“POST”,
async:false,
数据:{repactcha_challenge_字段:repactcha.get_challenge(),repactcha_response_字段:repactcha.get_response()},
成功:功能(resp){
如果(resp=='false'){
主控台主任(resp);;
返回false;
}否则{
主控台主任(resp);;
返回true;
}
}
});
},"");
$('#regForm')。验证({
规则:{
recaptcha_响应_字段:{required:true,checkCaptcha:true}
},
信息:{
recaptcha_响应_字段:{checkCaptcha:“您的Captcha响应不正确。请重试。“}
}
});
});
当我输入正确的reCaptcha响应并在响应文本字段中单击submit或tab时,它会在控制台中首先显示true
,然后立即抛出false
,阻止我提交表单
当输入不正确的reCaptcha响应时,它会像预期的那样抛出false
,但对于我输入的每个字母,它都会将其提交到verify.php
并返回false
。当我最终输入正确的reCaptcha时,它无法识别它,仍然返回false
即使输入了正确的响应,重新加载reCaptcha也会抛出一个false
我知道verify.php
工作正常,因为当
有action=“verify.php,
时,一切都会完美工作(即,无论您尝试了多少次,都会告诉您是否输入了正确的reCaptcha)
我错过什么了吗?有更简单、可靠的方法吗?使用
.validate()中的onkeyup:false
选项
否则,每次您键入一封信时,它都会运行checkCaptcha
方法,并向服务器发送一个不完整的验证码。我相信一旦发送了错误的验证码,它现在就过期了,你不能再发送相同的代码
无论如何,我认为最好在字段完成之前不要向服务器发送代码
$('#regForm').validate({
onkeyup: false,
rules:{
recaptcha_response_field: {
required: true,
checkCaptcha: true
}
},
messages:{
recaptcha_response_field: {
checkCaptcha: "Your Captcha response was incorrect. Please try again."
}
}
});
此外,如果验证码失败,您需要触发刷新以获得新代码
Recaptcha.reload();
在您的success
回调中,也许
success:function(resp) {
if (resp == 'false') {
console.dir(resp);
Recaptcha.reload(); // get a new captcha code on failure
return false;
} else {
console.dir(resp);
return true;
}
}
使用.validate()
中的onkeyup:false
选项
否则,每次您键入一封信时,它都会运行checkCaptcha
方法,并向服务器发送一个不完整的验证码。我相信一旦发送了错误的验证码,它现在就过期了,你不能再发送相同的代码
无论如何,我认为最好在字段完成之前不要向服务器发送代码
$('#regForm').validate({
onkeyup: false,
rules:{
recaptcha_response_field: {
required: true,
checkCaptcha: true
}
},
messages:{
recaptcha_response_field: {
checkCaptcha: "Your Captcha response was incorrect. Please try again."
}
}
});
此外,如果验证码失败,您需要触发刷新以获得新代码
Recaptcha.reload();
在您的success
回调中,也许
success:function(resp) {
if (resp == 'false') {
console.dir(resp);
Recaptcha.reload(); // get a new captcha code on failure
return false;
} else {
console.dir(resp);
return true;
}
}
好吧,终于明白了(尽管这可能只是一个变通办法)。下面是新的addMethod
:
jQuery.validator.addMethod("checkCaptcha", function() {
var bfr = false;
var phpquery = $.ajax({url:"verify.php",
type: "POST",
async: false,
data:{recaptcha_challenge_field:Recaptcha.get_challenge(),recaptcha_response_field:Recaptcha.get_response()},
complete:function(resp) {
if(resp.responseText.indexOf("false")>=0){
Recaptcha.reload();
}else{
bfr = true;
}
}
});
if(bfr){
return true;
}
},"");
我还将onkeyup:false
、onclick:false
和onfocusout:false
添加到validate()
。
这似乎完成了任务。好吧,终于完成了(尽管这可能只是一个解决办法)。下面是新的addMethod
:
jQuery.validator.addMethod("checkCaptcha", function() {
var bfr = false;
var phpquery = $.ajax({url:"verify.php",
type: "POST",
async: false,
data:{recaptcha_challenge_field:Recaptcha.get_challenge(),recaptcha_response_field:Recaptcha.get_response()},
complete:function(resp) {
if(resp.responseText.indexOf("false")>=0){
Recaptcha.reload();
}else{
bfr = true;
}
}
});
if(bfr){
return true;
}
},"");
我还将onkeyup:false
、onclick:false
和onfocusout:false
添加到validate()
。
这似乎完成了任务。以下是我的想法,特别是关于“使用AJAX请求验证验证码”
在表单中添加验证码的主要原因是为了验证提交表单的是机器人还是人。所以,即使其他字段有错误,在成功提交验证码后,显然我们知道这是人为的。因此,在首次成功后删除验证码字段是完全可以的(请刷新验证码,直到成功)。然后可以像平常一样处理其他字段
有任何异议吗?以下是我的想法,特别是关于“使用AJAX请求验证captcha”
在表单中添加验证码的主要原因是为了验证提交表单的是机器人还是人。所以,即使其他字段有错误,在成功提交验证码后,显然我们知道这是人为的。因此,在首次成功后删除验证码字段是完全可以的(请刷新验证码,直到成功)。然后可以像平常一样处理其他字段
有反对意见吗?第一个addMethod验证器的问题是如何返回true或false,第二个问题比它应该返回的更复杂。我不知道您是如何从服务器端处理这件事的,但也许这段代码正是您所需要的:
这对我来说太好了 第一个addMethod验证器的问题是如何返回true或false,而第二个问题比它应该返回的更复杂。我不知道您是如何从服务器端处理这件事的,但也许这段代码正是您所需要的:
这对我来说太好了 这样就解决了每次击键都要发送响应的问题,但是我仍然有一个问题,verify.php
首先会给我true
,然后直接转到false
,阻止页面提交。@synthrom,是的,尽管我们禁用了onkeyup
事件,规则仍然会在每次模糊时进行评估,然后在单击“提交”时再次进行评估。您不能一直向服务器发送相同的代码。以某种方式