2017-10-10 156 views
1

我在PHP中使用Curl将API集成到我的网站中。我将检索访问令牌并使用它来处理供应商的订单。RESTful API - 调用并使用令牌处理订单

获取令牌:

function getToken() { 
// authenticate and return $token 
$ch = curl_init(); 

$api_token = $this->config['API']; 
$ninjavan_id = $this->config['ID']; 
$ninjavan_secret = $this->config['SECRET']; 

curl_setopt($ch, CURLOPT_URL, $api_token); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($ch, CURLOPT_HEADER, FALSE); 

curl_setopt($ch, CURLOPT_POST, TRUE); 

curl_setopt($ch, CURLOPT_POSTFIELDS, "{ 
    \"client_id\": \"$id\", 
    \"client_secret\": \"$secret\", 
    \"grant_type\": \"client_credentials\" 
}"); 

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Content-Type: application/json", 
    "Accept: application/json" 
)); 

$response = curl_exec($ch); 
curl_close($ch); 

$json = json_decode($response, true); 
$file = 'key.txt'; 
$token = $json['access_token']; 

file_put_contents('./modules/custommodule/key.txt', $token, LOCK_EX); 
} 

我能够成功地检索令牌,我已经测试代码。接下来将使用该令牌。

处理订单:

$file = './modules/custommodule/key.txt'; 
$retrieved_token = file_get_contents($file); 

do { 
$retry = false; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $api_order); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($ch, CURLOPT_HEADER, FALSE); 
curl_setopt($ch, CURLOPT_POST, TRUE); 

curl_setopt($ch, CURLOPT_POSTFIELDS, "{ 
//curl execution 
}"); 

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Content-Type: application/json", 
    "Accept: application/json", 
    "Authorization: Bearer $retrieved_token" 
)); 

$response = curl_exec($ch); 
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

if ($httpcode === 401) { // unauthorized 
    getToken(); 
    $retry = true; 
    } 
} 
while ($retry); 
curl_close($ch); 

file_put_contents('./modules/custommodule/response.txt', $response, LOCK_EX); 
file_put_contents('./modules/custommodule/results.txt', $httpcode, LOCK_EX); 

任何援助不胜感激。如果你能指出刷新令牌的指导,那将是完美的。

谢谢。

+1

而不是直接输入你的json POST字段,你应该使用带'json_encode()'函数的数组清除你的代码! – Odyssey1111

回答

0

简单,使用字符串变量插值:

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Content-Type: application/json", 
    "Accept: application/json", 
    "Authorization: Bearer {$token}" 
)); 

至于处理刷新令牌,你应该每次调用,如果有,因为一个过期的令牌是一个错误远程API之后检查,而在这种情况下,得到一个新的令牌并重试该呼叫。如果你为远程API创建了某种代理,这个效果最好,所以这个机制对调用代码来说是透明的。以下是你可能会怎么做这是一个非常原始的例子:

var $token; 

function getToken() { 
    // authenticate and return $token as you did before 
} 

function callAnApiMethod($param1, $param2) { 
    global $token; 
    do { 
     $retry = false; 
     $ch = curl_init(); 
     // ... 
     // more setup things, using params of the function, etc. 
     // ... 
     curl_setopt($ch, CURLOPT_HTTPHEADER, array(
      "Content-Type: application/json", 
      "Accept: application/json", 
      "Authorization: Bearer {$token}" 
     )); 

     $res = curl_exec($ch); 
     $info = curl_getinfo($ch); 
     if ($info['http_code'] === 401) { // unauthorized 
      $token = getToken(); 
      $retry = true; 
     } 
    } while ($retry); 
    return json_decode($res); 
} 

老实说,我绝不会再经历使用curl,如果我试图消耗的API的巨大麻烦,袅袅是出奇的笨拙和冗长。我会用Guzzle之类的东西。


此外,作为@ Odyssey1111指出的那样,你可以使用数组符号来代表你的JSON,然后使用json_encode得到一个字符串:

$payload = [ 
    'field' => 'value', 
    'arrayField' => [ 
     'subfield' => 'subfieldValue', 
    ] 
]; 
$jsonStr = json_encode($payload); 

这使你的代码更容易阅读和维护。

+0

访问令牌和订单指向不同的URL。我正在寻找一种方法将这两个过程合并成一个php文件。 – Enthu

+0

你可以,你只需要使用函数......基本上你可以将你的*取回代码*代码放在'getToken'函数中,但只要确保你不用'echo $ token'就可以返回$ token'。 –

+0

感谢您的提示,我将按照提议的功能加以解决。让我今晚试试并更新结果。谢谢! – Enthu