楽天RMS 受注APIサービスをPHPで利用するサンプルを書いてみた
概要
先月はYahoo!ショッピングのプロフェッショナル出店ストア向けAPIを利用したPHPサンプルを書いてみたのだが、楽天でも同じような機能を作ろうと思ったのが始まり。
楽天RMSのWEB APIサービスを利用するには、管理画面にログイン後、「拡張サービス一覧」から「WEB APIサービス」のリンクをクリックする。ちなみに無料で利用できる。
一応、ドキュメントが用意されているものの、情報が古い上にJavaで開発することが前提になっている。(もしかして楽天APIに需要がないのか?)
PHPのソースコードがないかとネットを探してみるも、「楽天カスタマーサポートからPHPのサンプルをもらってね」と書かれているものが多数…。
仕方ないから自分で開発することにしたのであった。
前提
楽天RMSのドキュメントを読むと、受注API・決済API・在庫APIはSOAP呼び出し、その他APIはREST(POST/GET)呼び出しと書かれている。
今回は受注API(OrderAPI)を利用するので、SOAP呼び出しを使う。
楽天RMS APIを利用するには、まず最初に「申込、利用規約確認」から申込みする。次に「利用設定」から利用APIを選択する。
PHP言語を使って、サーバーサイドアプリケーションを開発する。
サンプルプログラム
ライブラリ等を使わず、必要最低限な機能を一番シンプルな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を利用するにあたり、次の条件を満たしている必要がある。
ちなみに今回は、サーバーサイド(Yahoo! ID連携 v1)アプリケーションをPHPで開発していくことにした。
注文APIを利用申請すると、Yahoo!ショッピングテクニカルサポートから次のようなメールが届く。
赤字で囲っている部分のアプリケーション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!デベロッパーネットワークにアクセスして、[アプリケーションの管理]から該当する[アプリケーションの詳細]を開く。
次の設定を確認しておく。
(1)アプリケーションID
(2)シークレット
(3)コールバックURL
(4)ストア向け操作関連の機能(開示先限定スコープ)
今回のプログラムでは、「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と名前)を取得する処理をしている。
エラーが起こるケース
もしうまくいかない場合は、次のことを確認する。
あとはAPIドキュメントを読めば何とかなるはず。。
ショッピング:注文に関するAPI - Yahoo!デベロッパーネットワーク
お疲れ様でした!
PHPのHTTPS通信、SSL暗号方式をTLS1.2に対応させてみた
TLS1.2に対応する
SSL v3.0の脆弱性からTLSへの対応が求められてきたが、ついにTLS1.2以外の通信は無効にするとの連絡がきた。
結論から言うと、TLS1.2に対応するためには、cUrlのバージョンが7.34.0以上かつOpenSSLのバージョンが1.0.1以上でなければならない。
環境
ウチのサーバー環境は次の通り。
エックスサーバー:X20プラン
PHP:5.6.30
cURL:7.47.1
SSL:OpenSSL/1.0.1e
エックスサーバーはPHPのバージョンを上げると、あわせてcURLやOpenSSLのバージョンが上がる仕組みだ。
下記のPHPプログラムをサーバーにアップロードして、ブラウザからアクセスすると、自分のサーバー環境が確認できる。
<?php phpinfo(); ?>
PHPプログラム
cURLを使ったPHPプログラムのサンプル(POST送信)。
<?php $data = 'test1=aaa&test2=bbb'; $ch = curl_init("https://tlstest.paypal.com"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'TLSv1'); var_dump(curl_exec($ch)); curl_close($ch); ?>
HTTPS通信する先は、PaypalのTLS1.2対応テストサーバーを使ってみた。
あとCURLOPT_SSLVERSIONオプションに「CURL_SSLVERSION_TLSv1_2」と明示してみた。
このプログラムを自分のサーバーで走らせたとき、次の文字が表示されれば成功だ。
PayPal_Connection_OK
追記
エックスサーバーの仕様によっては、curlのバージョンが「7.29.0」、sslのバージョンが「NSS/3.28.4」であるかも知れない。
この場合は、SSLVERSION と SSL_CIPHER_LIST を明示的に指定してしまうとエラーになるので注意。
つまり正しくは、次のコードとなる。
<?php $data = 'test1=aaa&test2=bbb'; $ch = curl_init("https://tlstest.paypal.com"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); var_dump(curl_exec($ch)); curl_close($ch); ?>
ひろゆき著「無敵の思考」を読んだ。最後のオチに驚いた。
ひろゆき著「無敵の思考」を読んだ。最後にすごいオチがあって驚かされた。
ひろゆきの本名は西村博之で、インターネットの匿名掲示板「2ちゃんねる」を作った人くらいの認識しかなかった。
その彼の著書である「無敵の思考」は、話し言葉風の文体でとても読みやすい。
ひろゆきの主張が各章で簡単にまとめられており、全200ページ程度ということもあってサクッと読める。
本書のエッセンスを自分なりにまとめてみた。
ルールを決める
人生は選択の連続だ。「買うか買わないか」「どれを食べるか」など。
意思決定には労力を使うため、その都度選択していたのではパフォーマンスが悪い。また感覚的に判断していると損をする。
だからあらかじめルールを決めておき、ルールを軸に判断するのが良いのだとひろゆき氏は主張する。
具体的には「一番安いものを買う」「外では食べない」などの自分ルールを決めておくのだ。
基準点を低くする
人生の時間は有限だ。ならば幸せを感じる時間が多いに越したことはない。
幸せを感じたいなら、考え方を変えることが重要だ。
ひろゆき氏によれば、常に最悪を想定しておくことで、幸せを感じることができるという。
例えば、年収500万円の人が300万円になれば不幸に感じ、年収200万円の人が300万円になれば幸せを感じる。同じ300万円なのに。
このように、基準点を低くしておくことで、幸福に生きられるというわけだ。
Beckyメールのテンプレートを保存場所から一括コピーする方法
概要
Beckyメーラーを使っているのだけれど、テンプレートを他の受信箱でも使いたいと思った。
一つ一つ、手作業でコピーしていくのも面倒なので、テンプレートの保存場所から一括コピーすることにした。
以下、その手順。
1.データフォルダの場所を探す
Beckyを起動して、メニューにある[ファイル]-[システム]-[データフォルダの変更]をクリックする。
不安になる文言が表示されるが、そのまま[OK]をクリックする。
Beckyが自動的に終了するので、再度、立ち上げる。すると次のようなダイアログが表示される。
データフォルダの保存場所(パス)をコピーし、[OK]ボタンをクリックする。
2.テンプレートの保存場所を開く
先ほどコピーしたパスを、フォルダのパスに貼り付ける(ペーストする)。
Enterキーを押すと、Beckyのデータフォルダが表示される。
フォルダ内にある「*.mb」形式のフォルダは、受信箱をあらわしている。
「*.mb」を開き、「#Tml」を開き、「#Reply(または#Forward)」を開く。
※「#Tml」はテンプレートフォルダ、「#Reply」は返信、「#Forward」は転送を意味している
すると「*.tml」ファイルがある。これがテンプレートファイルだ。
テキストファイルで直接編集することもできるし、これらをコピーして、別の受信箱フォルダ(*.mb)内にある返信フォルダ(#Reply)にペーストすると、一括で移行できる。
以上、お疲れ様でした。
生命保険についての個人的な見解
国民の約9割が加入している生命保険。
家の次に大きな買い物と言われているが、その仕組みをよく理解している人は少ない。
生命保険の基本と仕組みをまとめてみた。
そもそも、なんで保険に入るのか?
保険に入る目的は、おおよそ次の通り。
・医療費や入院のため
・万一のとき家族の生活保障のため
・火災や事故に備えて
・葬式代のため
ちなみに上記の大部分は、民間の任意保険に頼らなくても、お金がもらえる制度が活用できる。
医療費や入院費は、国民健康保険がある。病院の窓口で保険証を見せれば、3割負担で済むアレである。
2人に1人がガンになると脅かされているが、ガンの治療費は平均100万円で、こちらは高額療養費制度が使える。
生活保障は遺族年金や生活保護があるし、アパートを借りれば火災保険、自動車を買えば自賠責保険に強制加入させられる。
葬式は火葬で済ませれば、骨壺を含めて10万円程度。小規模なお葬式なら100万円で足りるので、貯金で対応できる額だろう。
原則として、働いていて子供がおらず、貯金が100万円以上あるなら、保険に加入する意味は少ないのだ。
それでも得体の知れない「安心感」を求めて、保険に入る人は多い。
保険の3分野
保険には、3つの分野がある。
1.生命保険
死亡時にお金がもらえる。残された家族の生活保障や、自分の葬式代に充てるためといった意味合いが強い。
生命保険は3種類しかない
生命保険には、用途別に次の3種類がある。
1.定期保険
満期があり、満期時の返戻金はない。保険料は安いが戻ってこないので、掛け捨てと呼ばれる。万一の生活保障に向いている。
2.終身保険
満期はないが、死亡と同時に保険金が必ず支払われる。保険料はやや高い。葬式代に向いている。
3.養老保険
満期があり、満期時の返戻金がある。保険料はすごく高い。貯蓄機能があるので老後資金に向いている。
結局、いつどんな保険に入るのがいいのか?
保険は、万が一の事態が起こり、多額のお金が必要になった時に役に立つ。
例えば夫は会社員、妻が専業主婦で、子供が中学生の家庭があったとする。
一馬力なので世帯収入が少ないうえ、これから子供の学費が掛かることが予測できる。
この場面で夫が死亡した場合、収入はゼロになり、残された家族の生活は苦しくなる。
もし生命保険に加入していれば、保険金が入り、妻が就職するまで生活をやり繰りできるだろう。
逆に言えば、子供がいない場合やすでに独立している場合、妻が働いている場合は、保険に入る意味は少ない。
以上をまとめると、子供ができたり妻が無職の場合に、定期型(掛け捨て)の生命保険に入るのが最善と考えられる。
ノートパソコンのマウス(Bluetooth接続)が切れる時の解決方法
問題の現象
無線マウスは便利なのだが、時々Bluetooth接続が切れてしまって、作業に支障が出る。しばらくするとまたつながるのだが、不定期に切れてしまう。コレ何が原因なの?
ちなみに、DELLのノートパソコン(XPS15)でBluetooth接続のマウス(エレコム ワイヤレスマウス Bluetooth モバイル CAPCLIP 3ボタン IRLED搭載 充電式 ホワイト M-CC1BRWH)を使用している。windowsは8.1だ。
解決方法
ネットを調べてみると、Bluetoothマウスの「電源の管理」で節電するチェックを外すとあるが、その設定がない。
他に「Bluetooth ネットワーク接続」からデバイスを無効にすると良いらしいが、無効にしても問題は解決しなかった。
詳しくはコチラのサイトへどうぞ。
結論から言うと、ノートパソコンについているタッチパッドが悪さをしていたのだった。
マウスを操作しているときにタッチパッドに触れてしまい、Bluetooth接続が切れるというオチ・・・
タッチパッドを気にしながらノートパソコンを操作したくないので、以下の手順で解決することにした。
1.設定を開く
マウスカーソルをデスクトップの右下に持っていくと、メニューが表示される。メニューにある「設定」をクリックする。
2.PC設定を開く
設定の中にある「PC設定の変更」をクリックする。