2017-08-24 58 views
1

我想驗證碼添加到我的網站託管在SourceForge上,但它只是當我嘗試驗證用戶在後臺響應不起作用。無法連接到的reCAPTCHA服務器使用PHP和捲曲

這裏是我的代碼:

<?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); 
...... 
?> 

結果是INT(7),意思是 「捲曲無法連接」。

有誰能幫我解決這個問題呢?非常感謝。

+0

嘗試沒有證書,並驗證主機。也不知道是否有問題,但後字段可能需要數組而不是字符串。 – TheFallen

+0

不應該是'../../../ GeoTrust.cer'而不是'....../GeoTrust.cer'嗎? – Justinas

+0

@Justinas我想這只是審查,他可能考慮的路徑機密 – hanshenrik

回答

0

既不是你的祕密,也沒有你的反應是url編碼,所以如果他們包含任何特殊字符,服務器將接收到錯誤的數據,解決這個問題。此外,如果您發送客戶的IP地址,reCaptcha阻止垃圾郵件的能力可能會得到改善,所以,雖然不是必需的,但我建議您發送IP。而不是多次調用urlencode,你可以給一個數組給一個單一的http_build_query調用,這通常會導致比多個urlencode()調用更漂亮的代碼。試試這個:

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

,但這並不能解釋爲什麼curl_exec失敗。要調試,添加CURLOPT_VERBOSE = 1 ......再與冗長的數據

也更新了你的問題,不要忽視curl_setopt的返回值,如果有一個問題設置你的選擇,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($ch, CURLOPT_CAINFO, '....../GeoTrust.cer'); 失敗,則返回布爾(假),並且您的curl_exec失敗,因爲它無法驗證si gnature

+0

謝謝,我已將CURLOPT_VERBOSE設置爲true,但沒有從中獲得任何信息。有什麼問題? – NN708

+0

似乎所有的curl_setopt()都返回true。 – NN708

+0

然後你沒有看到STDERR,只有STDOUT,因爲CURLOPT_VERBOSE默認打印到STDERR。它可能是打印到您的PHP錯誤日誌,但。反正捲曲的VERBOSE信息重定向到標準輸出/瀏覽器,做'ecurl_setopt($ CH,CURLOPT_STDERR,STDOUT);' - 然後再試一次。現在有來自CURLOPT_VERBOSE的任何信息? – hanshenrik