使用cURL和PHP来调用Wrike API

时间:2016-02-16 22:51:01

标签: php curl

这可以在控制台中运行,但是当我在PHP中尝试不起作用时

$cURL = "curl -X POST -d 'client_id=".$CLIENT_ID."&client_secret=".$CLIENT_SECRET."&grant_type=authorization_code&code=".$CODE."' https://www.wrike.com/oauth2/token";

代码PHP。

$postData = array("client_id" => $CLIENT_ID, 
            "client_secret" => $CLIENT_SECRET, 
            "grant_type" => "authorization_code",
            "code" => $CODE);

$handler = curl_init();  
curl_setopt($handler, CURLOPT_URL, $url);  
curl_setopt($handler, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($handler, CURLOPT_POST, sizeof($postData));  
curl_setopt($handler, CURLOPT_POSTFIELDS, $postData);  
$response = curl_exec ($handler);  
curl_close($handler);

当我运行此代码时,结果是"资源ID#2",我期望的结果是这个

{
   "access_token": "2YotnFZFEjr1zCsicMWpAA",
   "refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA",
   "token_type": "bearer",
   "expires_in": 3600
}
控制台中的

工作正常,但是当我尝试使用PHP时,

3 个答案:

答案 0 :(得分:0)

我建议使用https://github.com/rmccue/Requests,这会让您的生活更轻松。您的代码将是:

        $postData = array("client_id" => $CLIENT_ID, 
            "client_secret" => $CLIENT_SECRET, 
            "grant_type" => "authorization_code",
            "code" => $CODE);
        $headers = array('Content-Type' => 'application/json');  // assuming you post JSON
        $response = Requests::post($$url, $headers, json_encode($obj));
        if ($response->status_code !== 200) {
             // handle OK
        } else {
             // handle ERROR
        }

Requests库还处理PHP中没有curl的情况;将在一个对象中返回完整的标题,正文,cookie等。

答案 1 :(得分:0)

一些事情(一些评论者已经注意到):

  • CURLOPT_POST应设置为1而不是数据大小
  • 如果您看到Resource id #2,则可能会从$handler而不是$result测试结果。
  • 虽然可能没有必要,但您可以在发送前对数据使用http_build_query以确保编码正确
  • 使用curl_errno
  • 检查卷曲错误总是值得的

一个完整的例子:

$postData = array("client_id" => $CLIENT_ID, 
            "client_secret" => $CLIENT_SECRET, 
            "grant_type" => "authorization_code",
            "code" => $CODE);

$handler = curl_init();

curl_setopt($handler, CURLOPT_URL, $url);
curl_setopt($handler, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($handler, CURLOPT_POSTFIELDS, http_build_query($postData));
curl_setopt($handler, CURLOPT_POST, 1);

$response = curl_exec($handler);
if (curl_errno($handler)) {
    echo 'Error:' . curl_error($handler);
}
curl_close ($handler);

var_dump($response);

旁注,curl-to-PHP是一个方便将curl命令转换为PHP的工具。

答案 2 :(得分:0)

更新所有感兴趣的人。我最近在thephpleague的库中添加了一个工作包,允许你连接Wrike Api:

https://github.com/michaelKaefer/oauth2-wrike

(解决这个问题的另一个问题可能是PHP的SSL配置,例如:PHP cURL Not Working with HTTPS