2015-07-11 35 views
10

Quello che ho:cURL Recaptcha non PHP lavorare

$data = array(
      'secret' => "my-app-secret", 
      'response' => "the-response" 
     ); 

$verify = curl_init(); 
curl_setopt($verify, CURLOPT_URL, "https://www.google.com/recaptcha/api/siteverify"); 
curl_setopt($verify, CURLOPT_POST, true); 
curl_setopt($verify, CURLOPT_POSTFIELDS, http_build_query($data)); 
curl_setopt($verify, CURLOPT_RETURNTRANSFER, true); 
$response = curl_exec($verify); 

var_dump($response); 

Quello che ho ottenuto: bool(false) (il che significa che la curl_exec() fallito)

Cosa mi aspetto: una risposta oggetto JSON

Per favore aiuto. Grazie.

risposta

21

Poiché si sta tentando di connettersi tramite SSL, è necessario regolare le opzioni di cURL per gestirlo. Una soluzione rapida per farlo funzionare è se si aggiunge curl_setopt($verify, CURLOPT_SSL_VERIFYPEER, false);

L'impostazione CURLOPT_SSL_VERIFYPEER su falso farà in modo che accetti qualsiasi certificato fornito ad esso anziché verificarli.

<?php 

$data = array(
      'secret' => "my-secret", 
      'response' => "my-response" 
     ); 

$verify = curl_init(); 
curl_setopt($verify, CURLOPT_URL, "https://www.google.com/recaptcha/api/siteverify"); 
curl_setopt($verify, CURLOPT_POST, true); 
curl_setopt($verify, CURLOPT_POSTFIELDS, http_build_query($data)); 
curl_setopt($verify, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($verify, CURLOPT_RETURNTRANSFER, true); 
$response = curl_exec($verify); 

var_dump($response); 
+2

rimuovere la SSL_VERIFYPEER = false thingy. Google utilizza sempre un certificato valido. –

+0

Ha funzionato per me per oltre 2 anni, senza la riga aggiuntiva che hai proposto ('CURLOPT_SSL_VERIFYPEER') ma oggi mi trovavo ad affrontare lo stesso problema riportato e aggiungendo questa riga il problema è andato via. Quindi grazie per quello. Ma mi piacerebbe davvero capire dove si trova ora il problema? È questo il mio server o è questo Google? Quale certificato non è stato verificato ora, da quale parte? – Peter

3

Ecco un metodo alternativo per cURL che ho trovato se aiuta qualcuno. Ovviamente immettere $ segreto e $ risposta variabili per passarlo correttamente. Scusa, la domanda è chiedere una soluzione in arricciatura, ma questo è il metodo più veloce che ho visto, quindi ho pensato che lo aggiungerebbe comunque perché so che aiuterà qualcuno là fuori. :)

$response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secret."&response=".$response); 
$response = json_decode($response, true); 
if($response["success"] === true){ 
    // actions if successful 
}else{ 
    // actions if failed 
} 
+1

cURL potrebbe essere l'unica opzione se si ha allow_url_fopen = 0 nella configurazione di PHP. – Palantir

1

E 'più facile l'utilizzo di "file_get_contents" con POST:

$postdata = http_build_query(
      array(
       'secret' => [YOUR_SECRET_KEY], 
       'response' => $_POST["g-recaptcha-response"] 
      ) 
     ); 

     $opts = array('http' => 
      array(
       'method' => 'POST', 
       'header' => 'Content-type: application/x-www-form-urlencoded', 
       'content' => $postdata 
      ) 
     ); 

     $context = stream_context_create($opts); 

     $result = file_get_contents('https://www.google.com/recaptcha/api/siteverify', false, $context); 

     $check = json_decode($result); 

     if($check->success) { 
      echo "validate"; 
     } else { 
      echo "wrong recaptcha"; 
     }