讓咱們隨着時光回到幾十年前的某個時刻,假設咱們被推到歷史的舞臺上,由咱們來設計一個通用報文協議,來解決金融系統之間的報文交換,暫且稱該協議叫作ISO8583協議。此時,技術是在不斷的前行,當初IBM一支獨秀的局面好像已經不妙了,各類大小不一的公司都進入金融行業以求能有所斬獲,呈一片百花齊放的局面。咱們怎樣來設計一個報文協議,可以將這些如雨後春筍般出現的全部公司都歸入進來,其實也不是一件很簡單的事。 咱們仍是先一步步的來考慮吧。金融行業其實涉及到的數據內容並非成千上萬,沒法統計,偏偏相反,是比較少的。咱們均可以在心底數得過來,象交易類型、賬號、賬戶類型、密碼、交易金額、交易手續費、日期時間、商戶代碼、2磁3磁數據、交易序列號等,把全部可以總結出來的都總結起來不過100個左右的數據。那咱們能夠首先簡單的設計ISO8583,定義128個字段,將全部可以考慮到的相似上面提到的「賬號」等金融數據類型,按照一個順序排起來,分別對應128個字段中的一個字段。每一個數據類型佔固定的長度,這個順序和長度咱們都事先定義好。這樣就簡單了,要發送一個報文時,就將128個字段按照順序接起來,而後將接起來的整串數據包發送出去。 任何金融軟件收到ISO8583包後,直接按照咱們定義的規範解包便可,由於整個報文的128個字段從哪一位到哪一位表明什麼,你們都知道,只要知道你的數據包是ISO8583包便可,咱們都已經定義好了。好比第1個字段是「交易類型」,長度爲4位,第2個字段位是「賬號」,爲19位等等。接收方就能夠先取4位,再取接着的19位,依次類推,直到整個數據包128個字段都解完爲止。 其實這種作法真是簡單直接,基本上就能夠知足須要了。算法
不過咱們有幾個問題要思考下: 一、 我怎麼知道每一個字段的數據類型呢,是數字仍是字符? 二、 每一個傳送的報文都把128個字段都傳過去,那網絡帶寬可以承受得了,有時候我可能只須要其中5個字段,結果多收到了123個無用的字段。 三、 若是我某些字段的長度不固定,屬於變長怎麼辦,由於你如今解包是看成數據包每一個字段都是固定的,用C語言解包時直接依靠指針取固定長度的一串字符作爲一個字段。 咱們來一一解決這些問題。網絡
第一個問題簡單,我在定義ISO8583時除了定義每一個字段表示什麼,還規定其內容是數字或是字符等便可。考慮可能出現的類型不過有如下幾種:字母、數字、特殊字符、年月日等時間、二進制數據。好比我對128個字段中的「商戶類型」字段定義其長度是15,同時定義其類型爲字母。再精細點,若是「商戶類型」裏面的數據同時包括數字和字母呢?那咱們就定義其類型爲字母也可,爲數字也可,即一個字段能夠同時屬於多個類型。post
第二個問題稍微複雜點。其本質就是若是我只傳128個字段的5個字段,接收方怎麼知道我傳了哪幾個字段給它了。要是咱們把剩下的123所有填成0或其餘特殊標識,標明該字段不須要使用?這種處理方法沒有半點用處,沒有解決網絡帶寬的本質問題,仍是要傳128個字段。 換個思路,我在報文前面加上個包頭,包頭裏麪包含的信息可以讓別人知道只傳了5個字段。怎樣設計這個包頭,能夠這樣,咱們用16個字節,即128個bit(一個字節等於8bit)來表示128個字段中的某個字段是否存在。每一個bit在計算機的二進制裏面不是1就是0,若是是1就表示對應的字段在本次報文中存在,若是是0就是不存在。這樣好了,若是別人接收到了ISO8583報文,能夠先根據最前面的報文頭,就知道緊接着報文頭後面的報文有哪些字段,沒有哪些字段了。好比,我要發送5個字段,分別屬於128個字段中的第二、三、六、八、9字段,我就能夠將128bit的報文頭填成011001011000000000………..,一共128個bit,後面就全是0了。注意其中第二、三、六、八、9位爲1,其餘都爲0。 有了這個128bit的報文頭,咱們就能夠只發送須要的5個字段了。怎樣組織報文?先放上這128bit,即16個字節的頭,而後在頭後面放二、三、六、八、9字段,這些字段緊挨在一塊兒,3和6之間也不須要填上四、5這兩個字段了。接收方收到這個報文,它會根據128bit的報文頭來解包,它天然知道把第3個字段取出後,就直接在第3字段的後面取第6個字段,每一個字段的長度在ISO8583裏面都定義好了,很輕鬆就把數據包解出來了。 這下好了,爲了解決上面的第二問題,咱們只是在報文中增長了16個字節的數據,就輕鬆搞定了,咱們把這16個字節稱爲bit map,即位圖,用來表示某個位是否存在。不過咱們再稍微優化一下,考慮到不少時候報文不須要128個字段這麼多,其一半64個字段都不必定可以用完。那我能夠將報文頭由128bit減到64bit,只有在須要的時候才把剩下的64bit放到報文裏面,這樣報文長度不又少了8個字節嗎? 是個好主意。咱們把ISO8583的128個字段中最多見的都放到前64個字段中,那咱們能夠將處理縮小一倍。這樣我通常發送報文時只需發送64bit,即一個字節的報文頭,再加上須要的幾個字段就能夠了。若是有些報文用到64到128之間的字段呢?這個也好辦,我把64bit報文頭的第一位bit用來表明特殊含義,若是該bit爲1,則表示64bit後面跟了剩下的64bit報文頭;若是第一位bit爲0,則表示64bit後面沒有跟剩下的64bit報文頭,直接是128個字段中的報文了。那們,接收方會判斷一下報頭的第一個bit是1仍是0,從而知道報文頭是64bit仍是128bit了,就能夠作相應處理。由於報文頭第二個64bit屬於有時候有,因此咱們叫它Extended bit map擴展位圖,相應的報文頭最開始的64bit咱們叫它Primary bit map主位圖。咱們直接把擴展位圖固定放到128個字段的第一個字段,而主位圖每一個數據包都有,就強制性放在全部128個字段的前面,並不納入128個字段中去。測試
第三個問題能夠考慮這樣解決。好比第2個字段是「賬號」,是不定長的,可能有的銀行賬號是19位,有的是17位等。咱們定ISO8583規範時能夠規定第2個字段是25位,這下足夠將19和17的狀況都包含進來,可是若是之後出現了30位的怎麼辦?那咱們如今將字段定爲100位。之後超過100位怎麼辦,何況若是你只有19位的賬號,咱們定義了100位,那81位的數據不是浪費了網絡的帶寬。看來預先定義一個咱們認爲比較大的位數是不太好的。 咱們這樣,對於第2個字段「賬號」,在字段的開頭加上「賬號」的長度。好比賬號是0123456789,一共10位,咱們變成100123456789,注意前面多了個10,表示後面的10位爲賬號。若是你接觸過COM裏面的BSTR,應該對這種處理比較熟悉了。接收方收到該字段後,它知道ISO8583規定第2個字段「賬號」是變長的,因此會先取前面的2位出來,獲取其值,此時爲長度,而後根據該長度值知道應該拷貝該字段後面哪幾位數據,纔是真正的賬號。若是你以爲長度若是隻有兩位最多隻能表示99位長,不太夠,咱們也定義能夠容許前面3位都爲長度的變長字段,這樣就有999位長,應該夠了吧。在規範裏面若是我定義某個字段的屬性是「LLVAR」,你注意了,其中的LL表示長度,VAR表示後面的數據,兩個LL表示兩位長,最大是99,若是是三位就是「LLLVAR」,最大是999。這樣看咱們定義的ISO8583規範文檔時直接根據這幾個字母就理解某個變長字段的意思了。優化
該解決的幾個問題到這裏都解決了,咱們來回顧下本身設計的ISO8583規範。其實沒有什麼,無非是把金融行業可能出現的數據分門別類,排好順序,接着把它們鏈接起來,組成一個報文發送出去而已。其中針對該報文的設計進行了一些優化,引入了bit map位圖的概念,也算是一個不錯的想法。 剩下的工做就簡單了,咱們就直接收集金融行業可能出現的數據字段類型,分紅128個字段類型,若是沒有到128個這麼多就先保留一些下來,另外考慮到有些人有特殊的要求,咱們規定能夠將128個字段中的幾個字段你本身來定義其內容,也算是一種擴展了。 這樣,最後咱們就獲得了ISO8583規範的那張字段描述表了。ui
ISO8583包(簡稱8583包)是一個國際標準的包格式,最多由128個字段域組成,每一個域都有統一的規定,並有定長與變長之分。
8583包前面一段爲位圖,用來肯定包的字段域組成狀況。
其中位圖是8583包的靈魂,它是打包解包肯定字段域的關鍵, 而瞭解每一個字段域的屬性則是填寫數據的基礎。
編碼
一、位圖描述以下:
位圖位置:1
格式:定長
類型:B16(二進制16位,16*8=128bit)
描述:
如將位圖的第一位設爲'1',表示使用擴展位圖(128個域),不然表示只使用基本位圖(64個域)。
如使用某數據域,應在位圖中將相應的位設位'1',如使用41域,需將位圖的41位設爲'1'。
選用條件:如使用65到128域,需設位圖域第一位爲'1'
加密
二、每一個域的定義以下:
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 19 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},
/* FLD 20 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},
/* FLD 21 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},
/* FLD 22 */ {0,"POINT OF SERVICE ENTRY MODE ", 3, 0, 0, 0, NULL,0},
/* FLD 23 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},
/* FLD 24 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},
/* FLD 25 */ {0,"POINT OF SERVICE CONDITION CODE ", 2, 0, 0, 0, NULL,0},
/* FLD 26 */ {0,"NO USE ", 2, 0, 0, 0, NULL,0},
/* FLD 27 */ {0,"NO USE ", 1, 0, 0, 0, NULL,0},
/* FLD 28 */ {0,"field27 ", 6, 0, 0, 0, NULL,0},
/* FLD 29 */ {0,"NO USE ", 8, 0, 1, 0, NULL,0},
/* FLD 30 */ {0,"NO USE ", 8, 0, 1, 0, NULL,0},
/* FLD 31 */ {0,"NO USE ", 8, 0, 1, 0, NULL,0},
/* FLD 32 */ {0,"ACQUIRER INSTITUTION ID. CODE ", 11, 0, 2, 0, NULL,0},
/* FLD 33 */ {0,"FORWARDING INSTITUTION ID. CODE ", 11, 0, 2, 0, NULL,0},
/* FLD 34 */ {0,"NO USE ", 28, 0, 2, 0, NULL,0},
/* FLD 35 */ {0,"TRACK 2 DATA ", 37, 0, 2, 0, NULL,0},
/* FLD 36 */ {0,"TRACK 3 DATA ",104, 0, 3, 0, NULL,0},
/* FLD 37 */ {0,"RETRIEVAL REFERENCE NUMBER ", 12, 0, 0, 0, NULL,0},
/* FLD 38 */ {0,"AUTH. IDENTIFICATION RESPONSE ", 6, 0, 0, 0, NULL,0},
/* FLD 39 */ {0,"RESPONSE CODE ", 2, 0, 0, 0, NULL,0},
/* FLD 40 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},
/* FLD 41 */ {0,"CARD ACCEPTOR TERMINAL ID. ", 8, 0, 0, 0, NULL,0},
/* FLD 42 */ {0,"CARD ACCEPTOR IDENTIFICATION CODE ", 15, 0, 0, 0, NULL,0},
/* FLD 43 */ {0,"CARD ACCEPTOR NAME LOCATION ", 40, 0, 0, 0, NULL,0},
/* FLD 44 */ {0,"ADDITIONAL RESPONSE DATA ", 25, 0, 2, 0, NULL,0},
/* FLD 45 */ {0,"NO USE ", 76, 0, 2, 0, NULL,0},
/* FLD 46 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 47 */ {0,"field47 ",999, 0, 3, 0, NULL,0},
/* FLD 48 */ {0,"ADDITIONAL DATA --- PRIVATE ",999, 0, 3, 0, NULL,0},
/* FLD 49 */ {0,"CURRENCY CODE,TRANSACTION ", 3, 0, 0, 0, NULL,0},
/* FLD 50 */ {0,"CURRENCY CODE,SETTLEMENT ", 3, 0, 0, 0, NULL,0},
/* FLD 51 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},
/* FLD 52 */ {0,"PERSONAL IDENTIFICATION NUMBER DATA ", 8, 0, 0, 2, NULL,0},
/* FLD 53 */ {0,"SECURITY RELATED CONTROL INformATION", 16, 0, 0, 0, NULL,0},
/* FLD 54 */ {0,"ADDITIONAL AMOUNTS ",120, 0, 3, 0, NULL,0},
/* FLD 55 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 56 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 57 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 58 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 59 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 60 */ {0,"NO USE ", 5, 0, 3, 0, NULL,0},
/* FLD 61 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 62 */ {0,"NO USE ", 11, 0, 3, 0, NULL,0},
/* FLD 63 */ {0,"NO USE ", 11, 0, 3, 0, NULL,0},
/* FLD 64 */ {0,"MESSAGE AUTHENTICATION CODE FIELD ", 8, 0, 0, 2, NULL,0},
/* FLD 65 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 66 */ {0,"NO USE ", 1, 0, 0, 0, NULL,0},
/* FLD 67 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 68 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 69 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 70 */ {0,"SYSTEM MANAGEMENT INformATION CODE ", 3, 0, 0, 0, NULL,0},
/* FLD 71 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 72 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 73 */ {0,"NO USE ", 6, 0, 0, 0, NULL,0},
/* FLD 74 */ {0,"NUMBER OF CREDITS ", 10, 0, 0, 0, NULL,0},
/* FLD 75 */ {0,"REVERSAL NUMBER OF CREDITS ", 10, 0, 0, 0, NULL,0},
/* FLD 76 */ {0,"NUMBER OF DEBITS ", 10, 0, 0, 0, NULL,0},
/* FLD 77 */ {0,"REVERSAL NUMBER OF DEBITS ", 10, 0, 0, 0, NULL,0},
/* FLD 78 */ {0,"NUMBER OF TRANSFER ", 10, 0, 0, 0, NULL,0},
/* FLD 79 */ {0,"REVERSAL NUMBER OF TRANSFER ", 10, 0, 0, 0, NULL,0},
/* FLD 80 */ {0,"NUMBER OF INQUIRS ", 10, 0, 0, 0, NULL,0},
/* FLD 81 */ {0,"AUTHORIZATION NUMBER ", 10, 0, 0, 0, NULL,0},
/* FLD 82 */ {0,"NO USE ", 12, 0, 0, 0, NULL,0},
/* FLD 83 */ {0,"CREDITS,TRANSCATION FEEAMOUNT ", 12, 0, 0, 0, NULL,0},
/* FLD 84 */ {0,"NO USE ", 12, 0, 0, 0, NULL,0},
/* FLD 85 */ {0,"DEBITS,TRANSCATION FEEAMOUNT ", 12, 0, 0, 0, NULL,0},
/* FLD 86 */ {0,"AMOUNT OF CREDITS ", 16, 0, 0, 0, NULL,0},
/* FLD 87 */ {0,"REVERSAL AMOUNT OF CREDITS ", 16, 0, 0, 0, NULL,0},
/* FLD 88 */ {0,"AMOUNT OF DEBITS ", 16, 0, 0, 0, NULL,0},
/* FLD 89 */ {0,"REVERSAL AMOUNT OF DEBITS ", 16, 0, 0, 0, NULL,0},
/* FLD 90 */ {0,"ORIGINAL DATA ELEMENTS ", 42, 0, 0, 0, NULL,0},
/* FLD 91 */ {0,"FILE UPDATE CODE ", 1, 0, 0, 0, NULL,0},
/* FLD 92 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 93 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 94 */ {0,"SERVICE INDICATOR ", 7, 0, 0, 0, NULL,0},
/* FLD 95 */ {0,"REPLACEMENT AMOUNTS ", 42, 0, 0, 0, NULL,0},
/* FLD 96 */ {0,"NO USE ", 8, 0, 0, 0, NULL,0},
/* FLD 97 */ {0,"AMOUNT OF NET SETTLEMENT ", 16, 0, 0, 0, NULL,0},
/* FLD 98 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 99 */ {0,"SETTLEMENT INSTITUTION ID ", 11, 0, 2, 0, NULL,0},
/* FLD 100 */ {0,"RECVEING INSTITUTION ID ", 11, 0, 2, 0, NULL,0},
/* FLD 101 */ {0,"FILENAME ", 17, 0, 2, 0, NULL,0},
/* FLD 102 */ {0,"ACCOUNT IDENTIFICATION1 ", 28, 0, 2, 0, NULL,0},
/* FLD 103 */ {0,"ACCOUNT IDENTIFICATION2 ", 28, 0, 2, 0, NULL,0},
/* FLD 104 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 105 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 106 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 107 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 108 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 109 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 110 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 111 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 112 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 113 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 114 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 115 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 116 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 117 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 118 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 119 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 120 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 121 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},
/* FLD 122 */ {0,"NO USE ",999, 0, 3, 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},
};指針
3、變長,定長域說明
如第二域:域名爲主賬號,
數據類型爲string
長度爲22(是長長度不得超過此數)
是個2位變長域
因爲是2位變長,在打包時需在數據域前加上數據的實際長度,如爲19位,則表示爲:
19+數據值(即前兩位爲長度)
如第三域:域名爲處理碼,
數據類型爲string
長度爲6
是個定長域
必須填滿6位。
附A:ISO8583各域段的說明
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'
三、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,Bit06交易日期和時間(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等交易如沒有二、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,Bit3向前機構標識碼(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
描述:在本地和網絡中定義收卡單位(商戶)的國家、省。城市等。
選用條件:如對外卡網絡,必定要包含此域。
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貸記,調整(客戶修改)
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,Bit89借記自動衝正交易金額(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數據域的數據包需使用此域。