2015-07-11 3 views
10

Что я имею:Curl Recaptcha не работает PHP

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

Что я получил: bool(false) (что означает, что curl_exec() не удалось)

Что я ожидаю: ответ объекта JSON

Пожалуйста, помогите. Благодарю.

ответ

21

Поскольку вы пытаетесь подключиться через SSL, вам необходимо настроить параметры cURL для его обработки. Быстрое исправление, чтобы заставить это работать, если вы добавите curl_setopt($verify, CURLOPT_SSL_VERIFYPEER, false);

Установка CURLOPT_SSL_VERIFYPEER в false сделает это так, чтобы оно принимало любой сертификат, данный ему, а не проверяя их.

<?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

Пожалуйста, удалите SSL_VERIFYPEER = ложную штуковину. Google всегда использует действительный сертификат. –

+0

Это работало для меня более двух лет без дополнительной строки, которую вы предлагаете ('CURLOPT_SSL_VERIFYPEER'), но сегодня я столкнулся с той же проблемой, о которой сообщалось, и, добавив эту строку, проблема исчезла. Так спасибо за это. Но я действительно хотел бы понять, где проблема сейчас? Это мой сервер или этот Google? Какой сертификат сейчас не проверен, какой стороной? – Peter

3

Вот альтернативный метод cURL, который я нашел, если он кому-то помогает. Очевидно, ввод $ secret и $ Ответ переменные передать его правильно. Извините, вопрос задает cURL-решение, но это самый быстрый метод, который я видел, поэтому я думал, что он добавит его в любом случае, потому что я знаю, что это поможет кому-то там. :)

$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 может быть единственным вариантом, если у вас есть allow_url_fopen = 0 в вашей конфигурации PHP. – Palantir

1

Это проще с помощью "file_get_contents" с 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"; 
     }