TECH JOURNAL

楽天 RMS Web API で注文管理を自動化する — 受注確認から出荷完了まで全フロー実装

ShareXB!
楽天 RMS Web API で注文管理を自動化する — 受注確認から出荷完了まで全フロー実装
目次

はじめに

楽天市場の注文処理は、受注確認・在庫確保・発送・伝票番号登録・出荷完了通知と多くのステップがある。これを手動でやると確認漏れや入力ミスが起きやすく、さらに注文数が増えると運用が破綻する。

RMS Web API を使って、受注から出荷完了までを自動化するフローを実装する。

RMS Web API の基本

楽天 RMS Web API は REST API ではなく XML-RPC スタイル の独自プロトコルで、認証は Basic 認証をベースにした ESA serviceSecret:licenseKey 形式になる。

// 認証ヘッダの生成
function buildAuthHeader(serviceSecret: string, licenseKey: string): string {
  const credentials = Buffer.from(`${serviceSecret}:${licenseKey}`).toString("base64")
  return `ESA ${credentials}`
}
 
// API リクエストの基本構造
async function callRmsApi(endpoint: string, params: Record<string, unknown>) {
  const response = await fetch(`https://api.rms.rakuten.co.jp/es/${endpoint}`, {
    method: "POST",
    headers: {
      Authorization: buildAuthHeader(SERVICE_SECRET, LICENSE_KEY),
      "Content-Type": "application/json; charset=utf-8",
    },
    body: JSON.stringify(params),
  })
  return response.json()
}

Step 1: 未確認注文の取得

order/1.0/searchOrder で orderProgressList に 100(注文確認待ち)を指定して未確認注文を取得する。

async function getUnconfirmedOrders() {
  const result = await callRmsApi("order/1.0/searchOrder", {
    orderProgressList: [100], // 100: 注文確認待ち
    PaginationRequestModel: {
      requestRecordsAmount: 100,
      requestPage: 1,
    },
  })
 
  return result.orderNumberList ?? []
}

searchOrder は注文番号リストしか返さない。詳細は別途 order/1.0/getOrder で取得する必要がある。

Step 2: 注文詳細の取得

async function getOrderDetails(orderNumberList: string[]) {
  const result = await callRmsApi("order/1.0/getOrder", {
    orderNumberList,
  })
  return result.orderModelList ?? []
}

Step 3: 受注確認(注文ステータスを「受注確認済み」に更新)

async function confirmOrders(orderNumberList: string[]) {
  return callRmsApi("order/1.0/confirmOrder", {
    orderNumberList,
  })
}

これをしないと注文が「注文確認待ち」のままになり、楽天から催促が来る。受注後 24 時間以内 に確認しないとペナルティの対象になる。

Step 4: 伝票番号の登録

配送業者から追跡番号を受け取ったら order/1.0/updateOrderShipping で登録する。

async function registerShippingInfo(
  orderNumber: string,
  shippingModel: {
    deliveryCompany: string // 配送会社コード
    shippingNumber: string  // 追跡番号
  }
) {
  return callRmsApi("order/1.0/updateOrderShipping", {
    orderNumber,
    orderSenderModel: {
      shippingCarrierId: shippingModel.deliveryCompany,
      shippingNumber: shippingModel.shippingNumber,
    },
  })
}

楽天の配送会社コードは数字(例: ヤマト運輸=2, 佐川急便=1)。コード表は RMS Web サービス仕様書を参照。

Step 5: 出荷完了通知

伝票番号登録後、order/1.0/updateOrderProgress で注文ステータスを「発送済み」に変更する。

async function markAsShipped(orderNumberList: string[]) {
  return callRmsApi("order/1.0/updateOrderProgress", {
    orderProgressList: [
      {
        orderProgress: 700, // 700: 発送済み
        orderNumberList,
      },
    ],
  })
}

これで楽天から顧客への発送通知メールが自動送信される。

全フローをまとめる

async function processNewOrders() {
  // 1. 未確認注文の取得
  const orderNumbers = await getUnconfirmedOrders()
  if (orderNumbers.length === 0) return
 
  // 2. 受注確認
  await confirmOrders(orderNumbers)
 
  // 3. 注文詳細取得 → WMS へ連携
  const orders = await getOrderDetails(orderNumbers)
  for (const order of orders) {
    await sendToWms(order)
  }
}
 
// WMS から追跡番号を受け取った後
async function handleShipment(orderNumber: string, trackingNumber: string) {
  // 4. 伝票番号登録
  await registerShippingInfo(orderNumber, {
    deliveryCompany: "2", // ヤマト運輸
    shippingNumber: trackingNumber,
  })
 
  // 5. 出荷完了通知
  await markAsShipped([orderNumber])
}

レートリミットと注意点

RMS Web API にはレートリミットがある。1 回の getOrder で取得できる注文は最大 100 件なので、注文数が多い場合はページネーションが必要。また searchOrder は「受注確認待ち」の注文数が多いとタイムアウトすることがあるため、タイムウィンドウ(dateType=1 + startDatetime / endDatetime)で絞り込む。

まとめ

RMS Web API は XML-RPC 的な独自仕様で最初はとっつきにくいが、フローを分解すると各ステップのエンドポイントが明確なのでシンプルに実装できる。注文確認の 24 時間ルールを自動化することが最初の優先事項になる。

ShareXB!

この記事を書いた人

渡部 誠也

執行役員 / CTO

独立系 SIer で Web・組み込み・基幹システムの開発を経験し、2017 年に illustrious へ。CTO としてシステム開発事業を立ち上げ、要件定義からコーディングまで一貫して担う。EC に特化した Web アプリケーションを数多く手がける。

ECの業務やシステムについて、
ご相談ください。

いまの運用で困っていること、実現したいことから、一緒に整理します。