NoCaptcha返回错误invalid-json

时间:2015-05-07 16:23:02

标签: php json recaptcha

我将Googles funky ReCaptcha NoCaptcha整合到一个简单的html5表单中。 在localhost上它正在工作,但在线测试它总是返回错误'invalid-json'。这是我的代码的一部分:

$secret = 'TEHSEHCRET';
$recaptcha = new \ReCaptcha\ReCaptcha($secret);
$resp = $recaptcha->verify($_POST['g-recaptcha-response'], $_SERVER['REMOTE_ADDR']);
if ($resp->isSuccess()) {
// do some
}
else {
print_r($errors = $resp->getErrorCodes());
}

返回Array ( [0] => invalid-json )

我用Google搜索了一些帮助,但没有发现任何真正有用的信息。

由于代码在线和离线是相同的,我真的无能为力。问题来自哪里。 https://developers.google.com/recaptcha/docs/verify对错误代码一无所知。猜猜解决方案太简单了。

8 个答案:

答案 0 :(得分:47)

I had the same issue and fixed it by using cURL as request method instead POST.

$recaptcha = new \ReCaptcha\ReCaptcha($secret, new \ReCaptcha\RequestMethod\CurlPost());

答案 1 :(得分:7)

解决方案的关键是简单地打开php错误(我知道,这很令人尴尬)。这导致了让我苦苦挣扎的错误,并同时提供了解决方案:

PHP在连接到谷歌的https验证页面时遇到问题。这只是因为php.ini中的一个选项:allow_url_fopen

php.net说明:

  

allow_url_fopen boolean

     

此选项启用支持URL的fopen包装器以启用访问   URL对象,如文件。为访问提供了默认包装器   使用ftp或http协议的远程文件,像zlib这样的扩展   可以注册其他包装。

将其值从0更改为1解决了我的问题。显示开发时打开php错误的重要性(我是php编程的超级菜鸟)

希望这能帮助某人一些时间!

答案 2 :(得分:2)

这解决了我:

//$recaptcha = new \ReCaptcha\ReCaptcha($secret);

// If file_get_contents() is locked down on your PHP installation to disallow
// its use with URLs, then you can use the alternative request method instead.
// This makes use of fsockopen() instead.
$recaptcha = new \ReCaptcha\ReCaptcha($secret, new \ReCaptcha\RequestMethod\SocketPost());

答案 3 :(得分:2)

如果您使用带有SocketPost请求方法的reCAPTCHA PHP客户端库<1.2.4,则需要更新到≥1.2.4或应切换到CurlPost,因为Google服务器响应已更改:https://github.com/google/recaptcha/issues/359

答案 4 :(得分:2)

我遇到了同样的问题。我通过将“ SocketPost”替换为“ CurlPost”来解决此问题。

已替换

$recaptcha = new \ReCaptcha\ReCaptcha(SECRET_KEY, new \ReCaptcha\RequestMethod\SocketPost());

使用

$recaptcha = new \ReCaptcha\ReCaptcha(SECRET_KEY, new \ReCaptcha\RequestMethod\CurlPost());

答案 5 :(得分:0)

响应是一个json对象。它应该先解码。我是网络编程/开发的新手,但我成功地在一个asp.net测试网站上集成了google recaptcha,它现在什么都不做,但是我确定它只是以我想要的方式处理json响应。

找到另一个,可以this帮助。

答案 6 :(得分:0)

//拨打电话以验证响应并传递用户的IP地址

c:\Program Files\Google\Chrome\Application>chrome.exe --disable-web-security --user-data-dir="D:\chrome"

答案 7 :(得分:0)

use ReCaptcha\ReCaptcha;
use ReCaptcha\RequestMethod;
use ReCaptcha\RequestParameters;
use ReCaptcha\RequestMethod\CurlPost;

class NotSSLCurl extends CurlPost implements RequestMethod
{
    public function __construct()
    {
        $this->curl = curl_init(self::SITE_VERIFY_URL);
        curl_setopt($this->curl, CURLINFO_HEADER_OUT, 0);
        curl_setopt($this->curl, CURLOPT_HEADER, 0);
        curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($this->curl, CURLOPT_BINARYTRANSFER,1);
        curl_setopt($this->curl, CURLOPT_TIMEOUT, 9999);
        curl_setopt($this->curl, CURLOPT_USERAGENT, 'Mozilla/5.0');
        curl_setopt($this->curl, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($this->curl, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($this->curl, CURLOPT_POST , 1);
        curl_setopt($this->curl, CURLOPT_HTTPHEADER , array('Content-Type: application/x-www-form-urlencoded'));
    }

    public function submit(RequestParameters $params)
    {
        curl_setopt($this->curl, CURLOPT_POSTFIELDS , $params->toQueryString());
        return curl_exec($this->curl);
    }

    public function __destruct()
    {
        curl_close($this->curl);
    }
}

// example validation:
$recaptcha = new ReCaptcha('CLIENT_SECRECT', new NotSSLCurl());
$resp      = $recaptcha->verify(@$_POST['g-recaptcha-response'],$_SERVER['REMOTE_ADDR']);
var_dump($resp->isSuccess());