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 エラーコードについては何も述べていません。解決策が単純すぎると思います。
解決策の鍵は、単に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プログラミングの初心者です)
これが誰かの助けになることを願っています!
同じ問題が発生し、POSTの代わりにリクエストメソッドとしてcURLを使用して修正しました。
$recaptcha = new \ReCaptcha\ReCaptcha($secret, new \ReCaptcha\RequestMethod\CurlPost());
これは私のためにそれを解決しました:
//$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());
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());
ReCAPTCHA PHPクライアントライブラリ<1.2.4、SocketPost
リクエストメソッドを使用している場合は、≤1.2.4に更新する必要があります。または、Googleサーバーの応答が変更されたため、CurlPost
に切り替える必要があります。 https://github.com/google/recaptcha/issues/359
//呼び出しを行って応答を確認し、ユーザーのIPアドレスも渡します
$resp = $recaptcha->verify($recaptcha_response, $this->CI->input->ip_address());
応答はjsonオブジェクトです。最初にデコードする必要があります。私はWebプログラミング/開発にかなり慣れていませんが、今のところ何もしないasp.netテストサイトにgoogle recaptchaを正常に統合しましたが、json応答を希望どおりに処理すると確信しています。
別のものを見つけました、 this 助けてください。