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

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

楽天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);

?>

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

以上、お疲れ様でした。