首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

銀行接口調用失敗的處理策略與最佳實踐

     編輯:程式設計綜合問答

對接銀行支付接口時,網絡超時、銀行端異常、簽名驗證失敗等導致調用失敗屬常態。本文梳理失敗處理原則、重試策略、事務一致性保障及第三方支付建議。

核心原則:以銀行返回結果為準

銀行接口通常采用「異步通知 + 主動查詢」雙重保障機制:

  • 同步響應:僅表示「請求已接收」,不代表支付成功
  • 異步通知(POST 回調):銀行支付完成後主動推送結果,含簽名驗證
  • 主動查詢:未收到通知時,按訂單號查詢訂單狀態

失敗處理流程

1. 同步調用異常(網絡/超時/HTTP 非 200)

try {
    HttpResponse response = httpClient.execute(request);
    if (response.getStatusLine().getStatusCode() != 200) {
        throw new BankGatewayException("HTTP 狀態碼異常: " + response.getStatusLine());
    }
    String result = EntityUtils.toString(response.getEntity());
    // 解析 result,判斷是否受理成功
} catch (IOException e) {
    // 網絡異常:記錄日誌,標記訂單為「待確認」,啟動異步查詢任務
    orderService.markPendingConfirmation(orderId);
    asyncQueryScheduler.schedule(orderId);
    throw new TransientBankException("銀行網關不可用", e);
}

2. 異步通知處理


@PostMapping("/bank/notify")
public String notify(HttpServletRequest request) {
    // 1. 驗證簽名(防偽造)
    if (!verifySign(request.getParameterMap())) {
        return "FAIL"; // 銀行會重試
    }
    
    // 2. 解析業務結果
    String orderId = request.getParameter("out_trade_no");
    String tradeStatus = request.getParameter("trade_status");
    
    // 3. 冪等處理(防重複通知)
    if (orderService.isProcessed(orderId)) {
        return "SUCCESS";
    }
    
    // 4. 更新訂單狀態
    if ("TRADE_SUCCESS".equals(tradeStatus)) {
        orderService.paySuccess(orderId, request.getParameterMap());
    } else {
        orderService.payFailed(orderId, tradeStatus);
    }
    return "SUCCESS";
}

3. 主動查詢兜底

對「待確認」訂單,啟動定時任務輪詢銀行查詢接口:

  • 頻率:1min, 5min, 15min, 30min, 1h, 2h... 指數退避
  • 最長嘗試:T+1 日 24:00 前
  • 查詢成功 → 更新狀態;最終失敗 → 轉人工介入

事務與一致性

不要在同步調用失敗時直接回滾本地事務!

  • 本地訂單狀態機:創建 → 支付中 → 待確認 → 成功/失敗/關閉
  • 同步調用異常 → 狀態流轉至 待確認,而非失敗
  • 通過異步通知/主動查詢最終確定狀態
  • 資金賬務採用「記賬式」:記錄流水,對賬平賬,而非即時扣款

建議:接入聚合支付/第三方支付

除非有強監管要求(如國庫支付),優先選擇持牌第三方支付機構。

總結清單

  1. 同步調用異常 → 標記「待確認」+ 異步查詢,不回滾
  2. 異步通知 → 驗簽 + 冪等 + 狀態機流轉
  3. 主動查詢 → 指數退避 + 兜底人工
  4. 資金流水 → 完整記錄請求/響應/通知/查詢全鏈路日誌
  5. 優先評估第三方支付,降低接入與維護成本
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
維度直連銀行第三方支付(如支付寶/微信/銀聯雲閃付)
接入成本高(每家銀行單獨對接)低(一套 SDK 搞定多渠道)
穩定性依賴單銀行多通道路由、自動切換
對賬難度高(格式不統一)低(標準化對賬單)
合規風險自行承擔持牌機構承擔