php
  • curl
  • recaptcha
  • sourceforge
  • 2017-08-24 19 views 1 likes 
    1

    SourceForgeにホストされているWebサイトにreCAPTCHAを追加したいが、バックエンドでユーザの応答を確認しようとするとうまくいかない。PHPとcURLを使用してreCAPTCHAのサーバに接続できない

    はここに私のコードです:結果はintで

    <?php 
    $secret = '****'; 
    $recaptcha_response = $_POST["recaptcha_response"]; 
    $url = 'https://www.google.com/recaptcha/api/siteverify'; 
    $post_data = "secret=".$secret."&response=".$recaptcha_response; 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
    curl_setopt($ch, CURLOPT_CAINFO, '****/GeoTrust.cer'); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); 
    $response_json = curl_exec($ch); 
    if (curl_errno($ch)) { 
        var_dump(curl_errno($ch)); 
    } 
    curl_close($ch); 
    ...... 
    ?> 
    

    (7)、 "カールは接続できませんでした" という意味。

    誰でもこの問題を解決できますか?どうもありがとう。

    +0

    証明書なしでホストを検証してみてください。また、問題があるかどうかはわかりませんが、フィールドの後ろに文字列の代わりに配列が必要な場合があります。 – TheFallen

    +0

    '....../GeoTrust.cer'の代わりに' ../../../ GeoTrust.cer'にするべきではありませんか? – Justinas

    +0

    @Justinas私はそれがちょうど検閲されたと思う、おそらく彼はパス機密と考えた – hanshenrik

    答えて

    0

    あなたの秘密もあなたの応答もurlencodedなので、それらに特殊文字が含まれていると、サーバーは間違ったデータを受信して​​修正します。また、reCaptchaがスパマーをブロックする能力は、クライアントのIPアドレスも送信すると改善されるでしょう。したがって、必須ではありませんが、ipを送信することをお勧めします。 urlencodeへの複数回の呼び出しの代わりに、単一のhttp_build_query呼び出しに配列を渡すことができます。これにより、複数のurlencode()呼び出しよりもきれいなコードになることがよくあります。

    $post_data=http_build_query (array (
         'secret' => '???', 
         'response' => $_POST ['g-recaptcha-response'], 
         'remoteip' => $_SERVER ['REMOTE_ADDR'] 
    )); 
    

    をが、これは無視しない、CURLOPT_VERBOSE = 1 ...その後

    もVERBOSEデータであなたの質問を更新、追加、ことをデバッグする...失敗curl_exec理由を説明していません。これを試しますcurl_setopt($ch, CURLOPT_CAINFO, '....../GeoTrust.cer'); が失敗した場合しますcurl_setoptの戻り値は、あなただけ..例えば

    function ecurl_setopt (/*resource*/$ch , int $option , /*mixed*/ $value){ 
        $ret=curl_setopt($ch,$option,$value); 
        if($ret!==true){ 
         //option should be obvious by stack trace 
         throw new RuntimeException ('curl_setopt() failed. curl_errno: ' . curl_errno ($ch) .'. curl_error: '.curl_error($ch)); 
        } 
    } 
    

    のようなものを使用無視のオプション、しますcurl_setoptを返すブール値(false)を設定し、問題があった場合、それはブール値(falseを返します)、あなたのcurl_execはsiを検証できないので失敗しますgnature

    +0

    ありがとうございます、私はCURLOPT_VERBOSEをtrueに設定しましたが、その情報は得られませんでした。どうしたの? – NN708

    +0

    そして、すべてのcurl_setopt()がtrueを返したようです。 – NN708

    +0

    これは、CURLOPT_VERBOSEがデフォルトでSTDERRに出力されるため、STDERRのみが表示されます(STDOUTのみ)。それはおそらくあなたのPHPエラーログにプリンタです。とにかく、curlのVERBOSE情報をstdout/browserにリダイレクトするには、 'ecurl_setopt($ ch、CURLOPT_STDERR、STDOUT);'を実行してから、もう一度やり直してください。 CURLOPT_VERBOSEの情報は今? – hanshenrik

    関連する問題