API 參考
這裡是 Payment API 每一支端點的完整規格。第一次串接請先看快速開始。
所有欄位、限制與錯誤碼都依正式環境 v10.3.1.1 的程式核對,並依 v10.3.5.3 補上之後的變更;交易的 invoice 欄位與發票通知依 v10.3.3.2 核對。也可以下載 OpenAPI 定義檔,匯入 Postman 等工具。
| 環境 | API | 結帳頁 |
|---|---|---|
| 正式 | https://payment-api.oen.tw |
https://{merchantId}.oen.tw |
| 測試 | https://payment-api.testing.oen.tw |
https://{merchantId}.testing.oen.tw |
每個請求都帶:
Authorization: Bearer <token>Content-Type: application/json- token 在 CRM 產生,測試與正式環境各一把,不能互用。見驗證與 token。
Bearer要照這個大小寫,中間只有一個空白。- 有 body 的請求要帶
merchantId,而且必須是 token 所屬的網域。 - 只能從伺服器呼叫。API 不支援瀏覽器跨網域請求,token 也不能放在前端。
成功時 HTTP 200:
{ "code": "S0000", "data": { }, "message": "" }失敗時:
{ "code": "V0001", "data": {}, "message": "must have required property 'orderId'" }- 程式判斷請看
code,message的文字可能調整。 - 付款結果不明時是 HTTP 409,另外帶
"retryable": false,見 C026。 - 個人身分商家被風控拒絕時(
K0001),另外帶detail。 - 沒有值的欄位不會出現在回應裡。
- 找不到路徑時回 404、不支援的 HTTP method 回 405,body 是純文字,不是上面的 JSON 格式。
- 被正式環境的 IP 白名單擋下時回 403,body 只有
message欄位(通常是Forbidden),沒有code。
- body 必須是合法的 JSON,否則回 500
F0001。 - 規格裡沒有的欄位會被忽略,不會報錯。所以欄位名稱拼錯時不會有任何提示,請對照各端點的欄位表。例如 Payment API 沒有
webhookUrl、cancelUrl這類欄位,付款通知網址在 CRM 設定。 - 驗證失敗回 400
V0001,message會列出所有不符合的規則,但不一定有欄位名稱。
查詢交易列表與查詢商店定期購列表每頁 50 筆。回應的 page 是下一頁的分頁標記,原封不動放進下一次請求的 ?page=;沒有下一頁時是 null。請以 page 是不是 null 判斷有沒有下一頁,不要看這一頁有幾筆。標記無效時回 500 F0001。
- 回應的時間都是 UTC 的 ISO 8601 字串,例如
2026-09-28T02:40:25.502Z。 - 你送出的日期(
startDate、expectedPayoutDate)格式是yyyy/MM/dd,以台北日期解讀。 - 定期定額每天台北時間上午 9 點扣款。
| 名稱 | 格式 | 用在 |
|---|---|---|
交易 id/transactionId |
27 字元英數 | 組結帳頁網址、付款通知、查詢交易明細 |
交易編號 transactionHid |
P + 日期 + 8 碼,共 17 字元,例如 P20260928AB12CD34 |
退款、對帳、CRM 搜尋 |
| 定期定額編號 | S + 日期 + 8 碼,共 17 字元 |
查詢與取消定期定額 |
orderId |
你自己的訂單編號 | 用訂單編號查詢 |
冪等性與頻率限制
Section titled “冪等性與頻率限制”Idempotency-Key
Section titled “Idempotency-Key”下列端點支援 Idempotency-Key header:POST /checkout、POST /checkout-subscription、POST /checkout-schedule、POST /checkout-token、POST /token/transactions、POST /token/subscriptions、POST /refunds/{transactionHid}、PUT /subscriptions/{subscriptionHid}。
Idempotency-Key: A20260928001-charge-1- key 是 1 到 255 個 ASCII 可見字元(不含空白)。格式不符回 400
V0001(INVALID_IDEMPOTENCY_KEY)。建議用訂單編號加上用途與次數。 - 範圍是「你的網域+端點」,同一把 key 用在不同端點互不影響。
- 同一把 key、相同的請求(method、路徑與 body 都相同)重送:直接回第一次的狀態碼與 body,回應 header 帶
Idempotency-Replayed: true,不會再扣款或退款。 - 同一把 key、不同的請求:回 422
I0001。 - 第一次的請求還在處理:回 409
I0002,請稍後用同一把 key 重送。 POST /token/transactions、POST /token/subscriptions、POST /refunds/{transactionHid}:第一次的請求已經開始扣款或退款,超過 5 分鐘仍沒有結果時,回 409I0003,detail.resourceId是交易編號(P開頭)或定期定額編號(S開頭)。同一把 key 不會再執行,請用這個編號或訂單編號查詢結果。- 四支建立結帳頁的 API(
/checkout、/checkout-subscription、/checkout-schedule、/checkout-token)沒有這層保護:如果第一次的請求已經建立資料、但回應沒有保存下來(例如中途中斷),5 分鐘後用同一把 key 重送可能再建立一筆。結果不明時,請依資源種類查詢交易或定期定額;綁卡請求無法用訂單編號查回,請聯絡應援確認。 - 取消定期定額也沒有這層保護,但重送不會建立新的定期定額;結果不明時,請用定期定額編號查詢目前狀態。
- 只有進入處理前的欄位格式驗證失敗不會用掉這把 key。處理過程中回的 400
V0001(例如PRODUCT_AMOUNT_NOT_MATCH)可能已經記住,修改內容後請換一把新的 key。 - 第一次收到 5xx 或 429、而且還沒開始扣款或退款時,不會記住結果,可以用同一把 key 重送;退款確定沒有送出時(例如回
R0001),也可能不記住。其他結果確定的 4xx(例如發卡銀行拒絕)會記住,同一把 key 重送會拿到同一個錯誤。 - key 保留 24 小時,之後同一把 key 視為新的請求。
- 不帶 header 時行為不變:同樣的請求送兩次,就會建立兩筆交易。
- 目前沒有對個別商家限制請求頻率,但請不要高頻率輪詢;日後可能開始限制。
| Method | Path | 說明 |
|---|---|---|
| POST | /checkout |
建立單次付款 |
| POST | /checkout-subscription |
建立定期定額 |
| POST | /checkout-schedule |
建立預約定期定額 |
| POST | /checkout-token |
建立綁卡頁 |
| POST | /token/transactions |
用 token 扣款 |
| POST | /token/subscriptions |
用 token 建立定期定額 |
| GET | /transactions/{id} |
查詢交易明細 |
| GET | /transactions |
查詢交易列表 |
| GET | /order/{orderId}/transactions |
用訂單編號查詢交易 |
| POST | /refunds/{transactionHid} |
退款 |
| GET | /subscriptions/{id} |
查詢定期定額明細 |
| PUT | /subscriptions/{subscriptionHid} |
取消定期定額 |
| POST | /subscriptions/{subscriptionHid}/change-card-checkout |
建立換卡頁 |
| GET | /subscriptions |
查詢商店定期購訂單列表 |
需要傳送完整卡號的 API 必須符合 PCI DSS 規範,不在本站公開。若你的情境確實需要,請聯絡業務人員個別討論。
導覽助手暫停服務中。請使用右上角的搜尋,或聯絡客服。
我可以幫你選擇收款方式、回答 API 串接與 CRM 操作問題,並附上文件出處。
