ノラプログラマーの技術メモ

ネットで調べても出てこなかった情報を載せていきたい技術系ブログ。

Yahoo!ショッピングAPIのサンプルを書いた(プロフェッショナル出店ストア向けAPI)

概要

Yahoo!ショッピングに出店しているが、調べても欲しい機能がなかったので自分で作ることにした。

Yahoo!ショッピングの注文情報を取得するためには、Yahoo!ショッピングAPIを利用せよとのこと。

Yahoo!ショッピングAPIとは、プロフェッショナル出店のストアと連携したアプリケーションを開発するための定型プログラム群なのである。(利用は無料)

詳しくは下記のサイトへどうぞ。
developer-ec.yahoo.co.jp

前提条件

Yahoo!ショッピングAPIを利用するにあたり、次の条件を満たしている必要がある。

  • プロフェッショナル出店していること
  • アプリケーションIDを取得していること ⇒ まだならコチラから取得
  • 注文APIの利用を申請していること ⇒ まだならコチラから申請

ちなみに今回は、サーバーサイド(Yahoo! ID連携 v1)アプリケーションをPHPで開発していくことにした。

注文APIを利用申請すると、Yahoo!ショッピングテクニカルサポートから次のようなメールが届く。

f:id:kawai_norimitsu:20171025163141p:plain

赤字で囲っている部分のアプリケーションIDとサーバーのIPアドレスが一致してないと、当然プログラムは動かずエラーになるので注意!

また注文検索APIは扱う情報のセキュリティの観点から、アクセストークンが短くなっているとのことだ。

■注文APIの諸注意

注文API http://developer.yahoo.co.jp/webapi/shopping/order/

orderList, orderInfo, orderChangeの3点のAPIにつきましては、扱う情報のセキュリティの観点から他のAPIとは異なり、トークン取得からユーザが再認可をしてトークンの更新を必要とする期間が短くなっており、最大12時間となりますのでご注意ください。

orderList: http://developer.yahoo.co.jp/webapi/shopping/orderList.html
orderInfo http://developer.yahoo.co.jp/webapi/shopping/orderInfo.html
orderChange http://developer.yahoo.co.jp/webapi/shopping/orderChange.html

上記の3点のAPIに対して、ご申請のアプリケーションIDには最大時間の12時間で設定しておりますのでご了承下さい。

なおYahoo!ID連携では、ウェブAPIアクセスにおいてOAuth2.0をサポートしているとのこと。

初期設定

Yahoo!デベロッパーネットワークにアクセスして、[アプリケーションの管理]から該当する[アプリケーションの詳細]を開く。

次の設定を確認しておく。

(1)アプリケーションID
(2)シークレット
(3)コールバックURL
(4)ストア向け操作関連の機能(開示先限定スコープ)

f:id:kawai_norimitsu:20171025165539j:plain

今回のプログラムでは、「index.php(転送) ⇒ OAuth2.0(認証) ⇒ callback.php(処理)」と遷移するため、最終的に処理を行うcallback.phpのURLアドレスをコールバックURLに設定しておく。

またストア向け操作関連の機能(開示先限定スコープ)にチェックが入っていないと、プロフェッショナル出店のストアと連携できないので注意。

サンプルプログラム

Yahoo!ショッピングAPIを利用するには、ライブラリを使ったりJavaScriptを使ったりする方法があるけど、一番シンプルに必要最低限のコードをPHPで組むことにした。

まずは「index.php」のサンプル。アプリケーションIDとコールバックURLをYahoo!デベロッパーネットワークの設定に書き換えること。

<?php
  $app_id = "<ここにあなたのアプリケーションID>";			// アプリケーションID(1)
  $redirect_uri = "http://hoge.com/yahoo/callback.php";		// コールバックURL(3)

  $url = "https://auth.login.yahoo.co.jp/yconnect/v1/authorization";
  $nonce = substr(str_shuffle('1234567890abcdefghijklmnopqrstuvwxyz'), 0, 10);

  $data = http_build_query(
  array('response_type' => 'code id_token',
    'client_id' => $app_id,
    'nonce' => $nonce,
    'redirect_uri' => $redirect_uri
    )
  );
  header('location: ' . $url.'?'.$data);
  exit;
?>

次に「callback.php」のサンプル。アプリケーションIDとシークレット、コールバックURLをYahoo!デベロッパーネットワークの設定に書き換えること。

ストアアカウントは、あなたが出店しているYahoo!ストアURLの○○部分。
例)https://store.shopping.yahoo.co.jp/○○/

<?php
  // ------------------------------------------------ 初期設定
  $applicationId = "<ここにあなたのアプリケーションID>";		// アプリケーションID(1)
  $secret = "<ここにあなたのシークレット>";						// シークレット(2)
  $redirect_uri = "http://hoge.com/yahoo/callback.php";			// コールバックURL(3)
  $sellerId = "<ここにあなたのストアアカウント>";				// ストアアカウント

  // ------------------------------------------------ アクセストークン取得
  $basicAuth = base64_encode($applicationId . ':' . $secret);
  $header = array(
    "Authorization: Basic " . $basicAuth,
    "Content-Type: application/x-www-form-urlencoded;charset=UTF-8",
  );
  $post_data = array(
    'grant_type' => 'authorization_code',
    'code' => $_GET['code'],
    'redirect_uri' => $redirect_uri,
  );

  $url = "https://auth.login.yahoo.co.jp/yconnect/v1/token";
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
  $json = curl_exec($ch);
  curl_close($ch);
  $data = json_decode($json, true);
  $access_token = $data["access_token"];

  // ------------------------------------------------ 注文情報取得
  $header = array(
    'Authorization: Bearer ' . $access_token,
    "Content-Type: application/x-www-form-urlencoded;charset=UTF-8",
  );
  $post_xml = "<Req>
  <SellerId>{$sellerId}</SellerId>
  <Search>
  <Field>OrderId,BillFirstName</Field>
  <Result>100</Result>
  <Sort>+order_time</Sort>
  <Condition>
  <OrderTimeFrom>20171001000000</OrderTimeFrom>
  <OrderTimeTo>20171031000000</OrderTimeTo>
  </Condition>
  </Search>
  </Req>";

  $url = "https://circus.shopping.yahooapis.jp/ShoppingWebService/V1/orderList";
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $post_xml);
  $xml = curl_exec($ch);
  curl_close($ch);
  $data = simplexml_load_string($xml, NULL, LIBXML_NOCDATA);
  $data = json_decode(json_encode($data), true);

  var_dump($data);
?>

callback.phpは、2017年10月1日から2017年10月31日までの注文情報(オーダーIDと名前)を取得する処理をしている。

検索条件や取得したい情報を変えたい場合は、変数$post_xmlXML情報を適宜修正する。

エラーが起こるケース

もしうまくいかない場合は、次のことを確認する。

  • 注文APIの利用を申請し、許可されているか?
  • コールバックURLの設定は正しいか?
  • リクエストパラメータは正しいか?
  • ローカルで実行していないか?
  • サーバーのIPアドレスは正しいか?

あとはAPIドキュメントを読めば何とかなるはず。。

ショッピング:注文に関するAPI - Yahoo!デベロッパーネットワーク

お疲れ様でした!