質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.99%

YahooショッピングAPIで、アクセストークンが取得できません。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 913

topgunmars

score 7

PHPでYahooショッピングと連携するシステムを実現しようと考えています。

Yahooショッピングには、WebAPIがあり、ほかのシステムと連携できるようです。

YahooAPIを利用する際に必要なアクセストークンを取得する機能を実装中に以下のエラーメッセージが発生し、アクセストークンを取得できません。

発生している問題・エラーメッセージ

HTTP/1.1 400 Bad Request 
    :
error:invalid_request, error_description: the parameter is invalid. [client_id], error_code: 102

該当のソースコード

<?php

$code = $_GET['code'];
$state = $_GET['state'];

if (!empty($code)) {
    echo 'code = ' . $code . "\n";

    getAccessToken($code);
}

exit();


function getAccessToken($code) {

    $applicationId = <アクセストークン>;
    $secret = <シークレット>;

    $basicAuth = base64_encode($applicationId . ':' . $secret);

    $header = [
      "Authorization: Basic " . $basicAuth
    ];

    $url = "https://auth.login.yahoo.co.jp/yconnect/v1/token";

    $postData = [
        'grant_type' => 'authorization_code',
        'code' => $code,
        'client_id' => $applicationId,
        'redirect_uri' => <リダイレクトURL>
    ];

    // echo http_build_query($postData);

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_POST,           true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

    $response = curl_exec($ch);

    if(curl_error($ch)){
      $response = curl_error($ch);
    }

    $httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    curl_close($ch);

    echo $response;
}

試したこと

AuthorizationヘッダをCURLのものに変更しようとして、以下のようにオプションを追加してもだめでした。

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, $applicationId . ":" . $secret);


POSTデータをhttp_build_queryしてもだめでした。

curl_setopt($ch, CURLOPT_POSTFIELDS,     http_build_query($postData));

補足情報(FW/ツールのバージョンなど)

YahooのAPIはv1で、PHPのバージョンは、7.2です。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

error:invalid_request, error_description: the parameter is invalid. [client_id], error_code: 102

パラメータが無効と言われていますね。


アクセストークンの取得について(v1) のサンプルと比べるといくつか異なる点がありますので、サンプルに合わせて修正するとどうなるでしょうか?

Yahoo のサンプルでは、

     'Content-Type: application/x-www-form-urlencoded',

を指定している。

    $postData = [
       'grant_type' => 'authorization_code',
       'code' => $code,
       'client_id' => $applicationId,
       'redirect_uri' => <リダイレクトURL>
   ];

Yahoo のサンプルでは、'client_id' を指定していない。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/10 14:35

    client_idをなしにすると、エラーなくアクセストークンが取得できました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる