銷售管理 API(Orders / OMS API)的使用方式
API
OAuth
銷售管理
OMS
訂單
CRUD
Android
iOS
本指南的目的
本文彙整使用 ReceiptRoller 的銷售管理 API(Orders / OMS API),建立、取得、更新、狀態轉移(確認/處理中/取消/店鋪 POS 接收)、刪除商業帳戶底下訂單的方法。這是在整合 Web 接單、電話訂單、市集平台串接等店鋪銷售通路時的入口指南。
前提
- 已透過 OAuth 2.0 授權碼流程取得存取權杖
- 應用程式的權限範圍中包含
store.orders.read(讀取)/store.orders.write(建立、更新、刪除、狀態轉移) - 已得知商業帳戶 ID(UUID)(取得商業帳戶、店鋪、POS 端末的一覽)
- 基底 URL:
https://receiptroller.io
端點一覽
| 方法 | 路徑 | 用途 | 必要權限範圍 |
|---|---|---|---|
| GET | /api/v1/orders | 訂單一覽(以 status / channel / paymentStatus 篩選) | store.orders.read |
| GET | /api/v1/orders/{orderId} | 1 筆訂單的詳細 | store.orders.read |
| POST | /api/v1/orders | 訂單的新增建立 | store.orders.write |
| PUT | /api/v1/orders/{orderId} | 訂單的更新(顧客、地址、明細、金額等) | store.orders.write |
| POST | /api/v1/orders/{orderId}/confirm | 狀態轉移:保留中 → 已確認 | store.orders.write |
| POST | /api/v1/orders/{orderId}/process | 狀態轉移:已確認 → 處理中 | store.orders.write |
| POST | /api/v1/orders/{orderId}/cancel | 狀態轉移:取消 | store.orders.write |
| POST | /api/v1/orders/{orderId}/fulfill-via-pos | 狀態轉移:於店鋪 POS 接收完成(→ Delivered) | store.orders.write |
| DELETE | /api/v1/orders/{orderId} | 訂單的刪除 | store.orders.write |
訂單狀態的種類
| 狀態 | 中文 | 說明 |
|---|---|---|
Pending | 保留中 | 已接單,但尚未確認 |
Confirmed | 已確認 | 店鋪端已確認接單 |
Processing | 處理中 | 包裝、出貨準備中 |
Shipped | 已出貨 | 出貨完成(也可能透過 WMS 串接自動更新) |
Delivered | 配送完成 | 已完成配送給顧客(也可能經由店鋪 POS 接收轉移至此) |
Cancelled | 取消 | 訂單取消 |
Refunded | 已退款 | 退款處理已完成 |
1. 取得訂單一覽
GET /api/v1/orders?organizationId={organizationId}&status=Pending
Authorization: Bearer {access_token}
查詢參數(選填)
status— 以訂單狀態篩選channel— Web / POS / Phone / Manual / MarketplacepaymentStatus— Unpaid / Paid / Refunded / PartialRefund
回應為 orders 陣列中的訂單物件。各物件的主要欄位請參閱下方的「訂單物件的結構」。
2. 取得 1 筆訂單的詳細
GET /api/v1/orders/{orderId}?organizationId={organizationId}
Authorization: Bearer {access_token}
3. 新增建立訂單
POST /api/v1/orders?organizationId={organizationId}
Authorization: Bearer {access_token}
Content-Type: application/json
{
"orderNumber": "RR-2026-0002",
"channel": "Phone",
"customerName": "佐藤花子",
"customerEmail": "hanako@example.com",
"customerPhone": "080-9876-5432",
"shippingAddress": {
"postalCode": "100-0001",
"prefecture": "東京都",
"city": "千代田区",
"line": "千代田1-1"
},
"items": [
{ "productId": "prd-002", "productName": "アイスティー", "sku": "TEA-ICE-001",
"quantity": 3, "unitPrice": 380, "subtotal": 1140 }
],
"paymentMethod": "BankTransfer",
"paymentStatus": "Unpaid",
"subtotalAmount": 1140,
"taxAmount": 114,
"shippingAmount": 500,
"totalAmount": 1754,
"linkedStoreId": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"notes": "電話受注。日中の配達希望。"
}
重點
- 僅
customerName為必填 - 即使在請求本文包含
organizationId也會被忽略。一定會使用以權杖/查詢解析出的商業帳戶 - 初始狀態恆為
Pending。要推進狀態請使用專用的轉移端點
4. 更新訂單
PUT /api/v1/orders/{orderId}?organizationId={organizationId}
Authorization: Bearer {access_token}
Content-Type: application/json
{
"customerName": "佐藤花子",
"customerPhone": "080-9876-5432",
"shippingAddress": { "postalCode": "100-0001", "prefecture": "東京都",
"city": "千代田区", "line": "千代田1-1-1(番地修正)" },
"items": [ ... ],
"subtotalAmount": 1140, "taxAmount": 114, "shippingAmount": 500, "totalAmount": 1754
}
重點
- 請勿用於狀態變更。狀態的規則是要透過
/confirm//process//cancel//fulfill-via-pos更新(以便稽核日誌正確保留操作種類) - 以 POS 接收關聯的
linkedPosTransaction資訊也無法以 PUT 更新 — 僅限透過專用端點 - 付款狀態(
paymentStatus)可更新 orderNumber與createdAt無法更新(伺服器端保護)
5. 推進狀態(確認 → 處理中 → 出貨等)
確認(Pending → Confirmed)
POST /api/v1/orders/{orderId}/confirm?organizationId={organizationId}
設為處理中(Confirmed → Processing)
POST /api/v1/orders/{orderId}/process?organizationId={organizationId}
取消
POST /api/v1/orders/{orderId}/cancel?organizationId={organizationId}
狀態轉移端點會回傳更新後的完整訂單物件作為回應。
※ 至出貨(Shipped)/配送完成(Delivered)/退款(Refunded)的轉移,目前會透過 WMS/結帳系統串接自動發生。若想從應用程式直接轉移,請在 社群 告知使用情境。
6. 於店鋪 POS 接收(線上訂單的店頭交付)
這是將「顧客於線上下單 → 於店鋪櫃台接收 → 於收銀結帳」的流程以一次操作完結的端點。會將 POS 交易與 OMS 訂單相互連結,並將訂單一口氣轉移至 Delivered + Paid。
POST /api/v1/orders/{orderId}/fulfill-via-pos?organizationId={organizationId}
Authorization: Bearer {access_token}
Content-Type: application/json
{
"posTerminalId": "term-001",
"posTransactionId": "tx-9001"
}
動作
- 在 OMS 訂單的
linkedPosTransaction記錄{ terminalId, transactionId } - 在 POS 交易的
links.omsOrderId記錄訂單 ID(反方向連結) - 將訂單狀態轉移至
Delivered - 若付款狀態為
Unpaid則變更為Paid,並記錄paidAt(因已於收銀結帳完成) - 在時間軸追加「FulfilledViaPos」項目
- 觸發訂單更新 Webhook(
order.updated)— 承載中會包含linked_pos_terminal_id與linked_pos_transaction_id
冪等性
- 以相同
posTransactionId對同一訂單再次呼叫也無副作用。對重試/二次點擊是安全的
錯誤情況
- 找不到訂單 / POS 交易 →
404 - POS 交易已關聯至其他 OMS 訂單 →
404(防止衝突) - POS 交易不屬於此商業帳戶 →
404(防止跨租戶)
回應範例(訂單物件的一部分)
{
"id": "ord-001",
"status": "Delivered",
"payment": { "method": "CreditCard", "status": "Paid", "paidAt": "2026-06-01T13:42:00Z" },
"linkedStore": { "id": "f47ac10b-...", "name": "渋谷店" },
"linkedPosTransaction": {
"terminalId": "term-001",
"transactionId": "tx-9001"
},
...
}
使用情境
- 顧客於 Web
Pending下單 → 在店鋪的收銀應用程式POST /confirm→ 交付商品 → 於收銀結帳 → POS 交易記錄後立即從收銀應用程式POST /fulfill-via-pos - 在交易一覽(Transactions API)中,POS 列與 OMS 列雙方都會相互持有連結,UI 端即可控制重複顯示
7. 刪除訂單
DELETE /api/v1/orders/{orderId}?organizationId={organizationId}
Authorization: Bearer {access_token}
回應為 204 No Content。已刪除訂單會從一覽、搜尋結果中消失。
訂單物件的結構
{
"id": "ord-001",
"orderNumber": "RR-2026-0001",
"channel": "Web",
"status": "Pending",
"customer": { "name": "...", "email": "...", "phone": "..." },
"shippingAddress": { "postalCode": "...", "prefecture": "...", "city": "...", "line": "..." },
"items": [ { "productId": "...", "productName": "...", "sku": "...",
"quantity": 2, "unitPrice": 480, "subtotal": 960 } ],
"itemCount": 2,
"payment": { "method": "CreditCard", "status": "Paid", "paidAt": "..." },
"amounts": { "subtotal": 960, "tax": 96, "shipping": 500, "discount": 0, "total": 1556 },
"linkedStore": { "id": "...", "name": "..." },
"linkedPosTransaction": null, // 若已於店鋪POS接收則為 { terminalId, transactionId }
"notes": "...",
"preOrder": { "isPreOrder": false, "targetShipDate": null },
"createdAt": "...",
"updatedAt": "..."
}
明細(Items)的結構
{
"productId": "prd-001",
"productName": "ブレンドコーヒー M",
"sku": "CFE-BLD-M",
"quantity": 2,
"unitPrice": 480,
"subtotal": 960,
"unit": "個"
}
productId 為 ReceiptRoller 商品主檔的 ID(可透過 商品管理 API 取得)。經由 POS 或 EC 外部系統的訂單,也可以不帶 productId,僅送 productName + sku。
典型的流程(行動應用程式)
- 以 OAuth 取得存取權杖 → 權限範圍包含
store.orders.read與store.orders.write - 以
GET /api/v1/me/organizations選擇商業帳戶 - 在接單儀表板畫面取得
GET /api/v1/orders?status=Pending - 在新增接單畫面
POST /api/v1/orders(在此之前先以GET /api/v1/products選擇商品) - 在訂單詳細畫面點「確認」按鈕 →
/confirm - 包裝負責人「設為處理中」 →
/process - 在店鋪的收銀應用程式「店鋪接收完成」 → 指定 POS 交易 ID 呼叫
/fulfill-via-pos - 因顧客因素取消 →
/cancel
錯誤回應
| 狀態 | 意義 | 因應 |
|---|---|---|
| 401 Unauthorized | 存取權杖無效/過期 | 以刷新權杖重新取得 |
| 403 Forbidden | 缺少必要權限範圍/非商業帳戶的成員 | 確認權限範圍與選擇中的商業帳戶 |
| 400 Bad Request | 必填欄位不足(customerName / posTerminalId / posTransactionId)/本文為空 | 檢查請求 |
| 404 Not Found | 訂單 ID 不存在於該商業帳戶//fulfill-via-pos 找不到 POS 交易/已關聯至其他訂單 | 從一覽重新取得,若為衝突則指定其他交易 |
相關資訊
發布日: 2026-06-01
更新日: 2026-07-06
標籤
API (22)
OAuth (15)
Android (10)
iOS (9)
Webhook (8)
api (7)
oauth (5)
POS串接 (4)
getting-started (4)
參考 (4)
相關文章
-
店鋪資訊 API(Store Information API)的使用方式說明如何以 REST API 取得、更新店鋪的基本資訊(店鋪名稱、店鋪類別、聯絡方式、地址)。可從員工應用程式等以權杖驗證的用戶端實作店鋪資訊的編輯畫面。
-
店內媒體顯示器 API(Display API)的使用方式ReceiptRoller 店內 Android 顯示器 API(/api/v1/displays/*)的概要,以及配對、心跳、播放清單取得、播放實績回報的步驟彙整。這是為在 Android 電子看板或店內數位看板端末播放媒體循環而實作應用程式的入門指南。
-
交易一覽 API(Transactions API:POS+OMS 整合摘要)的使用方式ReceiptRoller 的 Transactions API 是將收銀營業額(PosTransactions)與銷售管理訂單(OmsOrders)整合為單一摘要的唯讀 API。在 Android/iOS 應用程式中一覽顯示「整個商業帳戶的交易」時,即為入口。
-
營業額實績 API(Sales API)的使用方式彙整 ReceiptRoller 營業額實績 API(/api/v1/sales/*)的概要,以及依商業帳戶、店鋪、POS 端末、期間的篩選方法。這是一份涵蓋實際回應結構(KpiValue 巢狀型)與 averageTicket、權杖有效期限(8 小時)在內,為在 Android/iOS 行動應用程式或伺服器串接實作營業額儀表板的入門指南。
-
營業時間 API(Business Hours API)的使用方式ReceiptRoller 營業時間 API(/api/v1/stores/{storeId}/business-hours)的指南。解說每個星期的營業時間的取得與更新、特別營業日(臨時歇業、營業時間變更)的登錄、店鋪的可營業時間(排班建立時的上限業務時間)的設定,以及目前是否營業中的判定。