没有仅使用 JavaScript 或 jQuery 的简单解决方案。由于您必须使用 API 来比较 Re-Captcha 代码以及您的private密钥,为了适当的安全,您must与一些人一起做这个过程server端代码。
用户正确填写表单(重新验证码除外)。
如果 Re-Captcha 代码为空,则正常required
jQuery Validate 中的规则会触发“缺少验证码”消息。用户可以重试。
输入重新验证码(正确或错误),表格将提交给您server通过 jQuery 的端代码ajax
内submitHandler
回调函数。
Your server-side 代码、PHP、Perl 等等,然后使用您的私有 API 密钥根据 API 预期的 Re-Captcha 代码来验证输入的 Re-Captcha 代码。
如果重新验证码正确,您的server-side 代码继续正常运行并向您的 jQuery 返回“成功”文本响应ajax
success
回调函数。
如果重新验证码是不正确, your server端代码将only返回一个“错误”文本响应到您的 jQueryajax
success
回调函数,服务器端代码不会做任何其他事情。
在你的 jQuery 中ajax
success
回调函数,读取服务器端代码返回的消息文本。
如果返回的消息指示成功,则您的表单已成功提交,您可以重定向、清除表单、执行动画、打印消息、不执行任何操作或执行其他操作等。
如果返回的消息表明失败,则通过JavaScript生成新的Re-Captcha代码,显示错误消息,“输入的验证码不正确”,用户只需重试即可。
这就是我的做法......你需要做一些非常类似于以下的事情。
Add a submitHandler
给你的.validate()
选项和使用ajax
控制表单提交。这是您与验证码交互并控制表单提交的唯一方式。
您还需要修改服务器端函数来测试验证码是否通过或失败,执行适当的函数并返回正确的ajax
信息,msg
。如果不了解服务器端代码,就不可能说出更具体的内容。
(NOTE:任何纯粹的 JavaScript/jQuery 解决方案,无需编辑服务器端代码,都是not安全的。验证码很容易被绕过,您的 API 私钥也会被公开。)
$(document).ready(function() {
$("#contact").validate({
// your other options and rules,
submitHandler: function (form) {
$.ajax({
type: 'POST',
data: $('form').serialize(),
url: 'formMail.pl', // <-- whatever your server-side script, mine is a perl form mailer
success: function (msg) {
if (msg.indexOf('captcha') != -1) {
Recaptcha.reload(); // reloads a new code
$('#recaptcha_response_field').before(msg); // error message
} else {
// anything else to do upon success, animations, etc.
// form was already submitted as per ajax
}
}
});
return false; // blocks normal form submit
}
});
});
以下只是我如何修改服务器端代码(表单邮件程序脚本)的 PERL 示例。您必须以类似的方式调整服务器端代码。
子程序check_captcha
当脚本第一次运行时调用。
sub check_captcha {
my $ua = LWP::UserAgent->new();
my $result=$ua->post(
'http://www.google.com/recaptcha/api/verify',
{
privatekey => 'xxxxxxxxxxxxx', # insert your private key here
remoteip => $ENV{'REMOTE_ADDR'},
challenge => $Form{'recaptcha_challenge_field'},
response => $Form{'recaptcha_response_field'}
}
);
if ( $result->is_success && $result->content =~ /^true/) {
return; # OK - continue as normal with Form Mailer
} else {
# error, Form Mailer will not continue
&error('captcha_failed'); # failed Captcha code, call error subroutine to print an error message (msg) containing the word "captcha"
}
}
请记住这段服务器端代码must返回 jQuery 在 jQuery 中获取的消息ajax
success
回调为msg
多于。在我的示例中,如果消息包含单词“验证码”,则意味着代码输入错误,用户必须重新输入新的验证码。