金融交易报文ISO8583协议
前言
最初,金融系統只有IBM這些大公司來提供設備,象各種主機與終端等,后來有很多大大小小的公司進入,怎樣設計一個報文協議,解決各公司金融系統之間的報文交換,暫且稱該協議叫做ISO8583協議。例如“回頭客會員管理系統”POS機上應用的就是8583報文。
金融行業涉及到的數據內容是比較少的,如交易類型、帳號、帳戶類型、密碼、交易金額、交易手續費、日期時間、商戶代碼、2磁3磁數據、交易序列號等,都總結起來不過100個左右的數據。我們可以簡單的設計ISO8583,定義128個字段,將所有金融數據字段按照順序排列,分別對應128個字段。每個數據類型占固定的長度,要發送一個報文時,就將128個字段按照順序連起來,然后將整串數據包發送出去。
任何金融軟件收到ISO8583包后,直接按照我們定義的規范解包即可,因為整個報文的128個字段都預先定義好了。比如第1個字段是“交易類型”,長度為4位,第2個字段位是“帳號”,為19位等等。接收方就可以先取4位,再取接著的19位,依次類推,直到整個數據包128個字段都解完為止。
思考
有幾個問題要思考下:
我怎么知道每個字段的數據類型呢,是數字還是字符?每個傳送的報文都把128個字段都傳過去,有時候我可能只需要其中5個字段。如果我某些字段的長度不固定,屬于變長怎么辦。
第一個問題:我在定義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個字段中的部分定義為自定義字段,算是一種擴展。
字段域定義
?
| 1 2 3 4 5 6 7 8 9 10 11 12 | 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; |
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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 } ???? }; |
字段域解釋
1、信息類型(message type)
| - | 定長 | N4 | 數據包的第一部分,定義數據包的類型。 數據類型由數據包的發起者設定,應遵循以下要求: 數據包開始部分必須是信息類型; 對不支持的信息類型能給出拒絕應答。 0100授權交易 0110授權交易答復 0200金融交易 0210金融交易答復 0240查詢交易 0250查詢交易答復 0400沖正交易 0410沖正交易答復 0800管理交易 0810管理交易答復 |
2、位圖(Bit Map) - 基本位圖和擴展位圖
| 01 | 定長 | B16 | 如將位圖的第一位設為’1’,表示使用擴展位圖,否則表示只使用基本位圖。 如使用某數據域,應在位圖中將相應的位設位’1’,如使用41域,需將位圖的41位設為’1’。 選用條件:如使用65到128域,需設位圖域為’1’ |
3、Bit02主帳號(Primary Account Number )
| 02 | 變長,LLVAR | N..22 | 唯一的確認一個用戶交易的基本帳號。 由于銀行電子服務系統涉及多個應用系統,而帳號長度最多為22位,故將原標準的19長度改為22位。 |
4、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 | N..37 | 寫在卡二磁道的數據。數據組成遵循ISO7811-1985標準,數據中包含域分隔符,但不包含卡啟始、結束符、LRC等。 收卡行應檢測卡的二磁道是否符合國際標準。 為支持國際交換收單行應將二磁道中的分隔符換為“=”。除此外不能對二磁道數據進行任何修改,如修改PAN的校驗字、有效期、服務碼等。 |
19、Bit36三磁道數據(Track 3 Data)
| 36 | LLLVAR | N..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 | 在本地和網絡中定義收卡單位(商戶)的國家、省。城市等。 選用條件:如對外卡網絡,一定要包含此域。 |
26、Bit44附加返回數據(Additional ResponseData)
| 44 | LLVAR | ANS..25 | 在金融(授權)交易中授權機構返回的其他信息。 |
27、Bit48附加數據-私用(Additional Data-Private)
| 48 | LLLVAR | ANS…999 | 銀行電子服務系統使用此域作以下用途 存放批量查詢的返回數據 其格式與輸出格式表對應 |
28、Bit49交易貨幣代碼(Currency Code,Transaction)
| 49 | 定長 | AN3 | 按ISO4217定義的交易貨幣代碼,用來表示“交易金額”(field04)所用的貨幣種類。 交易貨幣代碼是指在收單單位進行交易所用的交易種類。 |
29、Bit50結算貨幣代碼(Currency Code,Settlement)
| 50 | 定長 | AN3 | 按ISO4217定義的結算貨幣代碼,用來表示結算金額、結算處理費、結算交易費等所用的貨幣種類。 結算貨幣代碼是指在進行結算和清算過程中所用的貨幣種類。 |
30、Bit52用戶密碼(PIN)數據(PIN Data)
| 52 | 定長 | B16 | 用戶在服務終端上交易用于識別用戶合法性的一些數字。 PIN在分行主機用分行主機密鑰按ANSIX9.8標準加密,形成密文塊。 選用條件:如果在終端上輸入了密碼,就需要此域。 |
31、Bit53密碼相關控制信息(Security Related Control)
| 53 | 定長 | AN16 | 本域提供有關密碼塊的附加信息,用于指出用于PIN計算的PIN key,用于MAC計算的MAC key。 本域格式如下表所示: 0-1格式代碼2N“20” 2-3PIN加密算法2N“01”:DES 4-5密文塊格式2N“01”:ANSI 6PIN密鑰索引1N‘1’或‘2’ 7MAC密鑰索引1N‘1’或‘2’ 8-11MAC檢查數據4B 12-15填充4N 在BOC信用卡網絡中PIN和MAC各使用兩個密鑰—‘1’號和’2’密鑰,交易中計算PIN和MAC時只能各用某一個KEY,同時需將所用的KEY索引號填寫此域。 選用條件:如果有PIN域或MAC域,一定需有此域。 |
32、Bit54附加金額(Additional Amounts)
| 54 | LLLVAR | ANS…120 | 此域由授權行主機將客戶的余額返回給收單終端,以顯示或打印在客戶回單上。 在此域中最多可有6個余額返回,每個余額返回格式如下: 位置描述 0-1處理碼3-4或5-6位定義的帳號類型 2-3金額類型:01-帳戶金額 02-可用金額 03-擁有金額 04-應付金額 40-可用取款限額 56-可用轉帳限額 4-6金額的貨幣代碼 7‘D’-借記金額,’C’-貸記金額 8-19余額數目 六個余額中必須返回可用余額,在ATM、POS上顯示可用余額 |
33、Bit64信息確認碼(MAC)
| 64 | 定長 | B16 | 數據包的最后一個域,用于驗證信息來源的合法性,以及數據包中數據是否未被篡改。 MAC的計算參ANSIX.99,(最后八字節未滿八位者左補零,右補零?) 為提高效率,在發送者和接收者之間,只有以下一些重要的域參加MAC的計算。數據包中如果存在以下數據域,它們將參加MAC的計算。 位圖域名 2基本帳號 3處理代碼 4交易金額 11系統跟蹤號 12本地交易時間 13本地交易日期 32收單機構代碼 38授權碼 39返回碼 41收單終端代碼 49交易貨幣代碼 95替換金額 選用條件:只使用了1-64域的數據包使用此域。 |
34、Bit70管理信息碼(System Management Indormation Code)
| 70 | 定長 | N3 | 用于定義和維護銀行電子服務系統內部通訊網絡狀態和應用工作狀態。 網絡管理信息代碼用于管理清算日期”cutoff”,通訊”sign on/sign off”,”key exchange”等。 支持以下一些網絡管理信息碼 NMIC網絡管理信息碼動作 001簽到(Sign on) 002簽退(Sign off) 101交換密鑰(Key exchange) 201結帳日期切換(Cutoff) 202結帳日期切換完成 301測試(Echo test) |
35、Bit74貸記交易筆數(Transaction Number)
| 74 | 定長 | N10 | 貸記金融交易總的成功交易次數 CYBERBANK軟件在收到如下一個處理代碼時會增加貸記交易次數。 交易碼交易服務 00貸記,購物與服務 01貸記,取現 02貸記,調整(客戶調整) |
36,Bit75貸記自動沖正交易筆數(Credits,Reversal Number)
| 75 | 定長 | N10 | 貸記收單行自動沖正、“ChargeBack”等交易總的交易次數 CYBERBANK軟件在收到如下一個處理代碼時會增加貸記自動沖正交易筆數 交易碼交易服務 20貸記,退貨 21貸記,存款 22貸記,調整(客戶修改) |
36、Bit75貸記自動沖正交易筆數(Credits,Reversal Number)
| 75 | 定長 | N10 | 貸記收單行自動沖正、“ChargeBack”等交易總的交易次數 CYBERBANK軟件在收到如下一個處理代碼時會增加貸記自動沖正交易筆數 交易碼交易服務 20貸記,退貨 21貸記,存款 22貸記,調整(客戶修改) |
37、Bit76借記交易筆數(Debits,Number)
| 76 | 定長 | N10 | 借記金融交易總的成功交易次數 CYBERBANK軟件在收到如下一個處理代碼時會增加借記交易次數。 交易碼交易服務 00借記,購物與服務 01借記,取現 02借記,調整(客戶調整) |
38、Bit77借記自動沖正交易筆數(Debits,Reversal Number)
| 77 | 定長 | N10 | 借記收單行自動沖正、“ChargeBack”等交易總的交易次數 CYBERBANK軟件在收到如下一個處理代碼時會增加借記重發交易次數,并在清算表報中反映。 交易碼交易服務 20借記(!!!),退貨 21借記,存款 22借記,調整(客戶修改) |
39、Bit78轉帳交易筆數(Transfers,Number)
| 78 | 定長 | N10 | 轉帳的交易總次數。 系統在收到如下一個處理代碼的金融交易時會增加轉帳交易的次數。 交易碼交易服務 40客戶相關帳戶間轉帳 |
40、Bit79轉帳自動沖正交易筆數(Transfers,Reversal Number)
| 79 | 定長 | N10 | 轉帳的自動沖正交易總次數。 系統在收到如下一個處理代碼的自動沖正交易時會增加轉帳自動沖正交易的次數。 交易碼交易服務 40客戶相關帳戶間轉帳 |
41、Bit80查詢交易筆數(Inquiries,Number)
| 80 | 定長 | N10 | 成功的查詢交易次數。 系統軟件在收到如下一個處理代碼時會增加查詢交易次數。 交易碼交易服務 30查詢可用金額 |
42、Bit81授權交易筆數(Authorization,Number)
| 81 | 定長 | N10 | 成功的授權交易總額。在收到一個授權交易時系統將授權交易筆數加一。 |
43、Bit83貸記交易費金額(Credits,Transaction FeeAmount)
| 83 | 定長 | N12 | 凈交易費用,如交易金額為正。 |
44、Bit85借記交易費金額(Debits,Transaction FeeAmount)
| 85 | 定長 | N12 | 凈交易費用,如交易金額為負。 |
45、Bit86貸記交易金額(Credits,Amount)
| 86 | 定長 | N16 | 貸記金融交易總的交易金額,不含任何費用。 系統在收到如下一個處理代碼時會增加貸記交易金額,并在清算表報中反映。 交易碼交易服務 20貸記,退貨 21貸記,存款 22貸記,調整(客戶修改) |
46、Bit87貸記自動沖正金額(Credits,Reversal Amount)
| 87 | 定長 | N16 | 信用卡自動沖正交易的總金額,不含任何費用。 |
47、Bit88借記交易金額(Debits,Amount)
| 88 | 定長 | N16 | 借記金融交易總的交易金額,不含任何費用。 系統在收到如下一個處理代碼時會增加借記交易金額,并在清算表報中反映。 交易碼交易服務 00借記,購物與服務 01借記,取現 02借記,調整(客戶調整) |
48、it89借記自動沖正交易金額(Debits,Reversal Amount)
| 89 | 定長 | N16 | 借記自動沖正交易的總金額,不含任何費用。 |
49、Bit90原交易的數據元素(Original Data Elements)
| 90 | 定長 | N42 | 存放原交易的一些數據,用于修改或自動沖正。 數據由以下五部分組成: 位置描述 1-4信息類型碼 設為原交易的信息類型代碼 5-10系統跟蹤號 原交易系統跟蹤號 11-20交易日期和時間 原交易的交易日期和時間 21-31原收單機構 原交易的收單機構 不足11位的機構代碼,左補‘0’ 32-42原向前機構 原交易的收單機構 不足11位的機構代碼,左補‘0’ |
50、Bit91文件修改編碼(File Update Code)
| 91 | 定長 | AN1 | 用此域指示某文件怎樣維護。 CYBERBANK支持以下一些修改代碼: 1增加記錄 2改變記錄 3刪除記錄 5查詢 7增加文件 |
51、Bit94服務指示碼(Service Indicator)
| 94 | 定長 | AN7 | 指示文件修改服務。 |
52、Bit95代替金額(Replacement Amounts)
| 95 | 定長 | N42 | 客戶修改或部分取消已完成的交易,最后實際發生的交易金額,交易的原交易金額存放在90域。 本域由以下4部分組成 Sub-ElementAmountAttribute 交易實際金額N12 結算實際金額N12 實際交易費用X+N8 實際結算費用X+N8 |
53、Bit97凈結算金額(Net Settlement Amount)
| 97 | 定長 | X+N16 | 此域為凈結帳金額。 502交易中用于發送當天的凈結算金額 例:“C0000000020000000”,表示貸方(’+’?)200000.00元。 “D0000000020000000”,表示借方(’-’?)200000.00元。 |
54、Bit99結算機構碼(Settlement Institution Identification)
| 99 | LLVAR | N..11 | 此域存放接收清算信息的機構代碼。返回數據包此域必須和請求數據包一致。 |
55、Bit100接收機構碼(Receiving Institution Identification)
| 100 | LLVAR | N..11 | 金融交易此域存放授權機構代碼。 網管類交易,800/820交易,此域存放請求的目的機構代碼。 返回數據包此域必須和請求數據包一致。 |
56、Bit101文件名(FileName)
| 101 | LLVAR | ANS..17 | 發送機構設置的文件名。 |
57、Bit102帳號1(Account Identification1)
| 102 | LLVAR | ANS..28 | 一個特定的客戶帳號。帳號1用來描述受借記、轉出、支付等交易影響的帳戶。 選用條件:轉帳時使用。 |
58、Bit103帳號2(Account Identiication2)
| 103 | LLVAR | ANS..28 | 交易的補充信息,如:第二貨幣號、利率代碼、起止日期等。 定義如下表 0000000000000000000000000000000000000000000000000 位置長度描述 00-2122帳戶 22-276發卡機構號 如果此域存在,將按此機構代碼作為路由信息。 選用條件:機構間轉帳時使用。 |
60、Bit123新密碼數據(New PIN Data)
| 123 | LLLVAR | B…16 | 修改密碼交易時存放新密碼。 格式參考52域 選用條件:修改密碼交易時必須有此域。 |
61、Bit128信息確認碼(MAC)
| 128 | 定長 | B16 | 數據包的最后一個域,用于驗證信息來源的合法性,以及數據包中數據是否未被篡改。 MAC的計算參ANSIX.99 為提高效率,在發送者和接收者之間,只有以下一些重要的域參加MAC的計算。數據包中如果存在以下數據域,它們將參加MAC的計算。 位圖域名: 2基本帳號 3處理代碼 4交易金額 11系統跟蹤號 12本地交易時間 13本地交易日期 32收單機構代碼 38授權碼 39返回碼 41收單終端代碼 49交易貨幣代碼 95替換金額 選用條件:使用65-128數據域的數據包需使用此域。 |
舉個例子
現在我們有ISO8583報文如下(十六進制表示法):
| 1 | 60 00 03 00 00 60 31 00 31 07 30 02 00 30 20 04 C0 20 C0 98 11 00 00 00 00 00 00 00 00 01 00 03 49 02 10 00 12 30 62 25 82 21 12 99 63 01 5D 15 11 10 10 00 00 35 36 38 35 32 33 31 34 32 33 35 32 31 34 35 32 36 38 35 39 32 33 36 31 35 36 C6 24 83 4D 36 7E 9E 9E 20 00 00 00 00 00 00 00 00 13 22 00 00 08 00 05 00 36 37 41 32 32 39 39 41 |
解析結果為:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Message = 0200 Bitmap? = 30 20 04 C0 20 C0 98 11 Bit? 3? = 000000 Bit? 4? = 000000000001 Bit 11? = 000349 Bit 22? = 0210 Bit 25? = 00 Bit 26? = 12 Bit 35? = (30)62258221129963015=151110100000 Bit 41? = 56852314 Bit 42? = 235214526859236 Bit 49? = 156 Bit 52? = C6 24 83 4D 36 7E 9E 9E Bit 53? = 2000000000000000 Bit 60? = (13)2200000800050 Bit 64? = 36 37 41 32 32 39 39 41 |
那么,是如何解析的呢?
第一步
POS終端上送POS中心的消息報文結構包括TPDU、報文頭和應用數據三部分:
——TPDU說明:長度為10個字節,壓縮時用BCD碼表示為5個字節長度的數值。
——報文頭說明:總長度為12字節,壓縮時用BCD碼表示為6個字節長度的數值。
——應用數據說明:一般長度都是4個字節,壓縮時用BCD碼表示為2個字節的長度的數值。
所以上述報文中前五個字節為TPDU,即60 00 03 00 00
報文頭占用六個字節,即 60 31 00 31 07 30
應用數據占用2個字節,即 02 00 也就是”0200”
——0200金融類請求消息:
● POS查詢請求。
● POS消費請求。
● POS消費撤銷請求。
● POS預授權完成(請求)請求。
● POS預授權完成撤銷請求。
● 電子現金脫機消費請求。
● 分期付款消費請求。
● 分期付款消費撤銷請求。
● 基于PBOC電子錢包/電子現金的IC圈存類交易請求。
● 磁條卡現金充值請求。
第二步
分析位圖:
首先取第十四個字節,即0x30 ,轉化為二進制為0011 0000,在該字節的第一位為0(從左往右)表示當前報文中只需包括64個域,也就是從當前字節開始連續8個字節為位圖(包括當前字節),如要包括128個域,該位為1。
現在進入關鍵的位圖分析,現在我們取到了表示位圖的8個字節即30 20 04 C0 20 C0 98 11,轉為二進制為
00110000 00100000 00000100 11000000 00100000 11000000 10011000 00010001
位圖中為1的位置即代表相應的域,在上面的二進制位中從左往右有第3位、第4位、第11位、第22位、第25位、第26位、第35位、第41位、第42位、第49位、第52位、第53位、第60位、第64位。
下面開始這些域中的數據,首先分析3域,3域為交易處理碼,壓縮成BCD碼后占定長3個字節,我們從位圖所占的8個字節后開始連續取3個字節,即 00 00 00,解壓后即為“000000”,具體代表含義這里就不敘述了。
4域為交易金額,壓縮成BCD碼后占定長6個字節,同理取6個字節,即00 00 00 00 00 01,也就是金額0.01元,具體轉換參考銀聯規范。
11域為受卡方系統跟蹤號(流水號),壓縮成BCD碼占定長3個字節,同理取3個字節,即00 03 49,即000349。
22域為服務點輸入方式碼,壓縮成BCD碼占定長2個字節,同理取2個字節,即02 10,由于22域本身只占3個字節,壓縮時左靠,右補0,所以轉換為“021”,具體含義不再敘述。
25域為服務點條件碼,壓縮成BCD碼占定長1個字節,同理取1個字節,即00,轉換為“00”,“00”代表正常提交。
26域為服務點PIN獲取碼,壓縮成BCD碼占定長1個字節,同理取1個字節,即12,轉換為“12”,表示服務點設備所允許輸入的個人密碼明文的最大長度為12。
解下來的35域由于不是定長,所以處理方法不同,先取一個字節,即30,轉換為“30”,表示第二磁道的數據占用30個字節,取連續15個字節即62 25 82 21 12 99 63 01 5D 15 11 10 10 00 00,這里不對這串數據進行說明了。
41域為受卡機終端標識碼,占8個字節的定長域,取35 36 38 35 32 33 31 34。
42域為受卡方標識碼,占15個字節的定長域,取32 33 35 32 31 34 35 32 36 38 35 39 32 33 36。
49域為交易貨幣代碼,占3個字節的定長域,取31 35 36。
52域為個人標識碼數據,占8個字節的定長二進制數域,取C6 24 83 4D 36 7E 9E 9E。
53域為安全控制信息,壓縮成BCD碼占8個字節定長域,取20 00 00 00 00 00 00 00。
60域為自定義域,為不定長域,先取長度(壓縮成BCD碼占兩個字節),即00 13,轉換為13即占60域占13個字節,壓縮成BCD碼占7個字節,取22 00 00 08 00 05 00。
64域為報文鑒別碼,占定長8個字節,取最后八個字節36 37 41 32 32 39 39 41。
總結
以上是生活随笔為你收集整理的金融交易报文ISO8583协议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习实战案例—验证码(CAPTCHA
- 下一篇: python 微信公众号开发[1] 后台