我正在尝试使用google的reCaptcha处理表单验证中的验证码。基本上,我的验证函数在表单标记中使用onSubmit调用,然后调用第二个函数来使用recaptcha api。
以下是代码:
var returnValue;
var myData = {
privatekey : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
remoteip : ip,
challenge : challenge,
response : response
};
$.ajax({
url: "http://www.google.com/recaptcha/api/verify",
type: "POST",
data: JSON.stringify(myData),
dataType: "text",
success: function(data) {
var result = data.split("\n");
if (result[0] == "true") {
returnValue = true;
}
else {
returnValue = false;
}
},
error: function(jqXHR, textStatus, errorThrown) {
alert("There was an error submitting the captcha. Please contact an administrator. \n\nError:\n" + textStatus, errorThrown);
returnValue = false;
},
complete: function(jqXHR, textStatus) {
return returnValue;
}
});
在firefox中使用LiveHTTPHeaders,我可以看到请求发送到服务,看起来所有内容都正确发送。我得到了一个HTTP / 1.1 200 OK响应,但每次代码都转到错误函数。当错误函数运行时,jqXHR为:
对象{readyState = 0,status = 0,statusText =“error”}
textStatus为“error”,errorThrown为“”
我尝试过多种方式,包括$ .POST,并使用.done(),. fail(),. aways(),它总是表现相同。
我在这里看到其他一些帖子与跨域请求的问题有关,但这些情况似乎都没有相关性,因为我实际上正在做跨域请求,这些似乎是问题他们向同一域上的文件发出请求,并且作为跨域请求被错误地处理。
我的斗智尽头......任何帮助都会非常感激。
答案 0 :(得分:2)
我在这里看到其他一些帖子与跨域请求的问题有关,但这些情况似乎都没有相关性,因为我实际上在做跨域请求
当我运行该代码时,我收到错误:
XMLHttpRequest cannot load http://www.google.com/recaptcha/api/verify.
Origin http://fiddle.jshell.net is not allowed by Access-Control-Allow-Origin.
所以这是一个跨域问题。您可能想要提出跨域请求,但Google未设置为允许它。
我非常确定recaptcha需要使用 server 端代码来实现。如果你完全在客户端使用JS完成它,那么客户端可以撒谎并说它已经通过了验证码而没有。
答案 1 :(得分:0)
function check(){
$.post('check.php',{
'check':1,
'challenge':$('#recaptcha_challenge_field').val(),
'response':$('#recaptcha_response_field').val()},
function(a){
console.log(a);
});
}
check.php:
if($_POST){
if(isset($_POST['check'])){
$url = 'http://www.google.com/recaptcha/api/verify';
$data = array(
'privatekey'=> "**********************************",
'remoteip' => $_SERVER['REMOTE_ADDR'],
'challenge' => $_POST['challenge'],
'response' => $_POST['response'],
);
$options = array(
'http' => array(
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data),
),
);
echo print_r($data,true);
die(file_get_contents($url, false, stream_context_create($options)));
}
}
警告:您只有一个选择可以检查! (Ref.)