web-dev-qa-db-ja.com

NoCaptchaがエラーを無効に返します-json

GoogleのファンキーなReCaptchaNoCaptchaをシンプルなhtml5フォームに統合しました。ローカルホストでは機能していますが、オンラインでテストすると常にエラー「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 )を返します

私はいくつかの助けをグーグルで検索しましたが、本当に役立つものは何も見つかりませんでした。

オンラインとオフラインのコードは同じなので、問題がどこから来ているのか本当にわかりません。 https://developers.google.com/recaptcha/docs/verify エラーコードについては何も述べていません。解決策が単純すぎると思います。

19
tommygun

解決策の鍵は、単にphpエラーをオンにすることでした(私は知っています、それは恥ずかしいことです)。これは私を苦労させ続けるエラーをもたらし、同時に解決策ももたらしました:

PHPは、Googleのhttps検証ページへの接続に問題がありました。これは、php.iniのオプションが1つあるためです:allow_url_fopen

php.netの説明:

allow_url_fopen boolean

このオプションは、ファイルのようなURLオブジェクトへのアクセスを可能にするURL対応のfopenラッパーを有効にします。 ftpまたはhttpプロトコルを使用してリモートファイルにアクセスするためのデフォルトのラッパーが提供されています。zlibなどの一部の拡張機能は、追加のラッパーを登録する場合があります。

その値を0から1に変更すると、問題が解決しました。開発時にphpエラーをオンにすることがいかに重要かをさらに示します(私はphpプログラミングの初心者です)

これが誰かの助けになることを願っています!

7
tommygun

同じ問題が発生し、POSTの代わりにリクエストメソッドとしてcURLを使用して修正しました。

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

これは私のためにそれを解決しました:

//$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());
2
Jahid
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());
0
Flavio Salas

ReCAPTCHA PHPクライアントライブラリ<1.2.4、SocketPostリクエストメソッドを使用している場合は、≤1.2.4に更新する必要があります。または、Googleサーバーの応答が変更されたため、CurlPostに切り替える必要があります。 https://github.com/google/recaptcha/issues/359

0
yenshirak

//呼び出しを行って応答を確認し、ユーザーのIPアドレスも渡します

  $resp = $recaptcha->verify($recaptcha_response, $this->CI->input->ip_address());
0
Umar Adil

応答はjsonオブジェクトです。最初にデコードする必要があります。私はWebプログラミング/開発にかなり慣れていませんが、今のところ何もしないasp.netテストサイトにgoogle recaptchaを正常に統合しましたが、json応答を希望どおりに処理すると確信しています。

別のものを見つけました、 this 助けてください。

0
panda.o24