『壹』 如何向POS發送8583報文,又如何讀取POS返回的
8583是這樣的,我舉一個簡單的例子。以64個域的報文來舉例,域是什麼我也說不清楚,你可以把它想像為醫院放葯的抽屜,一個抽屜預先定義好要放什麼東西,比如偉哥,或者感冒沖劑,一般情況下定義放偉哥的抽屜最好永遠放偉哥,不要放別的東西,當然你也可以放板藍根,但這樣的話容易出錯,也不太規范。
數量是這么規定的,有三種情況:
首先是定量,也就是說定義好這個抽屜放30瓶偉哥,就放30瓶一瓶也不能多,一瓶也不能少。
其次是LLVAR,也就是說用1位位元組定義數量,比如0x12表示里頭放12瓶,當然你也可以理解為16+2=18瓶。但要是0x12表示12,那0x13就等於13,不要0x12=12 ,0x13=19
最後是LLLVAR,是2位位元組表示數量,比如 0x01,0x04 = 104
域也就是這樣的,一共有64個域,每個域預先定義了內容和長度
有一個叫做BITMAP的,也就是點陣圖,定義了一個數據包里包含
了幾個域。舉個例子
20 00 38 00 00 00 00 34
你把它解開,排列一下
20 = 0010 0000
00 = 0000 0000
38 = 0011 1000
依次類推,得到一串數字
0010 0000 0000 0000 0011 1000 0000 0000 0000 0000 0000 0000 0000 0000 0011 0100
然後從左到右數一下里頭含有1的是那幾位,上面的例子我們得到
3 19 20 21 59 60 62 ,這幾位含有1。也就是說接下來的報文包含有這幾個域。
好了說了那麼多,我們來做一個簡單的例子比如消費交易,需要上送交易類型,卡號等等,定義如下
卡號 第2域 LLVAR BCD 5309987876545342
交易類型 第3域 長度6 BCD 900000
金額 第4域 長度12 BCD 100分
時間 第7域 長度8 BCD 20030802
2磁軌信息 第35域 LLVAR ASCII 123456
3磁軌信息 第36域 LLLVAR BCD 123456001
商戶號 第41域 LLVAR ASCII 98765432
好了我們現在開始打包,首先按照長度和類型把上面的數據處理一下
卡號 09987876545342
交易類型 900000
金額 000000000100
時間 20030802
2磁軌 06313233343536
3磁軌 0009123456001
商戶號 083938373635343332
接下來我們按照域信息生成點陣圖
因為有第2域,所以第二個位置是1,由第三域,所以第三個位置
是1,。。。
依此類推得到一串數字
0111 0010 0000 0000 0000 0000 0000 0000 0011 0000 1000 0000 0000 0000 0000 0000
轉換過來,就是
72 00 00 00 30 80 00 00 這個就是BITMAP了
然後把上面的數據按照BITMAP+每個域的內容,依次排列
就得到這個包的內容了
前頭再加上TPDU和MSGID就是最後的數據包
『貳』 ISO8583報文怎麼解
ISO8583報文如下(十六進製表示法):
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
第一步
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。
『叄』 JAVA ISO8583 J8583 JPOS銀聯通訊DEMO
你用這個看一下吧,裡面有example,可以自己跑一下看下,具體理解,自己來處理吧