//tips
國際銀行間的訊息傳遞:
- 通匯、信用狀(LC)、債券、聯合貸款、帳務查詢:SWIFT
- 卡片交易(EFT/POS/ATM): ISO8583
SWIFT電文組成包含4個block:
- Block 1, Basic Header
- Block 2, Application Header Input
- Block 3, User Header(MTI)
- Block 4, SWIFT Message Body
ISO8583電文也包含4個部分組成:
SWIFT與ISO8583電文範例
SWIFT | {1:F01MIDLGB22AXXX0548034693} {2:I103BKTRUS33XBRDN3} {3:{108:MT103}} {4: :20:8861198-0706 :23B:CRED ... |
ISO8583 format 0 | ISO0060000600800822000000000000004000000000000000208130550002806301 |
從格式上來看,SWIFT每個block很清楚,有點像JSON,相較ISO8583容易parse;
ISO8583則是長字串,很難肉眼就初步拆解,需要搭配格式來看內容,趁著守歲,把去年欠朋友的ISO8583補上筆記。
Parse 長字串格式的ISO8583步驟。
1.Block拆解:
Message Header在台灣,兩家國內區域清算中心定義都不太相同,這邊不影響parse,先固定長度解出來。
2.Message Type: 0800是ISO8583中的MTI(Message Type Indicator)位置,第一位0表示為1987年版本,1表示1993年版,2表示2003年版,0800是網路及鍵值管理用途。
台灣發行簽帳卡/信用卡時間很早(Since 1974年),一直到現在都是Format 0版本;另外SWIFT的MTI很清楚,種類雖然繁多,但從MTI就可以知道用途;但ISO8583的MTI則必須搭配DE(3)Process code一起看,才能識別實際交易用途。
3.Bit Maps(16)
ISO8583 也和SWIFT同屬變動欄位組成電文,最多有128個Element,常用的Element定義在Primary(1-64),較少用到的放在Secondary(65-128)
先前解Hex string to Binary string曾用bitmap舉例,由於是16進位字串,每個16進位字串代表4個Elementon/off,這裡的Hex string Bitmap只有16Byte,代表1-64欄位 on/off,65-128放在Primary區域的第一個欄位P-1,也是16Byte。
Primary bitmap: 8220000000000000,表示DE1(也稱P-1)、DE7(P-7)及DE11(P-11)有值。
Senondary bitmap: 0400000000000000,表DE70(也稱S-70)有值
4.Parse 欄位值
Data Element | Description | value |
DE(1) | 2nd BitMap | 0400000000000000 |
DE(7) | Trans DateTime | 0207130550 |
DE(11) | Audit Trace No | 002806 |
DE(70) | Network Function | 301 |
- 上頭ISO8583電文範例是一個簡單的網路Echo test,解出兩段Bitmap,固定長度Element也就解出來了,程式不會太難。
- 但ISO8583除了變動欄位內容外,128個Data Element中,其中50幾個Element屬於變動長度,像是P-32收單銀行代號、P-35的Track2。
- 變動長度的Data Element: 若格式沒有特別說明,Element前2位表示不含Data length 的Element長度,這裡就會多需要多判讀,舉例P-32值為06456789,06表示長度,456789為收單銀行識別。
- 有的Element很有內涵,內含大區塊的欄位組合,常見的P-48、P-58 Additional data、P-63 POS Additional data(Token)與S-126 ATM Additional data,網路交易、CVV驗證、晶片相關、分期付款、紅利折抵全都藏在這。
這邊先下載BIM-ISO的程式碼(就1個class),寫一小段輸入範例電文字串單元測試方法:
[TestMethod]
public void TestMTI0800()
{
ISO8583 ISO8583 = new ISO8583();
string[] DEs = ISO8583.Parse("0800822000000000000004000000000000000208110746002806301");
Console.WriteLine("0800-Network Management Sample");
for (int i = 0; i < DEs.Length; i++)
{
if (DEs[i] != null)
{
Console.WriteLine("DE{0:D3} : {1}", i, DEs[i]);
}
}
}
測試結果:
DE[0]是Primary bitmap;DE[129]是MTI
小結:
- 1.單純的ISO8583 Parse還算簡單,不過因為台灣境內的銀行大多透過區域清算中心到國際信用卡組織再轉介到國外銀行連線,處理的格式雖稱為ISO8583,但實際與標準國際信用卡組織用的版本還是有許多差異,在台灣實作通常需要依照代理清算中心格式調整,複雜的就是這個,如果理解了觀念,也就可以Parse出來。
- 2.網路上找到另外一個c# open source(OpenIso8583Net),都是強型別處理,對於處理複雜的各類支付卡連線交易提供好的基礎,如果懶得自己Parse,也可以考慮。
- 3.注意連線主機傳輸編碼(有的是BCD),上面的範例都是ASCII喔。
分享一個也可以線上查看bitmap的網站: