RMS APIは楽天市場の店舗管理、商品管理の自動化を実現するAPIです。あまりサンプルがまとまっていないので、APIの全パターンを下記記事でまとめています。
楽天 RMS APIのPHPサンプル集・使い方 ほぼ全パターン(随時更新中)
今回は受注API(Order API)、getOrderのサンプルを解説します。
APIを使用できる環境がない場合は、下記から出店申請をしてください。毎度言ってますが料金が高いので、APIを試すだけなら既に店舗アカウントを持っている人に頼んでテスト店舗を使わせてもらうのも手です。
サンプルソースコードは下記です。
getOrderのサンプルソースコード
[st-mybox title="注意ポイント" fontawesome="fa-exclamation-circle" color="#ef5350" bordercolor="#ef9a9a" bgcolor="#ffebee" borderwidth="2" borderradius="5" titleweight="bold"]
楽天ペイ移行後の注文は楽天ペイ受注API(RakutenPayOrderAPI)のgetOrderを使う必要があります。楽天ペイ移行後の店舗向けの注文を取得したい方は下記をご確認ください。
[/st-mybox]RMS 楽天ペイ受注API(RakutenPayOrderAPI) getOrderで注文情報を取得するPHPサンプル解説・使い方
こちらの記事は当初運営者メンバーの執筆でしたが現在は離れており、寄稿記事となっています。そのため当記事の情報アップデートにつきましては2020年1月をもって終了・サポート・内容についての問合せなどは受けておりません。また、記事内容を利用された際に生じた内容にも責任を負えませんのでご了承ください。
getOrderの概要
getOrderを使えば、店舗に入った注文の内容を取得することができます。
例えば受注の支払いステータスを見て、authori APIなどでカード自動決済を行ったり、入金状況を見て受注ステータスを自動で発送待ちに変更したりなど、他のAPIと連携させた用途が考えられます。
getOrderはSOAP APIです。エンドポイントにPOSTすると、指定の条件の注文をXMLで取得できます。
指定する検索パラメータの例は下記です。
- 受注番号
- 注文の入った日付で範囲指定
取得できる注文の情報は下記です。(多すぎなので有用そうなものを抜粋)
- 注文番号
- 購入された商品の情報、価格、個数など
- 支払い方法(クレジットカード決済やコンビニ決済、楽天バンク決済、楽天口座決済や楽天マルチ決済など)
- クレジットカードの決済ステータス(オーソリ済みとか)
- 楽天バンク決済の決済ステータス(振替依頼済とか)
- 配達方法や配送日時指定など
- 購入者の住所情報など
- 受注ステータス(新規受付とか発送待ちとか)
POST リクエスト例
下記のようなリクエストを送ります。SOAPなので注意。
<?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>ESAほげ</authKey>
<shopUrl>hoge</shopUrl>
<userName>hoge</userName>
</arg0>
<arg1>
<isOrderNumberOnlyFlg>false</isOrderNumberOnlyFlg>
<orderSearchModel>
<dateType>1</dateType>
<endDate>2018-07-02</endDate>
<orderType>1</orderType>
<orderType>2</orderType>
<orderType>3</orderType>
<orderType>4</orderType>
<orderType>5</orderType>
<orderType>6</orderType>
<startDate>2018-06-02</startDate>
</orderSearchModel>
</arg1>
</ns1:getOrder>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
この例では、2018-07-02から2018-06-02までの、全てのオーダータイプ(通常購入や、共同購入、オークションとかなんとかとか)の注文を取得するPOSTです。
期間指定だけでなく、受注番号で直接指定もできます。その場合は下記。
<?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>ESAhoge</authKey>
<shopUrl>hoge</shopUrl>
<userName>hoge</userName>
</arg0>
<arg1>
<isOrderNumberOnlyFlg>false</isOrderNumberOnlyFlg>
<orderNumber>338459-20180629-00000824</orderNumber>
</arg1>
</ns1:getOrder>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
レスポンス例
下記のような感じで返ってきます。orderModel単位が1つの受注で、その中のpackageModel->itemModelに注文された商品の情報が入ってくる形。settleMentNameやcardStatus、rBankStatusなどを組み合わせて解析することで、入金済か否かも判定できます。
<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:getOrderResponse xmlns:ns2="http://orderapi.rms.rakuten.co.jp/rms/mall/order/api/ws">
<return>
<errorCode>N00-000</errorCode>
<message>正常終了</message>
<orderModel>
<asurakuFlg>0</asurakuFlg>
<cardStatus>12</cardStatus>
<carrierCode>0</carrierCode>
<deliveryModel>
<deliveryName>宅配便</deliveryName>
</deliveryModel>
<deliveryPrice>0</deliveryPrice>
<emailCarrierCode>0</emailCarrierCode>
<enclosureDeliveryPrice>0</enclosureDeliveryPrice>
<enclosureId>0</enclosureId>
<enclosureStatus>0</enclosureStatus>
<firstAmount>564</firstAmount>
<goodsPrice>464</goodsPrice>
<goodsTax>0</goodsTax>
<isBlackUser>false</isBlackUser>
<isGift>false</isGift>
<isGiftCheck>false</isGiftCheck>
<isRakutenMember>true</isRakutenMember>
<modify>false</modify>
<option/>
<orderDate>2018-06-29T13:34:54+09:00</orderDate>
<orderNumber>338459-20180629-00000824</orderNumber>
<orderType>1</orderType>
<ordererModel>
<birthDay>-</birthDay>
<birthMonth>-</birthMonth>
<birthYear>-</birthYear>
<city>世田谷区 玉川一丁目14番1号</city>
<emailAddress>1a7453aa11f3d60c8079efb641659e2cs1@pc.fw.rakuten.ne.jp</emailAddress>
<familyName>楽天</familyName>
<familyNameKana>ラクテン</familyNameKana>
<firstName>testuser_1219</firstName>
<firstNameKana>ジロウ</firstNameKana>
<phoneNumber1>03</phoneNumber1>
<phoneNumber2>1234</phoneNumber2>
<phoneNumber3>5678</phoneNumber3>
<prefecture>東京都</prefecture>
<sex>-</sex>
<subAddress>※※ この注文はテスト注文です。誠に申し訳ございませんがキャンセル処理をお願いします。</subAddress>
<zipCode1>158</zipCode1>
<zipCode2>0094</zipCode2>
</ordererModel>
<packageModel>
<basketId>1697696010</basketId>
<deliveryCompanyId>1000</deliveryCompanyId>
<deliveryPrice>0</deliveryPrice>
<goodsPrice>464</goodsPrice>
<goodsTax>0</goodsTax>
<itemModel>
<basketId>1697696010</basketId>
<isIncludedCashOnDeliveryPostage>false</isIncludedCashOnDeliveryPostage>
<isIncludedPostage>false</isIncludedPostage>
<isIncludedTax>true</isIncludedTax>
<itemId>10000120</itemId>
<itemName>DUNLOP(ダンロップ) XXIO9 ゼクシオ ナイン フェアウェイウッド MP900 カーボンシャフト</itemName>
<itemNumber>0236-004057SRMP900カーボン/16.5度/Right</itemNumber>
<normalItemModel>
<inventoryType>2</inventoryType>
</normalItemModel>
<pageURL>/_shop_4485/0236-004057/</pageURL>
<pointRate>5</pointRate>
<pointType>2</pointType>
<price>464</price>
<selectedChoice>ゴルフ:SR
ャフ/ロック/利き手:MP900カーボン/16.5度/Right</selectedChoice>
<units>1</units>
</itemModel>
<postagePrice>100</postagePrice>
<senderModel>
<city>世田谷区 玉川一丁目14番1号</city>
<familyName>楽天</familyName>
<familyNameKana>ラクテン</familyNameKana>
<firstName>testuser_1219</firstName>
<firstNameKana>ジロウ</firstNameKana>
<phoneNumber1>03</phoneNumber1>
<phoneNumber2>1234</phoneNumber2>
<phoneNumber3>5678</phoneNumber3>
<prefecture>東京都</prefecture>
<subAddress>※※ この注文はテスト注文です。誠に申し訳ございませんがキャンセル処理をお願いします。</subAddress>
<zipCode1>158</zipCode1>
<zipCode2>0094</zipCode2>
</senderModel>
</packageModel>
<postagePrice>100</postagePrice>
<requestPrice>564</requestPrice>
<seqId>0</seqId>
<settlementModel>
<cardModel>
<brandName>VISA</brandName>
<cardNo>XXXX-XXXX-XXXX-6941</cardNo>
<expYM>2020/03</expYM>
<ownerName>TARO RAKUTEN</ownerName>
<payType>0</payType>
</cardModel>
<settlementName>クレジットカード</settlementName>
</settlementModel>
<status>新規受付</status>
<totalPrice>564</totalPrice>
</orderModel>
<orderModel>
<asurakuFlg>0</asurakuFlg>
<cardStatus>1</cardStatus>
<carrierCode>0</carrierCode>
<deliveryModel>
<deliveryName>宅配便</deliveryName>
</deliveryModel>
<deliveryPrice>100</deliveryPrice>
<emailCarrierCode>0</emailCarrierCode>
<enclosureId>0</enclosureId>
<enclosureStatus>0</enclosureStatus>
<firstAmount>208</firstAmount>
<goodsPrice>108</goodsPrice>
<goodsTax>0</goodsTax>
<isBlackUser>false</isBlackUser>
<isGift>false</isGift>
<isGiftCheck>false</isGiftCheck>
<isRakutenMember>true</isRakutenMember>
<modify>false</modify>
<option/>
<orderDate>2018-06-29T16:29:55+09:00</orderDate>
<orderNumber>338459-20180629-00000831</orderNumber>
<orderType>1</orderType>
<ordererModel>
<birthDay>-</birthDay>
<birthMonth>-</birthMonth>
<birthYear>-</birthYear>
<city>世田谷区 玉川一丁目14番1号</city>
<emailAddress>1a7453aa11f3d60c8079efb641659e2cs1@pc.fw.rakuten.ne.jp</emailAddress>
<familyName>楽天</familyName>
<familyNameKana>ラクテン</familyNameKana>
<firstName>testuser_1219</firstName>
<firstNameKana>ジロウ</firstNameKana>
<phoneNumber1>03</phoneNumber1>
<phoneNumber2>1234</phoneNumber2>
<phoneNumber3>5678</phoneNumber3>
<prefecture>東京都</prefecture>
<sex>-</sex>
<subAddress>※※ この注文はテスト注文です。誠に申し訳ございませんがキャンセル処理をお願いします。</subAddress>
<zipCode1>158</zipCode1>
<zipCode2>0094</zipCode2>
</ordererModel>
<packageModel>
<basketId>1697865258</basketId>
<deliveryCompanyId>1000</deliveryCompanyId>
<deliveryPrice>100</deliveryPrice>
<goodsPrice>108</goodsPrice>
<goodsTax>0</goodsTax>
<itemModel>
<basketId>1697865258</basketId>
<isIncludedCashOnDeliveryPostage>false</isIncludedCashOnDeliveryPostage>
<isIncludedPostage>true</isIncludedPostage>
<isIncludedTax>true</isIncludedTax>
<itemId>10000158</itemId>
<itemName>kkbrms3 TESCOM 酒燗器 SK30</itemName>
<itemNumber>0296-000030</itemNumber>
<normalItemModel>
<inventoryType>1</inventoryType>
</normalItemModel>
<pageURL>/_shop_4485/0296-000030/</pageURL>
<pointRate>1</pointRate>
<pointType>0</pointType>
<price>108</price>
<units>1</units>
</itemModel>
<postagePrice>0</postagePrice>
<senderModel>
<city>世田谷区 玉川一丁目14番1号</city>
<familyName>楽天</familyName>
<familyNameKana>ラクテン</familyNameKana>
<firstName>testuser_1219</firstName>
<firstNameKana>ジロウ</firstNameKana>
<phoneNumber1>03</phoneNumber1>
<phoneNumber2>1234</phoneNumber2>
<phoneNumber3>5678</phoneNumber3>
<prefecture>東京都</prefecture>
<subAddress>※※ この注文はテスト注文です。誠に申し訳ございませんがキャンセル処理をお願いします。</subAddress>
<zipCode1>158</zipCode1>
<zipCode2>0094</zipCode2>
</senderModel>
</packageModel>
<postagePrice>0</postagePrice>
<requestPrice>208</requestPrice>
<seqId>0</seqId>
<settlementModel>
<settlementName>代金引換</settlementName>
</settlementModel>
<status>発送待ち</status>
<totalPrice>208</totalPrice>
</orderModel>
<orderModel>
<asurakuFlg>0</asurakuFlg>
<cardStatus>12</cardStatus>
<carrierCode>0</carrierCode>
<deliveryModel>
<deliveryName>宅配便</deliveryName>
</deliveryModel>
<deliveryPrice>0</deliveryPrice>
<emailCarrierCode>0</emailCarrierCode>
<enclosureDeliveryPrice>0</enclosureDeliveryPrice>
<enclosureId>0</enclosureId>
<enclosureStatus>0</enclosureStatus>
<firstAmount>108</firstAmount>
<goodsPrice>108</goodsPrice>
<goodsTax>0</goodsTax>
<isBlackUser>false</isBlackUser>
<isGift>false</isGift>
<isGiftCheck>false</isGiftCheck>
<isRakutenMember>true</isRakutenMember>
<modify>false</modify>
<option/>
<orderDate>2018-06-29T18:11:24+09:00</orderDate>
<orderNumber>338459-20180629-00000821</orderNumber>
<orderType>1</orderType>
<ordererModel>
<birthDay>-</birthDay>
<birthMonth>-</birthMonth>
<birthYear>-</birthYear>
<city>世田谷区 玉川一丁目14番1号</city>
<emailAddress>1a7453aa11f3d60c8079efb641659e2cs1@pc.fw.rakuten.ne.jp</emailAddress>
<familyName>楽天</familyName>
<familyNameKana>ラクテン</familyNameKana>
<firstName>testuser_1219</firstName>
<firstNameKana>ジロウ</firstNameKana>
<phoneNumber1>03</phoneNumber1>
<phoneNumber2>1234</phoneNumber2>
<phoneNumber3>5678</phoneNumber3>
<prefecture>東京都</prefecture>
<sex>-</sex>
<subAddress>※※ この注文はテスト注文です。誠に申し訳ございませんがキャンセル処理をお願いします。</subAddress>
<zipCode1>158</zipCode1>
<zipCode2>0094</zipCode2>
</ordererModel>
<packageModel>
<basketId>1697961185</basketId>
<deliveryCompanyId>1000</deliveryCompanyId>
<deliveryPrice>0</deliveryPrice>
<goodsPrice>108</goodsPrice>
<goodsTax>0</goodsTax>
<itemModel>
<basketId>1697961185</basketId>
<isIncludedCashOnDeliveryPostage>false</isIncludedCashOnDeliveryPostage>
<isIncludedPostage>true</isIncludedPostage>
<isIncludedTax>true</isIncludedTax>
<itemId>10000158</itemId>
<itemName>kkbrms3 TESCOM 酒燗器 SK30</itemName>
<itemNumber>0296-000030</itemNumber>
<normalItemModel>
<inventoryType>1</inventoryType>
</normalItemModel>
<pageURL>/_shop_4485/0296-000030/</pageURL>
<pointRate>1</pointRate>
<pointType>0</pointType>
<price>108</price>
<units>1</units>
</itemModel>
<postagePrice>0</postagePrice>
<senderModel>
<city>世田谷区 玉川一丁目14番1号</city>
<familyName>楽天</familyName>
<familyNameKana>ラクテン</familyNameKana>
<firstName>testuser_1219</firstName>
<firstNameKana>ジロウ</firstNameKana>
<phoneNumber1>03</phoneNumber1>
<phoneNumber2>1234</phoneNumber2>
<phoneNumber3>5678</phoneNumber3>
<prefecture>東京都</prefecture>
<subAddress>※※ この注文はテスト注文です。誠に申し訳ございませんがキャンセル処理をお願いします。</subAddress>
<zipCode1>158</zipCode1>
<zipCode2>0094</zipCode2>
</senderModel>
</packageModel>
<postagePrice>0</postagePrice>
<requestPrice>108</requestPrice>
<seqId>0</seqId>
<settlementModel>
<cardModel>
<brandName>JCB</brandName>
<cardNo>XXXX-XXXX-XXXX-3623</cardNo>
<expYM>2020/03</expYM>
<ownerName>TARO RAKUTEN</ownerName>
<payType>0</payType>
</cardModel>
<settlementName>クレジットカード</settlementName>
</settlementModel>
<status>発送待ち</status>
<totalPrice>108</totalPrice>
</orderModel>
</return>
</ns2:getOrderResponse>
</S:Body>
</S:Envelope>
入金状況を確認する際に注意なのですが、楽天マルチ決済、楽天口座決済(銀行振込)については入金状況を確認する術がないらしいです。入金状況を確認できるのは支払い方法がクレジットカード(cardStatus)と楽天バンク決済(rBankStatus)の場合だけなので注意しましょう。この辺問い合わせで詳しく聞いたら担当の方が教えてくれました。
[st-kaiwa-yhei]結構突っ込んだことでも楽天担当は答えてくれるゾ![/st-kaiwa-yhei]
ソースコード解説
やることは超簡単で下記。
- POSTリクエストする検索条件のパラメータのクラスを作成
- SOAPクライアントを用いて検索条件のパラメータクラスでPOSTする
POSTリクエストする検索条件のパラメータのクラスを作成
例のごとくSOAPクライアントを用いて、検索条件のクラスをパラメータにしてコールすると、SOAPクライアントがいい感じのリクエストXMLを作ってくれます。stringで文字列連結してxmlを作る必要はありません。
まずはリクエストとして設定する検索条件のクラスを作成します。
class/getOrderRequestModel.php
<?php
class GetOrderRequestModel
{
// xmlで自動生成するときに順番通りに要素が並ぶ
// RMS APIは順番を組み替えると400が返ってくるので注意すること
public $isOrderNumberOnlyFlg;
public $orderNumber; // 受注番号指定で取得したい場合
public $orderSearchModel; // orderSearchModel(受注検索モデル)オブジェクトをセットする
function __construct() {
}
}
クラスを作ったら、検索条件を入れて、POSTの関数getOrderをコール。
/***
* 受注情報の検索情報セット
* */
// 受注情報を設定
$orderRequestModel = new GetOrderRequestModel();
$orderRequestModel->isOrderNumberOnlyFlg = 0; // false:受注情報を取得
$queryOrderNumber = $_GET[num];
if(empty($queryOrderNumber)) {
// 受注検索モデルを設定
$orderSearchModel = new OrderSearchModel();
$orderSearchModel->dateType = RMS_GET_ORDER_DATE_TYPE_ORDER;
$endDate = new DateTime('now');
$endDate->setTimeZone( new DateTimeZone('Asia/Tokyo'));
$endDate->modify('+1 day'); // 現在時刻の次の日を終了時刻に
$startDate = clone $endDate;
$startDate->modify('-3 day'); // 30日前を開始に
$orderSearchModel->startDate = $startDate->format("Y-m-d");
$orderSearchModel->endDate = $endDate->format("Y-m-d");
//受注検索モデルを受注情報にセット
$orderRequestModel->orderSearchModel = $orderSearchModel;
} else {
// 受注番号指定の場合下記を設定
$orderNumber = array($queryOrderNumber); // 複数指定可能
$orderRequestModel->orderNumber = $orderNumber; // 受注番号を受注情報にセット
}
// 楽天へRMS APIを使って送信
list($request, $httpStatusCode, $response) = getOrder($orderRequestModel);
SOAPクライアントを用いて検索条件のパラメータクラスでPOSTする
検索条件のクラスをSOAPクライアントに入れて実行することで、SOAPクライアントが自動でリクエストXMLを作ってPOSTしてくれます。
API申請時に発行したサービスシークレットとライセンスキーを入れる必要があります。★部分。
getOrder.php
function getOrder($orderRequestModel) {
//パラメータセット
$userAuthModel = new UserAuthModel();
$userAuthModel->authKey = "ESA " . base64_encode(RMS_SERVICE_SECRET . ':' . RMS_LICENSE_KEY); // ★
$userAuthModel->shopUrl = RMS_SETTLEMENT_SHOP_URL;
$userAuthModel->userName = RMS_SETTLEMENT_USER_NAME;
$requestArray = _convertClassObjectToArray($orderRequestModel);
$requestArray = _deleteEmptyElements($requestArray);
$params = array('arg0' => _convertClassObjectToArray($userAuthModel),
'arg1' => $requestArray);
// customVarDump($params);
//エラーを無視するエラーハンドラに切り替える(実行後は元に戻す)
set_error_handler("myErrorHandler");
try{
$client = new SoapClient(RMS_API_ORDER_SOAP_WSDL, array('trace' => 1 ));
//エラーハンドラ回復
restore_error_handler();
} catch (Exception $e) {
//エラーハンドラ回復
restore_error_handler();
return array(null, "400", $e->getMessage()); // 適切に対処した方が良い
//WSDLファイルの読み込みに失敗した場合の処理
}
try{
//SOAP通信実行
$result = $client->getOrder($params);
// customVarDump($result);
} catch (SoapFault $e) {
// customVarDump($e);
//SOAP通信の実行に失敗した場合の処理
}
// customVarDump($client->__getLastRequest());
// customVarDump($client->__getLastResponse());
// return array($client->__getLastRequest(), extract_response_http_code($client->__getLastResponseHeaders()), $result);
return array($client->__getLastRequest(), extract_response_http_code($client->__getLastResponseHeaders()), $client->__getLastResponse());
}
// エラーハンドラ関数
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
}
authoriの時と同じくSOAPクライアントにWSDLファイルを渡すのがミソです。order APIの場合はwsdlファイルのURLは下記でした。
https://api.rms.rakuten.co.jp/es/1.0/order/ws?WSDL
まとめ
getOrderを使えば、注文が入った際にオーソリをしてみたり、受注状況を見て何かをしたい場合に威力を発揮します。
試してみたい方は是非下記から資料請求などをして準備をはじめてみてくださいね。