API 驗證指南

API驗證 OAuth 2.0 授權碼 開發者指南

驗證指南

ReceiptRoller API 使用 OAuth 2.0 授權碼流程。 伺服器端的開發者登錄應用程式,商業帳戶業主許可存取後,開發者就可以取得權杖呼叫 API。


步驟1:登錄應用程式

  1. 登入 ReceiptRoller 帳戶
  2. 移動到 商業帳戶詳細⋮ 選單開發者應用程式
  3. 點擊 建立應用程式
  4. 輸入、選擇應用程式名、重新導向 URI、必要的 API 權限範圍
  5. 建立後,client_idclient_secret 會被發行
⚠ 重要:client_secret 只顯示一次。請務必複製並安全保管。遺失的情況需要重新產生(既有的密鑰會立即無效)。

步驟2:將商業帳戶業主重新導向至授權畫面

商業帳戶業主將帳戶串接至應用程式時,將瀏覽器重新導向至以下的 URL:

GET https://your-domain/oauth/authorize
    ?client_id=YOUR_CLIENT_ID
    &redirect_uri=YOUR_REDIRECT_URI
    &response_type=code
    &scope=store.products.read store.orders.read
    &state=RANDOM_STATE_STRING
參數 必填 說明
client_id 應用程式的用戶端 ID
redirect_uri 需要與應用程式登錄的重新導向 URI 完全一致
response_type 請指定 code
scope 空格分隔的權限範圍一覽(參照下記的可利用的權限範圍
state 建議 為防止 CSRF 攻擊的隨機字串。回呼時會原封不動回傳。
code_challenge 任意 PKCE 碼挑戰(code_verifier 的 SHA-256 雜湊以 base64url 編碼)
code_challenge_method 任意 S256(使用 PKCE 時必填)

商業帳戶業主會看到顯示了應用程式名與被要求的存取權限的同意畫面。可選擇許可或拒否。


步驟3:接收授權碼

被許可的情況,商業帳戶業主的瀏覽器會被重新導向至 redirect_uri

GET https://your-app.com/callback
    ?code=AUTHORIZATION_CODE
    &state=RANDOM_STATE_STRING

被拒否的情況:

GET https://your-app.com/callback
    ?error=access_denied
    &state=RANDOM_STATE_STRING
ℹ 注意: 授權碼的有效期限是10 分鐘,只能使用一次。

步驟4:將碼交換為權杖

從伺服器端(而非瀏覽器),以下面的 POST 請求將碼交換為存取權杖:

POST /api/v1/auth/token
Content-Type: application/json

{
    "grantType": "authorization_code",
    "clientId": "YOUR_CLIENT_ID",
    "clientSecret": "YOUR_CLIENT_SECRET",
    "code": "AUTHORIZATION_CODE",
    "redirectUri": "YOUR_REDIRECT_URI"
}

成功回應(200):

{
    "accessToken": "aBcDeFgH1234567890...",
    "refreshToken": "xYzAbCdEfG098765...",
    "tokenType": "Bearer",
    "expiresIn": 3600,
    "scope": "store.products.read store.orders.read"
}
欄位 說明
accessToken 呼叫 API 時使用。有效期限是 1 小時。
refreshToken 存取權杖的有效期限過了時,用於取得新的權杖。有效期限是 30 天。
expiresIn 權杖的有效期間(秒)。3600 = 1 小時
scope 商業帳戶業主核准的權限範圍

步驟5:呼叫 API

將存取權杖含入 Authorization 標頭請求:

GET /api/v1/store/products
Authorization: Bearer aBcDeFgH1234567890...
Content-Type: application/json

API 會回傳繫在許可應用程式的商業帳戶的資料。只能存取以被核准的權限範圍許可的資料。


步驟6:刷新過期權杖

存取權杖的有效期限過了的情況,使用刷新權杖取得新的權杖配對:

POST /api/v1/auth/token
Content-Type: application/json

{
    "grantType": "refresh_token",
    "clientId": "YOUR_CLIENT_ID",
    "clientSecret": "YOUR_CLIENT_SECRET",
    "refreshToken": "xYzAbCdEfG098765..."
}

回應形式與步驟4相同。舊的存取權杖與刷新權杖會被無效化,回傳新的配對。


權杖的取消

要取消存取權杖或刷新權杖:

POST /api/v1/auth/revoke
Content-Type: application/json

{
    "token": "要取消的權杖",
    "clientId": "YOUR_CLIENT_ID"
}

商業帳戶業主可從帳戶設定隨時取消應用程式的存取。


錯誤回應

HTTP狀態 錯誤 說明
400 unsupported_grant_type 只支援 authorization_coderefresh_token
400 invalid_request 必填參數不足
401 invalid_grant 無效的碼、過期的碼、驗證資訊的不一致,或重新導向 URI 的不一致
400 invalid_client 不明的 client_id
400 invalid_redirect_uri redirect_uri 與登錄的 URI 不一致

可利用的權限範圍

Store(店鋪)

權限範圍 說明
store.products.read 取得商品、庫存資訊
store.products.write 進行商品的建立、更新
store.orders.read 取得訂購資料
store.orders.write 更新訂購狀態
store.customers.read 取得顧客資料
store.coupons.read 取得優惠券資料
store.coupons.write 進行優惠券的建立、更新
store.inventory.read 取得倉庫、庫存資料

CRM(顧客關係管理)

權限範圍 說明
crm.profiles.read 取得 CRM 顧客檔案
crm.segments.read 取得 CRM 分群、排名

SNS / 分析

權限範圍 說明
sns.content.read 取得 SNS 貼文資料
sns.audience.read 取得 SNS 觀眾資料
analytics.read 取得分析快照

流程圖

┌──────────────┐     ┌──────────────┐     ┌──────────────────┐
│  您的應用程式 │     │ 商業帳戶     │     │  ReceiptRoller  │
│  (開發者)  │     │ 業主        │     │  平台表單        │
└──────┬───────┘     └──────┬───────┘     └────────┬─────────┘
       │                    │                      │
       │  1. /oauth/authorize 重新導向              │
       │───────────────────▶│──────────────────────▶│
       │                    │                      │
       │                    │  2. 顯示同意畫面     │
       │                    │◀─────────────────────│
       │                    │                      │
       │                    │  3. 許可             │
       │                    │──────────────────────▶│
       │                    │                      │
       │  4. 以 ?code=授權碼 重新導向               │
       │◀───────────────────│◀─────────────────────│
       │                    │                      │
       │  5. POST /api/v1/auth/token               │
       │  (code + client_id + client_secret)    │
       │──────────────────────────────────────────▶│
       │                                           │
       │  6. { accessToken, refreshToken }         │
       │◀──────────────────────────────────────────│
       │                                           │
       │  7. GET /api/v1/store/products            │
       │  Authorization: Bearer {accessToken}      │
       │──────────────────────────────────────────▶│
       │                                           │
       │  8. { data: [...] }                       │
       │◀──────────────────────────────────────────│

安全性的最佳實踐

  • client_secret 請只保管在伺服器端。絕對不要含入前端的程式碼或行動應用程式。
  • 為防止 CSRF 攻擊,請務必驗證 state 參數。
  • 行動應用程式或單頁應用程式的情況,請使用 PKCE(code_challenge / code_verifier)。
  • 權杖請安全保管。請勿將存取權杖記錄於日誌,或含入 URL。
  • 為避免服務的中斷,請在有效期限過期前實作權杖的刷新。
  • 請只請求應用程式實際需要的權限範圍。
發布日: 2026-03-27 更新日: 2026-07-05
標籤
API (22) OAuth (15) Android (10) iOS (9) Webhook (8) api (7) oauth (5) POS串接 (4) getting-started (4) 參考 (4)