2017-10-10 12 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); 
} 

正直なところ、私は再び、私はAPIを消費しようとしていた場合はCURLを使用しての巨大なトラブルを経ることはない、CURLはめちゃくちゃ不格好と冗長です。私はGuzzleのようなものを使用します。


Odyssey1111が指摘@としても、あなたはJSONを代表して、文字列を取得するためにjson_encodeを使用するように配列表記を使用することができます。

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

これは読んで維持するためにあなたのコードがはるかに容易になります。

+0

forアクセス​​トークンと注文が異なるURLを指しています。私は1つのPHPファイルにこれらの2つのプロセスをマージする方法を探しています。 – Enthu

+0

あなたは関数を使う必要があります。基本的には、getToken関数にトークン*コードを取得しますが、 'return $ token'の代わりに' echo $ token'の代わりに使用してください。 –

+0

あなたのヒントをありがとう、私はそれが提案された機能でそれを得るでしょう。今夜試してみて、結果を更新しましょう。ありがとう! – Enthu

関連する問題