跳到內容

建立換卡頁

在 ChatGPT 開啟在 Claude 開啟

POST /subscriptions/:subscriptionHid/change-card-checkout

  • 正式環境:https://payment-api.oen.tw/subscriptions/:subscriptionHid/change-card-checkout
  • 測試環境:https://payment-api.testing.oen.tw/subscriptions/:subscriptionHid/change-card-checkout

為一筆 Payment API 建立的定期定額建立換卡頁,回傳 checkoutUrl。把消費者導到這個網址輸入新卡並完成 3D 驗證。換卡頁 15 分鐘內有效。換卡成功後送出 subscription_card_changed 通知;扣款失敗(retryScheduled、error)的定期定額換卡成功後,會用新卡補扣失敗的那一期,結果以 charge 通知送出。目前只支援信用卡由 CyberSource 收單的網域。這支 API 不支援 Idempotency-Key,改用 requestId 防止重複建立。

Header 帶 Authorization: Bearer <token> 與 Content-Type: application/json 。token 的取得方式見驗證與 token。

欄位型別必填說明
subscriptionHidstring必填S 開頭的定期定額編號(17 字元)。只接受 Payment API 建立的定期定額。
欄位型別必填說明
merchantIdstring必填你的網域名稱。例如應援頁是 https://ming.oen.tw,就填 ming。必須與 token 所屬的網域相同,不同會回 400 V0001。
範例:ming
requestIdstring必填你自訂的換卡請求編號,用來防止重複建立。同一個 requestId 再送一次會回 409 C0010,只帶原本換卡頁的 checkoutSessionId 與 expiresAt,不會再給 checkoutUrl,請妥善保存第一次的回應。
限制:1 到 128 字元
successUrlstring (uri)必填換卡成功後導回的網址,不帶任何參數。
限制:必須是 https://,不可含帳號密碼
failureUrlstring (uri)必填換卡失敗後導回的網址,會加上 error 參數(例如 CARD_CHANGE_FAILED)。參數名稱是 error,不是 payment_error。
限制:必須是 https://,不可含帳號密碼

範例一律打測試環境。把 OEN_API_TOKEN 設成測試環境 CRM 產生的 token。

終端機視窗
curl -X POST "https://payment-api.testing.oen.tw/subscriptions/S20260928EF56GH78/change-card-checkout" \
-H "Authorization: Bearer $OEN_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"merchantId": "ming",
"requestId": "SUB20260928001-card-1",
"successUrl": "https://shop.example.com/account/card-updated",
"failureUrl": "https://shop.example.com/account/card-failed"
}'
HTTP說明
200建立成功
400參數錯誤、定期定額不存在或目前不能換卡,見下方錯誤表。多帶規格外的欄位也會回 V0001
401token 錯誤(A0001)或已過期(A0002)
409同一個 requestId 已用過(C0010),或已有進行中的換卡頁(C0004)
欄位型別出現說明
checkoutSessionIdstring一定有換卡頁的 id
expiresAtstring一定有換卡頁到期時間(UTC,建立後 15 分鐘)
checkoutUrlstring一定有換卡頁網址,含一次性的 secret。只有這次回應會給,請安全保存到換卡完成;不要寫進一般日誌或分享
{
"code": "S0000",
"data": {
"checkoutSessionId": "2Hhp3cXq9Lm0RzK7aVwT1bNsYdE",
"expiresAt": "2026-10-16T02:15:00.000Z",
"checkoutUrl": "https://ming.oen.tw/checkout/subscription-card-change/2Hhp3cXq9Lm0RzK7aVwT1bNsYdE?secret=…"
},
"message": ""
}
錯誤碼HTTP什麼時候會發生
V0001400欄位不符規則,或帶了規格外的欄位
V0002400網域的金流服務尚未開通
C0001400找不到定期定額、不屬於你的網域,或不是 Payment API 建立的定期定額
C0002400目前狀態不能換卡。可以換卡的狀態是 scheduled、ongoing、retryScheduled、error
C0003400這一期正在扣款,稍後再試
C0008400網域不接受這種卡
C0011400網域目前不能收信用卡
C0012400風控拒絕
C0013400successUrl 或 failureUrl 不是合法的 https:// 網址
C0000400其他原因,包含網域的信用卡不是由 CyberSource 收單(目前不支援換卡)
C0004409這筆定期定額已有進行中的換卡頁。detail.expiresAt 是它的到期時間
C0010409同一個 requestId 已建立過換卡頁。detail 只帶原本的 checkoutSessionId、expiresAt,不會再給 checkoutUrl
A0001401token 錯誤
A0002401token 已過期,或重新產生後超過保留期限的舊 token

完整清單與處理方式見錯誤碼一覽。

流程見定期定額。換卡成功的通知見付款通知內容。