錯誤碼字典與排障速查
在與 SureLink 網關對接過程中,若請求發生異常,網關將返回標準 HTTP 狀態碼及統一格式的 JSON 錯誤報文。
1. 統一錯誤回應格式
所有非 2xx 異常回應均遵循以下標準 JSON 結構:
json
{
"statusCode": 401,
"errorCode": "MERCHANT_API_UNAUTHORIZED",
"message": "unauthorized"
}2. 全域錯誤碼字典
| HTTP 狀態碼 | 錯誤碼 (errorCode) | 預設提示資訊 | 根本原因與排查建議 |
|---|---|---|---|
401 | MERCHANT_API_UNAUTHORIZED | unauthorized | 介面鑑權失敗: 1. 缺少必要請求頭( X-Api-Key, X-Timestamp, X-Nonce, X-Signature);2. 時間戳超出伺服器當前時間 $\pm 5$ 分鐘; 3. Nonce 長度不在 16~64 位或在 10 分鐘內發生重複; 4. API Key 不存在、已被停用或撤銷; 5. HMAC 簽名計算不符合。 |
403 | IP_NOT_WHITELISTED | client IP is not in merchant IP whitelist | IP 白名單攔截:發起請求的伺服器公網出口 IP 未加入商戶安全白名單中。 |
404 | ORDER_NOT_FOUND | order not found | 訂單不存在或租戶不符合:平台中未找到該訂單,或該訂單屬於其他商戶。 |
400 | PAYOUT_DISPUTE_REASON_REQUIRED | dispute requires a reason | 缺少爭議原因:調用代付裁決介面發起 DISPUTE 時,未填寫必填項 reason。 |
400 | BAD_REQUEST | (欄位詳細校驗資訊) | 請求參數校驗失敗:例如金額格式非法(如法幣非兩位小數、數位資產超過六位小數)、缺少必填欄位等。 |
409 | CONFLICT | resource conflict | 業務衝突:例如使用相同商戶單號並發重複下單但請求參數衝突。 |
503 | SERVICE_UNAVAILABLE | service temporarily unavailable | 網關維護或降級:平台正在執行停機維護,或訂單域功能開關暫時關閉。 |
500 | INTERNAL_SERVER_ERROR | internal server error | 網關內部異常:伺服器臨時故障,請攜帶 requestId 聯繫技術支援。 |
3. 常見排障排查清單 (Checklist)
3.1 簽名不符合 (MERCHANT_API_UNAUTHORIZED) 排查秘籍
90% 以上的聯調鑑權失敗均由此引起,請按以下步驟逐一排查:
- Raw Body 拼接差異:
- 是否在計算簽名時使用了序列化後的字串,而在發送請求時被 HTTP 客戶端重新排版了 JSON(例如增加了空格或換行)?
- 正確做法:確保簽名使用的字串與 HTTP 傳輸中通過 Socket 發出的 Payload 完全一致(位元組層級相同)。
- GET 請求或空 Body 處理:
- GET 請求時,待簽名串末尾必須包含英文句點:
${timestamp}.${nonce}.,不可漏掉最後的.。
- GET 請求時,待簽名串末尾必須包含英文句點:
- Secret 是否準確:
- 確認使用的是當前 API Key 對應的最新
API Secret,且兩端無多餘的前後空格。
- 確認使用的是當前 API Key 對應的最新
- Hex 格式大小寫:
- 簽名計算結果必須輸出為 全小寫的 64 位 Hex 字串。
3.2 時間戳超出窗口 (Timestamp Out of Window)
- 網關強制校驗客戶端時間戳與伺服器時間偏差在 300 秒(5分鐘) 以內。
- 排查方法:檢查商戶調用端伺服器是否開啟 NTP 時間同步(如
ntpdate/chrony)。 - 注意:
X-Timestamp必須是 毫秒級時間戳(13位數字,如1715000000000),切勿傳入秒級時間戳(10位)。
3.3 隨機數重放衝突 (Nonce Replay)
X-Nonce在同一個 API Key 下在 600 秒內全域唯一。- 排查方法:請使用高強度的偽隨機數生成器(如 Node.js
crypto.randomBytes(16).toString('hex')或 Pythonsecrets.token_hex(16)),切勿使用固定值或單純按數字自增遞增(在多實例並發時極易衝突)。
3.4 IP 白名單攔截 (IP_NOT_WHITELISTED)
- 商戶在後台配置了 IP 白名單,但調用請求被攔截。
- 排查方法:
- 很多雲端廠商(如 AWS、阿里雲)的伺服器公網出口 IP 經過了 NAT 網關或代理,可能與伺服器綁定的 EIP 或內網 IP 不同。
- 可以在商戶伺服器上執行
curl https://api.ipify.org查詢伺服器對外展示的真實公網 IP,並將其配置到商戶後台白名單中。
