2017-08-24 5 views
1

Je souhaite ajouter reCAPTCHA à mon site hébergé sur SourceForge, mais cela ne fonctionne pas lorsque j'essaie de vérifier la réponse de l'utilisateur dans le backend.Impossible de se connecter au serveur reCAPTCHA en utilisant PHP et cURL

Voici mon code:

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

Le résultat est un entier (7), signifie "cURL ne pouvait pas se connecter".

Quelqu'un pourrait-il m'aider avec ce problème? Merci beaucoup.

+0

Essayez sans certificat et vérifiez l'hôte. Également pas sûr si un problème, mais les champs de publication peuvent avoir besoin d'être tableau au lieu de chaîne. – TheFallen

+0

Ne devrait-il pas être "../../../ GeoTrust.cer" au lieu de "....../GeoTrust.cer"? – Justinas

+0

@Justinas je suppose que c'est juste censuré, il a probablement considéré le chemin confidentiel – hanshenrik

Répondre

0

ni votre secret ni votre réponse n'est urlencoded, donc s'ils contiennent des caractères spéciaux, le serveur recevra les mauvaises données, corrigez-les. De plus, la capacité de reCaptcha à bloquer les spammeurs sera probablement améliorée si vous envoyez aussi l'adresse IP du client, donc, bien que cela ne soit pas nécessaire, je vous suggère d'envoyer l'adresse IP. et au lieu de plusieurs appels à urlencode, vous pouvez donner un tableau à un seul appel http_build_query, qui aboutit souvent à un code plus joli que plusieurs appels urlencode(). essayez ceci:

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

mais cela n'explique pas pourquoi curl_exec échec .. de débogage, ajoutez CURLOPT_VERBOSE = 1 ... puis mettez à jour votre question avec les données VERBOSE

aussi, ne pas ignorer la valeur de retour de curl_setopt, il y avait un problème la définition de vos options, retours curl_setopt bool (false), que vous ignorez .. utilisez quelque chose comme

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)); 
    } 
} 

par exemple, si curl_setopt($ch, CURLOPT_CAINFO, '....../GeoTrust.cer'); échoue, elle renvoie bool (false), et votre curl_exec échoue car il ne peut pas valider le si gnature

+0

Merci, j'ai défini CURLOPT_VERBOSE sur true, mais je n'ai reçu aucune information à ce sujet. Quel est le problème? – NN708

+0

Et il semble que tout curl_setopt() a renvoyé true. – NN708

+0

alors vous ne voyez pas STDERR, seulement STDOUT, parce que CURLOPT_VERBOSE imprime à STDERR par défaut. C'est probablement l'imprimante de vos journaux d'erreur php, cependant. de toute façon, pour rediriger les informations VERBOSE de curl vers stdout/browser, faites 'ecurl_setopt ($ ch, CURLOPT_STDERR, STDOUT);' - puis réessayez. des informations de CURLOPT_VERBOSE maintenant? – hanshenrik