2015-03-02 49 views
4

我正在尝试将这个Recaptcha请求实现到我的注册表单中,但它不起作用。当我在我的网站上成功验证Recaptcha时,cURL/JSON请求返回nullRecaptcha请求正在返回空

我试着用var_dump"error-codes":从JSON请求,它只返回null;而在this document中则显示它显然意味着要在JSON请求中输出两个项目。

在此先感谢,我没有用JSON/cURL做很多工作,所以对我来说很简单。

这里是我的代码:

PHP

<?php 

    if($_SERVER["REQUEST_METHOD"] == "POST") { 
     $recaptcha = $_POST['g-recaptcha-response']; 
     if(!empty($recaptcha)) { 

      function getCurlData($url) { 
       $curl = curl_init(); 
       curl_setopt($curl, CURLOPT_URL, $url); 
       curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
       curl_setopt($curl, CURLOPT_TIMEOUT, 10); 
       curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16"); 
       $curlData = curl_exec($curl); 
       curl_close($curl); 
       return $curlData; 
      } 

      $google_url = "https://www.google.com/recaptcha/api/siteverify"; 
      $secret = 'You will never know >:D'; 
      $ip = $_SERVER['REMOTE_ADDR']; 
      $url = $google_url . "?secret=" . $secret . "&response=" . $recaptcha . "&remoteip=" . $ip; 
      $res = getCurlData($url); 
      $res = json_decode($res, true); 

      // var_dumping returns null 
      var_dump($res); 

      //reCaptcha success check 
      if($res['success'] == true) { 
       echo "Recaptcha was successfully validated"; 
      } else { 
       echo "Recaptcha was not validated, please try again"; 
      } 
     } else { 
      echo "You didn't validate the Recaptcha"; 
     } 
    } 
?> 

HTML

<form action="home.php" method="post"> 
    <div class="g-recaptcha" data-sitekey="I removed it for this post"></div> 
    <input class="btn btn-primary" type="submit" name="submit" value="SIGN UP" /> 
</form> 

回答

0

阿比说:方法:POST,你发送 “GET” 请求。 检查CURLOPT_POSThttp://php.net/manual/en/function.curl-setopt.php

编辑CURLOPT_POSTFIELDS选项: 我刚才检查的API,它找到工作了。我在代码中看不到任何错误。你可以临时改变你的函数:

function getCurlData($url) { 
     $curl = curl_init(); 
     curl_setopt($curl, CURLOPT_URL, $url); 
     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($curl, CURLOPT_TIMEOUT, 10); 
     curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16"); 
     $curlData = curl_exec($curl); 

     if (!$curlData) { 
      throw new \Exception('Curl error: ' . curl_error($curl)); 
     } 
     curl_close($curl); 


     return $curlData; 
    } 
+0

它说我在使用GET请求?我什么时候可以实现'CURLOPT_POSTFIELDS',我不熟悉这个,所以我不知道该怎么做。 – mightyspaj3 2015-03-02 08:15:37

+0

默认请求是''GET'',您不指定请求类型=>您正在进行GET请求。检查**文档**和**示例**,至少有3种方式指定POST字段。 – 2015-03-02 08:24:47

+0

如果你看我的代码,我有POST指定,我没有看到我做错了什么。你能否详细说明一下? – mightyspaj3 2015-03-02 09:18:36

6

这里运行我的代码没有问题:

客户端:

​​3210

服务器端:

if (isset($_POST['g-recaptcha-response'])) { 
    $captcha = $_POST['g-recaptcha-response']; 
    $privatekey = "SECRET_KEY"; 
    $url = 'https://www.google.com/recaptcha/api/siteverify'; 
    $data = array(
     'secret' => $privatekey, 
     'response' => $captcha, 
     'remoteip' => $_SERVER['REMOTE_ADDR'] 
    ); 

    $curlConfig = array(
     CURLOPT_URL => $url, 
     CURLOPT_POST => true, 
     CURLOPT_RETURNTRANSFER => true, 
     CURLOPT_POSTFIELDS => $data 
    ); 

    $ch = curl_init(); 
    curl_setopt_array($ch, $curlConfig); 
    $response = curl_exec($ch); 
    curl_close($ch); 
} 

$jsonResponse = json_decode($response); 

if ($jsonResponse->success === true) { 
    doSomething(); 
} 
else { 
    doSomeOtherThing(); 
} 

工作here! :)

+0

'成功'必须为布尔型。 – Ali 2016-11-26 23:17:04

+1

@Ali正确!编辑。 – Ismaestro 2016-11-28 12:43:21