深入理解8583協議
最初,金融系統只有IBM這些大公司來提供設備,象各種主機與終端等,後來有很多大大小小的公司進入,怎樣設計一個報文協議,解決各公司金融系統之間的報文交換,暫且稱該協議叫做ISO8583協議。例如‘回頭客會員管理系統’POS機上應用的就是8583報文。
金融行業涉及到的數據內容是比較少的,如交易類型、帳號、帳戶類型、密碼、交易金額、交易手續費、日期時間、商戶代碼、2磁3磁數據、交易序列號等,都總結起來不過100個左右的數據。我們可以簡單的設計ISO8583,定義128個字段,將所有金融數據字段按照順序排列,分別對應128個字段。每個數據類型佔固定的長度,要發送一個報文時,就將128個字段按照順序連起來,然後將整串數據包發送出去。
任何金融軟件收到ISO8583包後,直接按照我們定義的規範解包即可,因爲整個報文的128個字段都預先定義好了。比如第1個字段是“交易類型”,長度爲4位,第2個字段位是“帳號”,爲19位等等。接收方就可以先取4位,再取接着的19位,依次類推,直到整個數據包128個字段都解完爲止。
不過我們有幾個問題要思考下:
1、 我怎麼知道每個字段的數據類型呢,是數字還是字符?
2、 每個傳送的報文都把128個字段都傳過去,有時候我可能只需要其中5個字段。
3、 如果我某些字段的長度不固定,屬於變長怎麼辦。
第一個問題。我在定義ISO8583時除了定義每個字段表示什麼,還規定其內容是數字或是字符等類型。可能出現的類型有以下幾種:字母、數字、特殊字符、年月日等時間、二進制數據。比如“商戶類型”字段定義其長度是15,類型爲字母。如果“商戶類型”同時包括數字和字母呢?那我們就定義一個字段可以同時屬於多個類型。
第二個問題。其本質就是如果我只傳128個字段的5個字段,接收方怎麼知道我傳了哪幾個字段。我在報文前面加上個包頭,用16個字節,即128個bit來表示128個字段中的某個字段是否存在。每個bit如果是1就表示對應的字段在本次報文中存在,如果是0就是不存在。比如,我要發送5個字段,分別屬於128個字段中的第2、3、6、8、9字段,我就可以將128bit的報文頭填成011001011000000000………0。
我們把這16個字節稱爲bit map,即位圖,用來表示某個位是否存在。考慮到很多時候報文不需要128個字段,可以將報文頭由128bit減到64bit,把ISO8583的128個字段中最常見的都放到前64個字段中,只有在需要的時候才把剩下的64bit放到報文裏面?
我把64bit報文頭的第一位bit用來代表特殊含義,如果該bit爲1,則表示64bit後面跟了剩下的64bit報文頭;如果第一位bit爲0,則表示64bit後面直接是數據字段內容。因爲報文頭第二個64bit屬於有時候有,所以我們叫它Extended bit map擴展位圖,報文頭最開始的64bit我們叫它Primary bit map主位圖。我們直接把擴展位圖固定放到128個字段的第一個字段,而主位圖每個數據包都有,就強制性放在所有128個字段的前面。
第三個問題。比如第2個字段是“帳號”,是不定長的,可能有的銀行帳號是19位,有的是17位等,在字段的開頭加上“帳號”的長度。比如帳號是0123456789,一共10位,我們變成100123456789,接收方收到該字段後,它知道ISO8583規定第2個字段“帳號”是變長的,會先取前面2位出來,然後根據長度獲取帳號。在規範裏面定義某個字段的屬性是“LLVAR”,其中LL表示長度,VAR表示數據,兩個LL表示兩位長,最大是99,三位就是“LLLVAR”,最大是999。
另外考慮到有些人有特殊的要求,我們將128個字段中的部分定義爲自定義字段,算是一種擴展。
字段域的定義
typedef struct ISO8583
{
int bit_flag; /*域數據類型0 -- string, 1 -- int, 2 -- binary*/
char *data_name; /*域名*/
int length; /*數據域長度*/
int length_in_byte;/*實際長度(如果是變長)*/
int variable_flag; /*是否變長標誌0:否 2:2位變長, 3:3位變長*/
int datatyp; /*0 -- string, 1 -- int, 2 -- binary*/
char *data; /*存放具體值*/
int attribute; /*保留*/
} ISO8583;
ISO8583 Tbl8583[128] =
{
/* FLD 1 */ {0,"BIT MAP,EXTENDED ", 8, 0, 0, 2, NULL,0},
/* FLD 2 */ {0,"PRIMARY ACCOUNT NUMBER ", 22, 0, 2, 0, NULL,0},
/* FLD 3 */ {0,"PROCESSING CODE ", 6, 0, 0, 0, NULL,0},
/* FLD 4 */ {0,"AMOUNT, TRANSACTION ", 12, 0, 0, 1, NULL,0},
/* FLD 5 */ {0,"NO USE ", 12, 0, 0, 0, NULL,0},
/* FLD 6 */ {0,"NO USE ", 12, 0, 0, 0, NULL,0},
/* FLD 7 */ {0,"TRANSACTION DATE AND TIME ", 10, 0, 0, 0, NULL,0},
/* FLD 8 */ {0,"NO USE ", 8, 0, 0, 0, NULL,0},
/* FLD 9 */ {0,"NO USE ", 8, 0, 0, 0, NULL,0},
/* FLD 10 */ {0,"NO USE ", 8, 0, 0, 0, NULL,0},
/* FLD 11 */ {0,"SYSTEM TRACE AUDIT NUMBER ", 6, 0, 0, 1, NULL,0},
/* FLD 12 */ {0,"TIME, LOCAL TRANSACTION ", 6, 0, 0, 0, NULL,0},
/* FLD 13 */ {0,"DATE, LOCAL TRANSACTION ", 4, 0, 0, 0, NULL,0},
/* FLD 14 */ {0,"DATE, EXPIRATION ", 4, 0, 0, 0, NULL,0},
/* FLD 15 */ {0,"DATE, SETTLEMENT ", 4, 0, 0, 0, NULL,0},
/* FLD 16 */ {0,"NO USE ", 4, 0, 0, 0, NULL,0},
/* FLD 17 */ {0,"DATE, CAPTURE ", 4, 0, 0, 0, NULL,0},
/* FLD 18 */ {0,"MERCHANT'S TYPE ", 4, 0, 0, 0, NULL,0},
//省略部分參考規範文檔。
/* FLD 123 */ {0,"NEW PIN DATA ", 8, 0, 3, 2, NULL,0},
/* FLD 124 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 125 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 126 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 127 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 128 */ {0,"MESSAGE AUTHENTICATION CODE FIELD ", 8, 0, 0, 2, NULL,0}
};
如第二域:域名爲主帳號,
數據類型爲string
長度爲22(最長長度不得超過此數)
是個2位變長域
在打包時需在數據域前加上數據的實際長度,如‘19數據值’(即19爲長度)
如第三域:域名爲處理碼,
數據類型爲string
長度爲6
是個定長域 必須填滿6位。
1,信息類型(message type)定義
位圖位置:-
格式:定長
類型:N4
描述:
數據包的第一部分,定義數據包的類型。
數據類型由數據包的發起者設定,應遵循以下要求:
數據包開始部分必須是信息類型;
對不支持的信息類型能給出拒絕應答。
0100授權交易
0110授權交易答覆
0200金融交易
0210金融交易答覆
0240查詢交易
0250查詢交易答覆
0400衝正交易
0410衝正交易答覆
0800管理交易
0810管理交易答覆
2,位圖(Bit Map) - 基本位圖和擴展位圖
位圖位置:1
格式:定長
類型:B16
描述:
如將位圖的第一位設爲'1',表示使用擴展位圖,否則表示只使用基本位圖。
如使用某數據域,應在位圖中將相應的位設位'1',如使用41域,需將位圖的41位設爲'1'。
選用條件:如使用65到128域,需設位圖域爲'1'
3,Bit02主帳號(Primary Account Number )
位圖位置:02
格式:變長,LLVAR
類型:N..22
描述:
唯一的確認一個用戶交易的基本帳號。
由於銀行電子服務系統涉及多個應用系統,而帳號長度最多爲22位,故將原標準的19長度改爲22位。
Bit03 處理代碼 (Processing Code )
位圖位置:03
格式:定長
類型:N6
描述:用於描述交易對客戶帳戶造成何種影響的代碼。
處理代碼和信息碼一起可唯一定義一種交易的類型。
處理代碼由以下三部分組成:
位置描述
1-2交易動作碼
3-4付出帳戶類型,用於借記類,如查詢、代收費、轉場交易。
5-6收入帳戶類型,用於代收費、轉帳等。
其中:
ff : 付出帳戶
tt: 收入帳戶
* 視主機而定
5,Bit04 交易金額 (Amount, Transaction)
位圖位置:04
格式:定長
類型:N12
描述:帳戶人要求交易的交易金額,不含任何處理和交易費用。
金額的表示和貨幣代碼有關,應能表示相應貨幣的最小單位。參ISO4217有關貨幣代碼定義。
如“000000000100”用於表示美元,表示1.00元;如用於表示意大利貨幣,則表示100里拉。
對於查詢等交易,應設交易金額爲“000000000000”。
6,Bit07交易日期和時間Transmission Date and Time
位圖位置:07
格式:定長,MMDDhhmmss
類型:N10
描述:本地交易日期和時間
7,Bit11系統跟蹤號(Systems Trace Audit Number)
位圖位置:11
格式:定長
類型:N6
描述:終端交易的跟蹤號碼。
交易發起終端填寫,和“交易日期、時間”、信息類型等合在一起可唯一定義某一個終端的唯一一筆交易。即是說,在同一天,對一終端,同一類交易的系統跟蹤號應保證不同。系統跟蹤號在交易過程中不能修改。使用此域來匹配請求和通知類交易的返回。
應用系統使用此域來檢查收到的授權、金融、自動衝正、結算、管理和網管等類交易的應答包是否是其請求包的應答。
系統跟蹤號不用於匹配自動衝正交易,也不用於在預授權消費時匹配前面的預授權交易。參90域。
對於銀行電子服務系統,其系統跟蹤號是交易流水號。
8,Bit12本地交易時間(Time ,Local Transaction)
位圖位置:12
格式:定長,hhmmss
類型:N6
描述:交易在終端上發生的時間。
本地交易時間在交易處理過程中不能改變。在自動衝正,存貯轉發時,本地交易時間不能改變。
9,Bit13本地交易日期(Date ,Local Transaction)
位圖位置:13
格式:定長,MMDD
類型:N4
描述:交易在終端上發生的時間。
本地交易時間不能改變,在自動衝正、存儲轉發交易時,本地交易時間也不能改變。
10,Bit14有效期(Date ,Expiration)
位圖位置:14
格式:定長,YYMM
類型:N4
描述:卡的有效期,年年月月
由於卡類寫磁格式不同,收單行可能提不出卡的有效期,授權機構從卡的二磁道中提取卡的有效期。如卡,無二磁道,收單行應要求手工錄入卡的有效期。
選用條件:100、200、400等交易如沒有2、3磁道時,一定要有此域。
11,Bit15結算日期(Date ,Settlement)
位圖位置:15
格式:定長,MMDD
類型:N4
描述:
銀行電子服務系統和主機結算的時間,格式月月日日。
結帳日期前發生的交易參加當天結算。
在結算時,結帳日期也用於計算處理、交易費用。
12,Bit17獲取日期(Date ,Capture)
位圖位置:17
格式:定長,MMDD
類型:N4
描述:從主機獲取交易的記帳日期。通常用於主機和商戶清算。
13,Bit18商戶類型(Merchant's Type)
位圖位置:18
格式:定長
類型:N4
描述:定義商戶產品和服務類型的代碼
商戶類型用於金融、授權交易,用於指定服務點的類型。它主要有以下用途:
決定預授權交易得到確認的最長時間;
控制合法限額;
爲交易授權處理,控制網絡操作規則;
欺詐檢測;
用於商戶分類報表;
交易費用處理。
根據ISO8583標準,應使用相應的國家標準。
商戶類型代碼表如下:
商戶類型代碼行業類型說明
4215郵遞服務
4511民航
4722旅遊
4782過橋費
4789其他運輸服務
4614電信服務
5542加油站
5812餐館
5999購物
6010金融機構-人工現金支付
6011金融機構-自動現金支付
6012金融機構-各類服務
7011酒店、旅館
7299各類個人服務:洗衣、美容、
7399各類商業服務:停車場、租車、廣告、其他服務
7699各類維修服務:維修、洗車、拖車
7996娛樂:電影、劇院、體育、遊戲
8099醫療服務
8111法律服務
8999各類專業服務:會計、教育、裝修、工程
選用條件:服務點終端發起的交易一定要有此域。
14,Bit22服務點輸入方式(Point-of-Service Entry Mode)
位圖位置:22
格式:定長
類型:N3
描述:在服務終端上定義PIN和PAN的輸入方式。
服務點輸入方式包含以下兩個方面組合而成:
位置描述
1-2在服務終端上PAN有效期輸入方式
3-3在服務終端上PIN的輸入方式
PAN的輸入方式編碼如下:
PAN輸入方式描述
00不知
01手工
02讀磁卡
03條碼掃描儀(BAR)
04光學符號閱讀器(OCR)
05集成電路卡(IC卡)
PIN的輸入方式編碼如下:
PIN輸入方式描述
0不知
1終端能接收PIN
2終端不能接收PIN
選用條件:服務點終端發起的交易一定要有此域。
15,Bit25服務點條件代碼(Point-of-Service Condition Code)
位圖位置:25
格式:定長
類型:N2
描述:定義交易發生的服務點類型
用法說明:下面是CYBERBANK支持的服務點條件代碼。
服務點條件代碼服務點終端類型
2自動櫃員機(ATM)
10銀行終端(10)
14POS
20電話銀行
16,Bit32收單機構標識碼(Acquirer institution Identification)
位圖位置:32
格式:LLVAR
類型:N..11
描述:在金融交易中此域表示交易發生的銀行機構的標識碼
應答數據包必須和請求數據包此域相同。
17,Bit33向前機構標識碼(Forwarding Institution Identification Code)
位圖位置:33
格式:LLVAR
類型:N..11
描述:在金融交易中此域表示帳戶所在的銀行機構的標識碼
在網管交易800/810中,本域含有交易發起機構的代碼。
應答數據包必須和請求數據包此域相同。
18,Bit35二磁道數據(Track 2 Data)
位圖位置:35
格式:LLVAR
類型:Z..37
描述:寫在卡二磁道的數據。數據組成遵循ISO7811-1985標準,數據中包含域分隔符,但不包含卡啓始、結束符、LRC等。
收卡行應檢測卡的二磁道是否符合國際標準。
爲支持國際交換收單行應將二磁道中的分隔符換爲“=”。除此外不能對二磁道數據進行任何修改,如修改PAN的校驗字、有效期、服務碼等。
19,Bit36三磁道數據(Track 3 Data)
位圖位置:36
格式:LLLVAR
類型:Z...104
描述:寫在卡三磁道的數據。數據應組成遵循ISO4909標準,數據中包含域分隔符,但不包含卡啓始、結束符、LRC等。
注意:長度說明爲3位數字長。
20,Bit37檢索索引號(Retrieval Reference Number)
位圖位置:37
格式:定長
類型:AN12
描述:檢索索引號用來在任何時間標識一個金融、授權、自動衝正交易。
檢索索引號不要求打印在持卡人的帳單上。它的主要目的是在收單行和授權行之間定義一個數據項用於跟蹤和檢索交易。授權機構可以將檢索索引號打印在客戶的對帳單上。
檢索索引號由收單行分配。
選用條件:可包含在收單機構的交易請求中。如在交易請求中有,則應答數據中一定應原樣返回。
21,Bit38授權碼(Authorization Identification)
位圖位置:38
格式:定長
類型:AN6
描述:交易授權機構返回的返回代碼。
授權碼用於在服務點終端上信用卡授權;
授權機構按網絡操作規定,可選使用本域。
22,Bit39返回碼(Response Code)
位圖位置:39
格式:定長
類型:AN2
描述:對一交易定義其處理結果的編碼。
返回碼用於說明授權機構對金融(授權)交易的處理狀態;也用來指明自動衝正交易的衝正原因;還用來指出目標主機已接收到文件修改、結算、管理、網管等交易請求。
返回碼應儘可能準確,應儘可能描述清楚所遇到的問題和狀態。網絡交換主機、收單行主機有可能會按不同的返回碼收取不同的交易處理費用,並執行不同的處理過程。
23,Bit41收卡單位終端標識碼(Card Acceptor Terminal Identification)
位圖位置:41
格式:定長
類型:ANS8
描述:定義在收單單位中定義一個服務終端的標識碼,在同一商戶中服務終端標識碼應唯一。
24,Bit42收卡商戶定義碼(Card Acceptor Identification Code)
位圖位置:42
格式:定長
類型:ANS15
描述:在本地和網絡中定義交易單位(商戶)的編碼。
25,Bit43收卡商戶位置(Card Acceptor Location)
位圖位置:43
格式:定長
類型:ANS40
描述:在本地和網絡中定義收卡單位(商戶)的國家、省。城市等。
選用條件:如對外卡網絡,一定要包含此域。
本文轉自於:http://blog.csdn.net/pengzp/article/details/6548987