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

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

Amazon MWS、注文管理APIのPHPサンプルを書いてみた

Amazon MWSとは

Amazon MWSとは、Amazonが提供するマーケットプレイス向けAPI群のことで、APIを利用すると商品管理や注文管理を自動化できるアプリケーションが作れるようになる。

MWSの利用は無料だが、大口出品者しか利用できない。またAPIの利用回数に制限がある(スロットリング)。利用回数が上限に達した場合、時間を置くことで再び使用できるようになる。

MWSの登録方法

  1. Amazonにログインしてユーザー権限ページを開き、Amazon出品用アカウントの管理者としてログインする。
  2. 開発者を承認ボタンをクリックする。
  3. 開発者の名前テキストボックスに、承認するアプリケーション開発者の名前を入力する。
  4. 開発者IDテキストボックスに開発者IDを入力し、開発者を承認をクリックする。
  5. MWS認証トークンが表示できることを確認する。

f:id:kawai_norimitsu:20180204100554j:plain

f:id:kawai_norimitsu:20180204100602j:plain

PHPサンプル

AmazonMWSはJavaC#PHPでアプリケーションが作成されることを想定しているらしく、PHPのクライアントライブラリも存在する。

しかし今回はライブラリを使用せず、必要最低限のシンプルなソースコードを書くことにした。

PHPプログラムのサンプルは次の通り。

<?php
  // ----------------------------------------------------- パラメータ設定
  $MWSAuthToken = "<ここにあなたの秘密キー>";  // (3)秘密キー

  $params = array();
  $params['AWSAccessKeyId'] = "<ここにあなたのAWSアクセスキーID>";  // (2)AWSアクセスキーID
  $params['SellerId'] = "<ここにあなたの出品者ID>";  // (1)出品者ID
  $params['MarketplaceId.Id.1'] = "A1VC38T7YXB528";
  $params['SignatureMethod'] = "HmacSHA256";
  $params['SignatureVersion'] = "2";
  $params['Version'] = "2013-09-01";
  $params['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');
  $params['Action'] = "ListOrders";
  $params['LastUpdatedAfter'] = gmdate('Y-m-d\T00:00:00\Z', strtotime("-1 days"));
  ksort($params);

  // ----------------------------------------------------- 署名作成
  $sign_str = "GET\nmws.amazonservices.jp\n/Orders/2013-09-01\n";
  foreach($params as $key => $value) {
  	$sign_str .= "{$key}=" . rawurlencode($value) . "&";
  }
  $sign_str = substr($sign_str, 0, -1);
  $Signature = base64_encode(hash_hmac('sha256', $sign_str, $MWSAuthToken, true));

  // ----------------------------------------------------- リクエスト
  $url = "https://mws.amazonservices.jp/Orders/2013-09-01?";
  foreach($params as $key => $value) {
  	$url .= "{$key}=" . rawurlencode($value) . "&";
  }
  $url .= "Signature=" . rawurlencode($Signature);
  $xml = file_get_contents($url);

  // ----------------------------------------------------- データ解析
  $xmlObject = simplexml_load_string($xml);
  var_dump($xmlObject);
?>

ポイントは署名の作り方で、リクエストのキーをksort関数で昇順にしている点だろう。

ドキュメントには載ってないが、キーを昇順にして署名・送信しないと、サーバー側で署名が一致せずエラーになってしまうのだ。

上記のサンプルは1日前の注文情報を取得するものだが、カスタマイズしたい場合は注文管理APIのドキュメントを参照のこと。

あと必須パラメータなど、APIを使いこなすのに読んでおいた方がいい関連ドキュメントを以下にまとめておいた。

以上、お疲れ様でした。

コピーライティングまとめ

▼リサーチについて
・媒体メデアをチェックする。
・その市場にいる人と直接話す。
・そのターゲットとおんなじ生活をしてみる。
・毎日見込み客が反応しそうなキーワードを何十個とか百個とか書く。

▼コピーライティングとは
コピーライティングとは感情、感性を科学的に表現していく文章術。

▼コピーライティングの基本
・ひとつのメッセージをひとつのマーケットに対して伝えて、そしてひとつの出口しか用意しない。
・ラブレターのつもりで、好きな人もしくは親、子、もしくは自分自身に対してレターを書く。
・読み手が普段使っている言葉を使って、読み手が普段見ている世界、視点で書く。

▼3つのNOT(心理的なブロック)
・not read「読まない」 ヘッドコピーが重要
・not believe「信じない」 公の機関が取ったデータ、書籍の引用
・not act「行動しない」 きちんと行動を促す、申し込まずにはいられないほどに興奮させる

▼OATH(問題の意識レベル)
・oblivious 無知
・apathetic 無関心
・thinking 考えている
・hurting 苦痛

マズローの欲求5段階説
・生理的欲求
・安全欲求
・親和欲求
・自我欲求
自己実現欲求

▼QUEST FORMULA
・Qualify(大きな約束をする)
・Understand(理解・共感する)
・Educate(教育・サービスの説明)
・Stimulate(興奮させる)
・Transition(行動させる)

▼セールスレターの構成要素
・ヘッド
・サブヘッド
・ブレット
・保証
・追伸

▼アイディアの出し方
・ブレインダンプとマインドマップ
・意外性のある状況をして設定して妄想する
・日頃からいろいろな体験をする

▼GDTの法則
G(time 時間、effort 努力、money お金)
D(greed 貪欲さ、lust 性的な欲望、comfort 快適さ)
T(scarcity 希少性、curiosity 興味、controversy 反社会性)

▼not readの壁を越えるために必要なこと
・ヘッドを強力にする
・サブヘッドとブレッド、追伸を工夫する
・わかりやすい文章を書く
・「あなた」って単語をよく使う
・読み手を強制的に巻き込んでいく
・巻き込んだ前提で話をする
・読み手が抱くであろう疑問をその場であえて文字にする

▼わかりやすい文章を書くために
・イメージしやすい言葉を使う
・例をくどく出す
・文章の始めと終わりに同じ話を持ってくる
・次の文をスムーズに読ませるための工夫をする

▼not believeの壁を越える
・言葉を変えて3回主張する
・reason whyを徹底する
・社会的な証明を利用する
・自信を見せつける
・ストーリーをうまく使っていく
・事実のすぐ隣にプロボーカティブな言葉、フレーズを置いていく
・事実から始めて徐々に自分の主張への移行させていく

▼not actの壁を越えてもらう方法
・行動をきちんと指示してやる
・stimulantを強力にする

▼推敲するチェックポイント
・よりインパクトを出せないかどうかのチェック
・難しい言葉使いすぎてないか
・reason whyにきちんと答えているか
・QUESTの流れになってるか
・日本語チェック
・不快な表現チェック
・ブラウザチェック

ファンデーションテープを使った眉毛の消し方*眉潰しの方法

ファンデーションテープで眉潰し

ファンデーションテープを使った眉毛の消し方をご紹介。

基本的にファンデーションテープを貼るだけで眉毛を消すことができるが、ここではよりキレイに潰すやり方を説明してみる。


10秒で眉潰し

用意するもの

ファンデーションテープ

f:id:kawai_norimitsu:20171228155058j:plain

ログインマイライフのファンデーションテープ。傷用とタトゥー用があるが、傷用を使う。

絆創膏サイズのお試しセット(4色4枚入り・540円)がオススメ。

ヘアワックス

f:id:kawai_norimitsu:20171220131449j:plain

ギャツビーのピンクのヘアワックス。コンビニやドラッグストアで手に入る容器の小さいタイプ。

コンシーラー

f:id:kawai_norimitsu:20171218142732j:plain

スティックコンシーラー(必要であればファンデーション)。100均などでも良いが、キャンメイクトーキョーのものがオススメ。

眉ペン

f:id:kawai_norimitsu:20171218142921j:plain

アイライナー。100均などで手に入る。ペンシルタイプがオススメ。もしくは文房具屋で売っているコピックチャオが発色も良く書きやすい。

ファンデーションテープを貼る

f:id:kawai_norimitsu:20171228161619j:plain

ヘアワックスを眉毛に塗って、毛を寝かす。

f:id:kawai_norimitsu:20171228161747j:plain

その上からファンデーションテープを貼ると、シワなく綺麗に貼れる。

コンシーラーで補強する

f:id:kawai_norimitsu:20171228161801j:plain

ファンデーションテープ1枚で隠しきれない場合は、シールの上からポンポンと置くようにコンシーラーを乗せる。

眉毛を書く

f:id:kawai_norimitsu:20171228161859j:plain

コピックで上から眉毛を書く。もし失敗した場合はメイク落としで眉毛とコンシーラーを落としてやり直す。

ファンデーションテープの落とし方

f:id:kawai_norimitsu:20171228161959j:plain

端からシールを持ち上げるだけで、キレイに落とせる。眉毛が抜けるほどの粘着力はないので大丈夫。

おまけ

f:id:kawai_norimitsu:20171228162207j:plain

ワックスを使わず、ファンデーションテープだけを貼るとシワができることがある。

基本的にはヘアワックスやスティックのりで眉毛を寝かしてから貼る方が良い。

ファンデーションテープを使うと汗や擦れでメイクが落ちにくく、眉毛の書き直しができる点が良い。

あと短時間で眉潰しできたり、落とすのが簡単なのも良い。

アイプチで固めるのと違って、コンシーラーも乗りやすいので、1度試してみる価値はあると思う。

matome.naver.jp

foundation-tape.net

市販のワックスを使った眉毛の潰し方*コスメイク編

眉毛の消し方、潰し方

男装や眉毛の色を変えたいコスプレイヤーさんの一番の悩みどころは眉毛の潰し方だと思う。

そこでなるべく安く、手軽に眉毛を消す方法をまとめてみた。

今回はこの眉毛を消してみる。量は少ないが毛は長いタイプだ。

f:id:kawai_norimitsu:20171220131329j:plain

用意するもの

ヘアワックス

f:id:kawai_norimitsu:20171220131449j:plain

市販のドラッグストアで売っている。ギャツビー(ピンク、ミニタイプ)のヘアワックス。226円。

コンシーラーとファンデーション

f:id:kawai_norimitsu:20171218142732j:plain

100均でも手に入るけど、自分の肌の色と合っているかが大事。

最近、レイヤーさん達の間では、CANMAKE(キャンメイク)のスティックコンシーラーがリーズナブルでカバー力もあり推されている。

指で塗るタイプでもいいけど、いちいち指が汚れないスティックタイプの使い勝手が良い。

メイク落とし

f:id:kawai_norimitsu:20171218143748j:plain

市販のドラッグストアで売っている。ふくだけコットン(ビオレ)のメイク落とし。248円。

オイルが入っている方がメイクが落ちやすい。あと携帯性もあるので出先でコスプレする人にオススメ。

眉ペン

f:id:kawai_norimitsu:20171218142921j:plain

市販の文具店で売っている。コピック(チャオ)は色の種類も豊富で発色がよく、写真映えしやすい。

自然な眉毛を目指すならペンシルタイプのアイライナーが書きやすい。アイブロウだとツルツル滑って書きづらい。

まずワックスを塗り込む

眉頭から眉尻に向かって、ギャツビーを塗り込む。眉毛を寝かしてペチャンコにするためだ。

f:id:kawai_norimitsu:20171220132913j:plain

最初は白いけど、塗っていくと次第に透明になって目立たなくなる。

f:id:kawai_norimitsu:20171220133023j:plain

上からコンシーラーを叩きこむ

眉毛の上からコンシーラーをポンポンを叩くように乗せていく。

f:id:kawai_norimitsu:20171220133223j:plain

ファンデーションで全体をぼかす

さらに眉毛とまわりの肌部分にファンデーションを塗っていき、境目をぼかす。

f:id:kawai_norimitsu:20171220133346j:plain

このコンシーラーとファンデーションの作業を、納得いくまで繰り返す。

最後に眉毛を書いて完成

コピック(またはアイライナーペンシル)で眉毛を書く。あまり強く書くとコンシーラーが取れてしまうので注意する。

f:id:kawai_norimitsu:20171220133522j:plain

失敗すると書き直しができないので、1度メイクを落として最初からやり直す。

コスメイクの落とし方

ビオレふくだけコットン(オイルイン)を1枚とって、しばらく眉毛に押し当てる。

すると化粧が浮いてくるので、軽くふき取る。ゴシゴシこすってはダメ。

拭く面を変えて繰り返せば、1枚で最後までキレイにメイクを落とせる。

(おまけ)ノリとアイプチってどうなの?

ネットでよく見かける眉潰しの方法、アラビックのり(ヤマト)とアイプチ(100均)を試してみた。

f:id:kawai_norimitsu:20171220134001j:plain

どちらも眉毛を寝かせるほどのキープ力がなく、例え寝かせても時間が経つと毛が立ち上がってきて困ってしまった・・・。

またコンシーラーの乗り具合も良くないから、あまりオススメできません。

以上、眉毛を消したいレイヤーさんの参考になれば。

こちらもどうぞ。

kawaidesu.hatenablog.com

【失敗しない】眉つぶし(三善)を使った眉毛の消し方【コスメイク】

コスメイクのための眉潰し

三善の眉つぶしを使った眉毛の消し方をご紹介。

眉潰しはプロ仕様の舞台用特殊メイク道具なので、慣れないと使い方が難しい。

用意するもの

眉つぶし

f:id:kawai_norimitsu:20171218142145j:plain

三善が販売、Amazonなどのネット通販や、全国の店舗で取り扱っている。864円(税込)。

全部で四色(1、2、21P、26P)ある。三善に電話で聞いたところ、Pのあるなしは関係ないとのことだ。

女性は21P、男性は26Pが合っている。2は色黒向け、1は白塗りメイク向けなのだそうだ。

ファンデーションとコンシーラー

f:id:kawai_norimitsu:20171218142732j:plain

100均でも何でも良いが、地肌に合っていることが条件。最近はキャンメイクのスティックコンシーラーが安くて人気だ。

コンシーラーは固形であれば良いが、いちいち指が汚れないスティックタイプをオススメしたい。

眉ペン

f:id:kawai_norimitsu:20171218142921j:plain

一般の文具店に売っているコピック(チャオ)は、発色が良くて色も豊富。今回は青色を購入した。

自然な眉毛を書きたいなら、100均などで売っているアイライナー(ペンシルタイプ)が良い。

ちなみにアイブロウだとツルツル滑ってうまく書けない。無理に書こうとするとコンシーラーが削れてしまうので注意。

メイク落とし

f:id:kawai_norimitsu:20171218143748j:plain

一般のドラッグストアに売っているビオレふくだけコットン(オイルin)は、持ち運びも便利でかなり使える。

これ1枚でコピックの眉毛もコンシーラーも眉潰しも落としてしまう有能さ。

ライターであぶる

f:id:kawai_norimitsu:20171218143906j:plain

眉つぶしは温めると柔らかくなり、冷めると固くなる性質がある。

そこでチャッカマン(ライター)を使って、あぶって柔らかくする。

あぶりたては熱々。火傷回避のため、少し時間を置いた方がいい。

ちなみに本来は、大豆くらいの大きさにちぎって、手でこねて柔らかくするのだそうだ。

このやり方の場合は、100均で売っているバターナイフで切るのが便利(薄く伸ばす化粧ヘラとしても使える)。

f:id:kawai_norimitsu:20171218150758j:plain

指で塗る

この眉毛を消してみる。毛の量は少ないが長さはある。

f:id:kawai_norimitsu:20171218141755j:plain

ちなみにiPhoneの標準カメラで撮影(無修正)、ビューティープラスは使ってない。

柔らかくした眉つぶしを指に取り、眉頭から眉尻に向かって薄く塗る

f:id:kawai_norimitsu:20171218144108j:plain

冷めると固まるので時間との勝負だ。

ちなみに26Pを使ったらこんな感じになった。

f:id:kawai_norimitsu:20171218144310j:plain

境目をぼかす

このままだと眉潰しが浮くので、コンシーラーとファンデーションで境目をぼかす。

まずはコンシーラーをポンポンと置くように肌に乗せる。次にファンデーションで全体をぼかす。

f:id:kawai_norimitsu:20171218144417j:plain

眉毛を書く

コピックで眉毛を書いてみた。男装する場合は目と眉毛の幅を短くする。

f:id:kawai_norimitsu:20171218144530j:plain

アイライナーの場合、強く書きすぎると眉潰しとコンシーラーが削れてしまうので注意。

やり直しがきかないので、失敗は許されない。

眉潰しの落とし方

ビオレふくだけコットン(オイルin)をしばらく眉毛に当てて眉潰しを浮かす。

そのあと拭く面を変えながら、根気よくポンポンを叩いて落とす。ゴシゴシこすってはいけない。

3~4枚ほどのコットンで繰り返せば、最後までキレイに落ちる。お湯や油はいらず、これが一番よく落ちる。

眉潰しの保存方法

眉潰しは放っておくと固くなるので、ラップで巻いておく。

f:id:kawai_norimitsu:20171218145709j:plain

失敗するパターン

眉毛の消し方で失敗するパターンは、「厚く塗り過ぎる」と「色が合わない」だろう。

f:id:kawai_norimitsu:20171218145911j:plain

厚く塗るとテカリが出るうえ、何か塗っている感じが目立ってしまう。(写真は2番の色を使用)

また色が合わないと、コンシーラーでもカバーできないので、買い直しになってしまう。

2色の眉潰しを混ぜて使うレイヤーさんもいるようだが、三善に聞いたところ、「そのような使い方を想定して製造していない」とのことだ。

三善の直営店(新宿、渋谷、有楽町)であれば、眉潰しのサンプルが置いてあるそうなので、試してから買うと失敗しないと思う。

上手に眉毛を消すコツは、薄く塗ること、そして地肌に合った眉潰しを使うことだ。

楽天RMS 受注APIサービスをPHPで利用するサンプルを書いてみた

概要

先月はYahoo!ショッピングのプロフェッショナル出店ストア向けAPIを利用したPHPサンプルを書いてみたのだが、楽天でも同じような機能を作ろうと思ったのが始まり。

楽天RMSのWEB APIサービスを利用するには、管理画面にログイン後、「拡張サービス一覧」から「WEB APIサービス」のリンクをクリックする。ちなみに無料で利用できる。

一応、ドキュメントが用意されているものの、情報が古い上にJavaで開発することが前提になっている。(もしかして楽天APIに需要がないのか?)

PHPソースコードがないかとネットを探してみるも、「楽天カスタマーサポートからPHPのサンプルをもらってね」と書かれているものが多数…。

仕方ないから自分で開発することにしたのであった。

前提

楽天RMSのドキュメントを読むと、受注API・決済API・在庫APISOAP呼び出し、その他APIはREST(POST/GET)呼び出しと書かれている。

f:id:kawai_norimitsu:20171123200130j:plain

今回は受注API(OrderAPI)を利用するので、SOAP呼び出しを使う。

楽天RMS APIを利用するには、まず最初に「申込、利用規約確認」から申込みする。次に「利用設定」から利用APIを選択する。

PHP言語を使って、サーバーサイドアプリケーションを開発する。

初期設定

楽天RMSAPI管理画面から、次の設定を確認しておく。

(1)サービスシークレット
(2)ライセンスキー
(3)受注API - order.getOrderが利用可能である

f:id:kawai_norimitsu:20171123202144j:plain

利用したいAPIの使用を許可しておかないと、エラーになるので注意。

サンプルプログラム

ライブラリ等を使わず、必要最低限な機能を一番シンプルなPHPで書くことにする。

サービスシークレットやライセンスキーは適宜、ご自身の文字列に書き換えること。

<?php

  // ------------------------------------------------ 初期設定
  $serviceSecret = "<ここにあなたのサービスシークレット>";		// サービスシークレット(1)
  $licenseKey = "<ここにあなたのライセンスキー>";				// ライセンスキー(2)
  $shop_url = "<ここにあなたのストアアカウント>";				// ストアアカウント

  // ------------------------------------------------ 受注情報を取得
  $authkey = "ESA " . base64_encode($serviceSecret . ':' . $licenseKey);
  $post_xml = "<?xml version='1.0' encoding='UTF-8'?>
  <SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:ns1='http://orderapi.rms.rakuten.co.jp/rms/mall/order/api/ws'>
  <SOAP-ENV:Body>
  <ns1:getOrder>
  <arg0>
    <authKey>{$authkey}</authKey>
    <shopUrl>{$shop_url}</shopUrl>
    <userName>?</userName>
  </arg0>
  <arg1>
    <isOrderNumberOnlyFlg>false</isOrderNumberOnlyFlg>
    <orderSearchModel>
      <dateType>1</dateType>
      <startDate>2017-10-26</startDate>
      <endDate>2017-10-28</endDate>
    </orderSearchModel>
  </arg1>
  </ns1:getOrder>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>";
  $header = array(
    "Content-Type: text/xml;charset=UTF-8",
  );

  $url = "https://api.rms.rakuten.co.jp/es/1.0/order/ws";
  $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);

  $clean_xml = str_ireplace(['S:', 'ns2:'], '', $xml);
  $data = simplexml_load_string($clean_xml);
  $data = json_decode(json_encode($data), true);

?>

ちなみにストアアカウントとは、あなたの出店ストアのアドレス(https://www.rakuten.co.jp/○○○/)にある、○○○の部分。

上記のサンプルプログラムをUTF-8で保存してアクセスしてみると、楽天RMSから受注情報が取得できる。
※サンプルでは2017-10-26から2017-10-28分が指定されている

おまけ

ついでにREST方式の楽天APIを利用するサンプルも書いておく。

楽天RMSからカテゴリ一覧を取得するAPIの例。当たり前だけど、管理画面で利用APIに指定してないと動かないので注意。

<?php

  // ------------------------------------------------ 初期設定
  $serviceSecret = "<ここにあなたのサービスシークレット>";		// サービスシークレット(1)
  $licenseKey = "<ここにあなたのライセンスキー>";				// ライセンスキー(2)

  // ------------------------------------------------ カテゴリ一覧を取得
  $authkey = base64_encode($serviceSecret . ':' . $licenseKey);
  $header = array(
    "Content-Type: text/xml;charset=UTF-8",
    "Authorization: ESA {$authkey}",
  );

  $url = "https://api.rms.rakuten.co.jp/es/1.0/categoryapi/shop/categories/get";
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  $xml = curl_exec($ch);
  curl_close($ch);

  var_dump($xml);

?>

ドキュメントにも書かれているけど、ライセンスキーには有効期限があるので、定期的にライセンスキーを更新する必要がある。面倒臭い・・。

以上、お疲れ様でした。

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!デベロッパーネットワーク

お疲れ様でした!