API 驗證指南
API驗證
OAuth 2.0
授權碼
開發者指南
驗證指南
ReceiptRoller API 使用 OAuth 2.0 授權碼流程。 伺服器端的開發者登錄應用程式,商業帳戶業主許可存取後,開發者就可以取得權杖呼叫 API。
步驟1:登錄應用程式
- 登入 ReceiptRoller 帳戶
- 移動到 商業帳戶詳細 → ⋮ 選單 → 開發者應用程式
- 點擊 建立應用程式
- 輸入、選擇應用程式名、重新導向 URI、必要的 API 權限範圍
- 建立後,
client_id與client_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_code 與 refresh_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