RMS APIは楽天市場の店舗管理、商品管理の自動化を実現するAPIです。あまりサンプルがまとまっていないので、APIの全パターンを下記記事でまとめています。
楽天 RMS APIのPHPサンプル集・使い方 ほぼ全パターン(随時更新中)
今回は在庫の更新ができる在庫API(Inventory API)、updateInventoryExternalを解説します。
APIを使用できる環境がない場合は、下記から出店申請をしてください。高いので既に出店アカウントを持っている人に頼んで、テスト店舗を使用させてもらうのも手です。
サンプルソースコードは下記です。
updateInventoryExternalのサンプルソースコード
こちらの記事は当初運営者メンバーの執筆でしたが現在は離れており、寄稿記事となっています。そのため当記事の情報アップデートにつきましては2020年1月をもって終了・サポート・内容についての問合せなどは受けておりません。また、記事内容を利用された際に生じた内容にも責任を負えませんのでご了承ください。
updateInventoryExternalの概要
updateInventoryExternalのSOAPのエンドポイントに更新したい商品の在庫情報をPOSTすると、在庫の情報をピンポイントで更新することができます。
更新できる項目例は下記です。
- 通常在庫か項目選択肢別在庫設定か
- 在庫戻し設定(キャンセル時に在庫を戻すか否か)
- 納期管理番号
- 在庫数(項目選択肢別在庫設定の場合縦軸横軸の名前を指定して)
これらの設定は商品APIのitem.updateでもできます。ただ、item.updateだと項目選択肢別在庫設定の際に面倒です。
例えば、下記のような項目選択肢別在庫があった時を考えてみましょう。
サイズ(縦軸) | 色(横軸) | 在庫数 |
---|---|---|
S | 赤 | 4 |
S | 白 | 4 |
M | 赤 | 4 |
M | 白 | 4 |
S/赤の在庫数だけを0にしたいと思った場合、item.updateだと下記のようにパラメータを入れる必要があります。
サイズ(縦軸) | 色(横軸) | 在庫数 |
---|---|---|
S | 赤 | 0 |
S | 白 | 4 |
M | 赤 | 4 |
M | 白 | 4 |
一つ変えたいだけなのに、全て入れる必要があるんですね。これは少しめんどい。
ただし、updateInventoryExternalだと下記のように部分的に更新をかけることができます。
サイズ(縦軸) | 色(横軸) | 在庫数 |
---|---|---|
S | 赤 | 0 |
このように、在庫情報の更新の場合、在庫APIで更新をした方が多くの場合楽になります。
POST リクエスト例
リクエストは下記です。この例では項目選択肢別在庫設定の商品に対して、S/赤の在庫数を50に変更しています。
<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="java:jp.co.rakuten.rms.mall.inventoryapi.v1.model.entity" xmlns:ns2="https://inventoryapi.rms.rakuten.co.jp/rms/mall/inventoryapi"> <SOAP-ENV:Body> <ns2:updateInventoryExternal> <ns2:externalUserAuthModel> <ns1:authKey>ESA hogekey</ns1:authKey> <ns1:userName>hogename</ns1:userName> <ns1:shopUrl>hogeshop</ns1:shopUrl> </ns2:externalUserAuthModel> <ns2:updateRequestExternalModel> <ns1:updateRequestExternalItem> <ns1:UpdateRequestExternalItem> <ns1:HChoiceName>S</ns1:HChoiceName> <ns1:VChoiceName>赤</ns1:VChoiceName> <ns1:inventory>50</ns1:inventory> <ns1:inventoryBackFlag>1</ns1:inventoryBackFlag> <ns1:inventoryType>3</ns1:inventoryType> <ns1:inventoryUpdateMode>1</ns1:inventoryUpdateMode> <ns1:itemUrl>7jfisbuy</ns1:itemUrl> <ns1:lackDeliveryDeleteFlag>false</ns1:lackDeliveryDeleteFlag> <ns1:lackDeliveryId>1000</ns1:lackDeliveryId> <ns1:nokoriThreshold>-1</ns1:nokoriThreshold> <ns1:normalDeliveryDeleteFlag>false</ns1:normalDeliveryDeleteFlag> <ns1:normalDeliveryId>1000</ns1:normalDeliveryId> <ns1:orderFlag>0</ns1:orderFlag> <ns1:orderSalesFlag>1</ns1:orderSalesFlag> <ns1:restTypeFlag>0</ns1:restTypeFlag> </ns1:UpdateRequestExternalItem> </ns1:updateRequestExternalItem> </ns2:updateRequestExternalModel> </ns2:updateInventoryExternal> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
今回はSOAPクライアントを使ってPOSTするので、このリクエストを直接作ることはありませんが、参考までに。
ソースコード解説
やることは下記。
- POSTリクエストする在庫情報クラスオブジェクト作成し、設定する
- 在庫情報クラスをパラメータでSOAPクライアントを使ってPOST
です。
POSTリクエストする在庫情報クラスオブジェクト作成し、設定する
まずは送信する在庫情報を格納する、在庫情報クラスオブジェクトを作成します。
class/updateRequestExternalModel.php
<?php class UpdateRequestExternalModel { // xmlで自動生成するときに順番通りに要素が並ぶ public $updateRequestExternalItem; // updateRequestExternalItem(在庫情報更新要求アイテムモデル[複数])オブジェクトをリストでセット // public $updateRequestExternalItem; function __construct() { } }
class/updateRequestExternalItem.php
<?php class UpdateRequestExternalItem { // xmlで自動生成するときに順番通りに要素が並ぶ public $itemUrl; public $inventoryType; public $restTypeFlag; public $HChoiceName; public $VChoiceName; public $orderFlag; public $nokoriThreshold; public $inventoryUpdateMode; public $inventory; public $inventoryBackFlag; public $normalDeliveryDeleteFlag; public $normalDeliveryId; public $lackDeliveryDeleteFlag; public $lackDeliveryId; public $orderSalesFlag; function __construct() { } }
次に、そのクラスオブジェクトを作成し、各設定値をいれ、POSTを実行する関数updateInventoryExternalにぶち込みます。
updateVariationInventory.php
/*** * 在庫情報セット * */ // 在庫情報を設定 $updateRequestExternalModel = new UpdateRequestExternalModel(); // 更新したい在庫の情報を設定 「Sサイズのred色の在庫を任意の在庫数に変える」 $updateRequestExternalItem = new UpdateRequestExternalItem(); $updateRequestExternalItem->itemUrl = '7jfisbuy'; $updateRequestExternalItem->inventoryType = 3; // 項目選択肢別在庫設定 $updateRequestExternalItem->restTypeFlag = 0; $updateRequestExternalItem->HChoiceName = 'S'; // 更新したい在庫の横軸 $updateRequestExternalItem->VChoiceName = 'red'; // 更新したい在庫の縦軸 $updateRequestExternalItem->orderFlag = 0; $updateRequestExternalItem->nokoriThreshold = -1; $updateRequestExternalItem->inventoryUpdateMode = 1; $updateRequestExternalItem->inventoryBackFlag = 1; $updateRequestExternalItem->inventory = 50; // 在庫数 $updateRequestExternalItem->normalDeliveryDeleteFlag = 0; $updateRequestExternalItem->normalDeliveryId = 1000; $updateRequestExternalItem->lackDeliveryDeleteFlag = 0; $updateRequestExternalItem->lackDeliveryId = 1000; $updateRequestExternalItem->orderSalesFlag = 1; // 在庫情報に更新したい在庫情報をセット $updateRequestExternalModel->updateRequestExternalItem[] = $updateRequestExternalItem; // customVarDump($updateRequestExternalModel); // 楽天へRMS APIを使って送信 list($request, $httpStatusCode, $response) = updateInventoryExternal($updateRequestExternalModel);
在庫情報クラスをパラメータでSOAPクライアントを使ってPOST
在庫情報のクラスをSOAPクライアントに入れて実行することで、SOAPクライアントが自動でリクエストXMLを作ってPOSTしてくれます。
API申請時に発行したサービスシークレットとライセンスキーを入れる必要があります。★部分。
updateVariationInventory.php
function updateInventoryExternal($updateRequestExternalModel) { //パラメータセット $userAuthModel = new ExternalUserAuthModel(); $userAuthModel->authKey = "ESA " . base64_encode(RMS_SERVICE_SECRET . ':' . RMS_LICENSE_KEY); //★1 $userAuthModel->shopUrl = RMS_SETTLEMENT_SHOP_URL; $userAuthModel->userName = RMS_SETTLEMENT_USER_NAME; $params = array('externalUserAuthModel' => _convertClassObjectToArray($userAuthModel), 'updateRequestExternalModel' => _convertClassObjectToArray($updateRequestExternalModel)); // customVarDump($params); //エラーを無視するエラーハンドラに切り替える(実行後は元に戻す) set_error_handler("myErrorHandler"); try{ // WSDLファイルを読み込む 楽天サーバーの見えるところに置かれてないので、自サーバーの適当なところに置いて読む $client = new SoapClient(__DIR__ ."/wsdl/inventoryapi.wsdl", array('trace' => 1 )); //★2 //エラーハンドラ回復 restore_error_handler(); } catch (Exception $e) { //エラーハンドラ回復 restore_error_handler(); echo $e->getMessage(); return array(null, "400", $e->getMessage()); // 適切に対処した方が良い //WSDLファイルの読み込みに失敗した場合の処理 } try{ //SOAP通信実行 $result = $client->updateInventoryExternal($params); // customVarDump($result); } catch (SoapFault $e) { // customVarDump($e); echo $e->getMessage(); //SOAP通信の実行に失敗した場合の処理 } // customVarDump($client->__getLastRequest()); // customVarDump($client->__getLastResponse()); return array($client->__getLastRequest(), extract_response_http_code($client->__getLastResponseHeaders()), $result); } // エラーハンドラ関数 function myErrorHandler($errno, $errstr, $errfile, $errline) { } /** * Convert an classObject to array */ function _convertClassObjectToArray($object) { $json = json_encode($object); return (array)json_decode($json, true); }
★2部分でauthoriやgetOrderの時にも指定したwsdlファイルの指定があります。このwsdlファイルはサーバー上の見えるところに公開されていないため、RMS APIの仕様書のリンク部分からダウンロードして、ローカルから読み込む必要があります。
// WSDLファイルを読み込む 楽天サーバーの見えるところに置かれてないので、自サーバーの適当なところに置いて読む $client = new SoapClient(__DIR__ ."/wsdl/inventoryapi.wsdl", array('trace' => 1 )); //★2
まとめ
今回は在庫API、updateInventoryExternalを解説しました。入力項目が多い項目選択肢別在庫設定の在庫数を、このAPIで設定できれば、かなりの手間が削減できるかもしれませんね。
今回作成したサンプルソースコードは下記です。
updateInventoryExternalのサンプルソースコード
その他のAPIについても下記から辿れるようになってますので、他のAPIも知りたいという方はチェックしてみてくださいね。