多數人第一次仔細研究信用卡號格式,是在填表單填錯位數、被系統退回來的時候。卡面上那串數字其實不是隨機排列,而是三段有明確分工的資訊接在一起:開頭幾位代表發卡機構與卡組織,中間是帳戶編號,最後一位是為了防打錯字而算出來的校驗位。看懂這個結構之後,你就能判斷一串數字有沒有可能在真實世界裡成立,也能理解為什麼有些卡是 15 位、有些是 16 位,而這些長度都算合法。
信用卡號的三段結構
最直觀的理解方式,是把它想成一條由左到右、資訊量遞減的字串。
第一段是發卡行標識號,早期稱為 BIN,現在國際標準統一叫 IIN。它位在號碼最前面,長度可以是 6 位或 8 位,用來指出這張卡屬於哪個卡組織,通常也對應到發卡的金融機構。卡組織會把號段分配給成員機構,因此前綴落在哪個區間,是可以公開查詢的資訊。
第二段是帳戶位,由發卡機構自行分配。它的唯一任務是在同一個號段內保持唯一,本身不帶其他意義,位數長短則取決於發卡機構怎麼規劃。
第三段是校驗位,只有一位,由前面所有數字透過 Luhn 演算法推算而來。它不攜帶任何關於帳戶的資訊,存在的目的只是讓打錯字能在送出前被擋下來。
為什麼卡號長度不一樣?
16 位是最常見的長度,卻不是唯一合法的長度。ISO/IEC 7812 把上限訂在 19 位,而市面上實際流通的長度包括 13、14、15、16、19 位,各有其歷史脈絡與卡組織的選擇。
| 長度 | 常見情況 |
|---|---|
| 15 位 | 美國運通等卡組織使用 |
| 16 位 | 目前最普遍,多數 Visa、Mastercard、銀聯卡片 |
| 13、14 位 | 早期 Visa 號碼與部分 Diners Club 號碼 |
| 19 位 | 標準允許的上限,用於擴充號段空間 |
早期的號碼較短,是因為當時的發卡量與交易量都不需要那麼多組合;隨著卡量成長、號段逐漸用盡,加長位數成了最直接的擴充方式。所以當你在測試環境看到一個 15 位或 19 位的號碼,先別急著判定它格式錯誤,那可能正是它應該有的樣子。各卡組織的實際號段與長度整理在各卡組織測試卡號。
首位數字透露了什麼?
卡號的第一位數字是所謂的主要行業識別碼,它用來區分這張卡屬於哪個產業,而不是哪一家銀行。
- 4 與 5:分別對應 Visa 與 Mastercard,是最常見的兩個開頭。
- 3:旅行與娛樂類,包含美國運通、Diners Club 與 JCB。
- 6:Discover 與銀聯使用的主要區段。
- 2 與 1:保留給航空業相關的編號方案。
- 7:石油與能源產業。
- 8:電信產業。
- 9:由國家層級統一分配使用。
這些是公開的編號方案,不是機密。反過來說,知道首位數字代表哪個行業,也僅止於此——它無法告訴你這是哪一家銀行發的卡,更不能說明某個帳戶是否存在。
卡面上的空白是怎麼回事
卡片印出來時通常會把 16 位數字分成四組,每組四位,中間留一點空隙;15 位的卡則是分成 4-6-5 的三組。這些空白純粹是為了讓人眼辨識與複誦,不屬於號碼本身。
這一點在實作上很重要:資料庫裡存的應該是一串連續數字,分組只在顯示的那一刻發生。許多表單允許使用者直接貼上帶空格的號碼,因此送出前必須先把空白與連字號清掉,再進入驗證流程。若把「使用者看到的樣子」和「系統儲存的樣子」混為一談,通常會在匯入匯出時出現難以追查的落差。
給開發者:輸入清洗與長度的取捨
處理卡號輸入時,有幾個判斷會影響後續所有程式碼:
- 只留數字再驗證。 空白、連字號、全形數字都可能出現在貼上的內容裡,統一清洗成半形數字是第一步。
- 長度檢查放在最前面。 先擋掉明顯過短或過長的輸入,錯誤訊息才講得清楚,也避免後面白算一遍。
- 不要把長度寫死成 16。 以區間判斷(例如 13 到 19 位)比較安全,否則 15 位的號碼會在無辜的欄位裡被拒絕。
- 前綴比對用區間而非清單。 號段會調整,寫死一張清單日後會變成負擔;用區間描述比較耐用。
- 保留原始輸入。 清洗後的結果與使用者實際輸入的內容建議分開保存,出問題時才對得起來。
另外要記得,前端驗證只是體貼使用者,不能當成防線;伺服端仍要獨立跑一次同樣的檢查。完整的處理順序見驗證信用卡號。
在本站產生符合格式的號碼
如果要驗證表單的排版、分組顯示或品牌辨識,本站的虛擬信用卡工具可以一次產生多組符合各卡組織格式的號碼,也可以貼上已知前綴讓它補齊剩下的位數。你可以指定卡組織與數量,取得固定的一批資料,方便放進測試案例反覆使用。
需要說明的是,這些號碼結構正確、卻從未發行,不屬於任何人,也不對應任何帳戶。它們適合填進表單、放進自動化腳本、當作示範畫面的素材,但無法完成任何實際支付,也不該被送往真實的交易閘道。
下一步
想親手確認一組號碼的校驗位對不對,可以回頭讀 Luhn 演算法那一篇;要理解驗證失敗時該告訴使用者什麼,讀驗證信用卡號。需要一批現成的號碼,直接到上文提過的產生器產生即可。