Pain001

給財資主管、付款營運、工程師與稽核人員的直白解答。問題以人們實際提問的方式撰寫。更深入的技術細節請見技術參考


給財資與財務主管#

一段話說明:什麼是 pain.001?

pain.001 是客戶傳送給銀行以發動貸記轉帳的 ISO 20022 電文——它是 SWIFT MT101 與各種本地固定格式檔案的 XML 後繼者。您的銀行在受理前,會依結構描述與方案規則手冊驗證該檔案。Pain001(本軟體)用您既有的資料產生這些檔案,並在提交前證明其有效。

pain.001 與 pain.008 有什麼差別?

差別在資金流向。pain.001 發動貸記轉帳——您把錢匯出去。pain.008 發動直接扣款——您依扣款授權向他人收取應付給您的款項。Pain001 兩者皆可產生:十個版本的 pain.001.001.03.001.12)以及 pain.008.001.02

我們仍在傳送 MT101 檔案。移轉有多急迫?

非常急迫。SWIFT 已於 2025 年 11 月停用跨境銀行間支付指示的 MT 第 1、2、9 類電文;仍受理 MT 的企業金融通道全憑各銀行自行決定,且時日無多。MT101 載入器可將既有 MT101 流程轉換為經驗證的 pain.001,完全不必重新輸入資料。

2026 年 11 月的結構化地址期限對我們代表什麼?

自 2026 年 11 月底起,CBPR+ 跨境支付不再受理完全非結構化的郵政地址;地址必須採結構化或混合形式——以城鎮()、國家()等獨立元素取代自由文字行。若您的主檔資料以整段文字存放地址,工作重點在您的資料,而非銀行連線。請從資料著手。2026 年簡報詳述了時程。

Pain001 要多少費用?

免費。核心採 Apache-2.0 / MIT 雙授權;附屬套件採 Apache-2.0。商業使用、修改與再散布皆獲允許。作為規模對照,光是 SWIFT 的轉換 SDK 每年定價即達 €10,000–30,000。


給付款營運#

銀行為什麼會退回付款檔案?

四個常見原因:結構描述違規(元素錯誤、版本錯誤、命名空間錯誤)、識別碼有誤(IBAN 檢核失敗、BIC 格式錯誤)、控制總計不符(NbOfTxs / CtrlSum 與交易對不起來),以及超出 ISO 20022 拉丁字元集的字元。Pain001 在檔案產生前就檢查全部四項:逐筆記錄的 JSON Schema 驗證、mod-97 IBAN 與 ISO 9362 BIC 檢查、重新計算的控制總計、字元集轉寫,以及對產出 XML 的最終 XSD 驗證。

可以只驗證檔案而不產生任何東西嗎?

可以——使用 pain001 --dry-run(或 validate 子命令,或 POST /api/v1/validate)。結束代碼 0 表示有效;1 表示驗證失敗並附欄位層級錯誤。可將其接進 CI 或提交前檢查清單。

涵蓋哪些 SEPA 規則手冊?

內建五套方案規則手冊:SEPA 貸記轉帳(sepa-sct)、SEPA 即時轉帳(sepa-inst)、SEPA 直接扣款 Core(sepa-sdd)、SEPA B2B(sepa-b2b)與跨境貸記轉帳(xborder-ct)。使用 --scheme --explain 可檢視每條規則的通過或失敗情形。

我們的資料都在 Excel。有什麼陷阱?

Excel 會默默把類似 IBAN 的字串強制轉成數字。Excel 載入器直接讀取 .xlsx/.xlsm,一旦 IBAN 欄含有數值儲存格便立即停止——資料毀損在載入時就被攔下,而不是到了銀行才發現。

它如何處理 500,000 列的批次?

--streaming 以記憶體受控的分塊方式處理輸入(預設每塊 1,000 筆交易),每個分塊輸出為獨立 XML 檔案,並附正確重算的控制總計。基於同樣理由,REST API 提供 POST /api/v1/generate/async 與工作輪詢。


給工程師與架構師#

我們該怎麼整合——函式庫、CLI 還是 API?

三者皆為一級介面:具型別註記的 Python API、結束代碼對 CI 友善的 CLI,以及具同步、非同步工作、健康檢查與 Prometheus 指標端點的 FastAPI 微服務(pain001 serve)。底層是同一條驗證管線,因此各介面的結果永不分歧。

XML 產生真的能避免浮點捨入問題嗎?

金額在產生與方案驗證中全程使用 decimal.Decimal——以精確十進位解析、以精確十進位加總、輸出時不經過浮點表示。控制總計由已驗證的記錄重新計算,絕不採信輸入。

安全態勢如何?

所有 XML 解析都經由 defusedxml(阻擋 XXE 與實體展開攻擊);相依套件中沒有 lxml。輸入會經過路徑遍歷驗證器。Docker 映像檔以非 root 執行。核心發行版會產生 CycloneDX SBOM,並可用 PAIN001_DISABLE_PLUGINS=1 徹底停用第三方外掛探索。

品質如何把關?

核心以 100% 行與分支涵蓋率作為 CI 硬性關卡(可驗證:3,828 行、926 個分支皆為 100%),加上嚴格 mypy、100% docstring 涵蓋率、Bandit 與 pip-audit 安全掃描,以及 CodeQL 掃描。附屬套件遵循同樣的 100% 涵蓋率紀律。

可以擴充以支援專屬格式嗎?

可以——四個外掛進入點群組(pain001.loaderspain001.validatorspain001.schemespain001.writers)。Excel 載入器本身就是使用公開協定的外掛,因此也可作為參考實作。


給稽核與法遵#

可以重現上一季產生的檔案嗎?

可以。鎖定套件版本、重播相同輸入,輸出即具確定性。由於工具鏈是開源的,稽核軌跡可一路延伸到程式碼路徑本身——而不只是廠商的一紙證明。

付款資料會離開我們的環境嗎?

不會。每個元件——CLI、函式庫、REST API、MCP 伺服器、LSP——都在本機執行。沒有遙測、沒有 SaaS 回呼、沒有外部驗證服務。MCP 伺服器僅透過 stdio 溝通,其全部 17 個工具皆標註為唯讀且冪等。

Pain001 由誰維護?

Sebastien Rousseau——駐於倫敦的金融科技工程主管——以及社群貢獻者。開發在 GitHub 上公開進行,發行版發佈至 PyPI,且每次發行都附版本化的變更紀錄。