8583报文背景知识,来源与应用
资料
8583设计原理参考
8583实例解析(我认为有部分失误,标记为ASN/AS的字段,实际上是ASIC码,而不是BCD码)
8583字段文档下载
POS应用规范(QCUP009.1-2014).pdf 百度网盘 ,提取码 waff
一些预备知识
进制转换
2进制转8421BCD码
2进制转十进制,十进制再转成8421BCD码
例如 1000 1000(2进制) 136(十进制) 01H 36H(16进制BCD)
2进制转16进制
首先补足位数为4的倍数,小数点左边,在左边补0,小数部分,在右边补零,然后每四位合并为1位16进制数(0-f)
例如1000 0100 0010 0001.0100 (2进制) 8421.4H(16进制,H后缀表示16进制,0x前缀也表示16进制)
2进制转ASCII码
先转十进制,再根据十进制字符转对应的ASCII码,
例如:0110 0001 0002(2进制) 612(十进制) 54 49 50(ASCII)
文档中字段说明
Ax A..x,如果x为奇数,则右靠补零,凑足偶一个BCD码
A代表用ASCII码表示,否则用正常2进制
A8 8字节定长ASCII码
A..8最长8字节的变长ASCII码
报文中16进制,BCD码,ASIC码的使用
放在报文前头的长度信息,一般是正常16进制表示长度,报文内容需要查询文档,数字域一般为压缩BCD码(长度字段也是数字域),数据标记带A开头的,一般为ASIC码
自己动手解析报文
解析报文,这里推荐资料来源2中的描述
报文长度(2字节)+TPDU(5字节)+报文头(6字节)+域数据(指令码(0域 2字节 消息类型)+位图(8字节)+其他域数据
这里采用资料来源2中的报文,按照上面的组成,开始解析
007b600016000060220000000002007020048020c08811165477666265921222000000000000014959555556022000375477666265921222d25085060000012600000033333333333333333232323232323232323232323232323135361000000000000000000822000001001500000100100000103133394343433842
007b
报文长度 16进制
007b(16进制)=7*16^1+b*16^0=123
报文长度取123字节
按照上面的报文构成,2+123=125字节.对整个报文长度计算长度,125字节,长度验证符合.
6000160000
TPDU头,5个字节
602200000000
报文头,6个字节
0200
0域指令码,2字节
查询文档P87,消息类型,可以看到0200支持的交易
7020048020c08811
主位图信息8字节
转换为二进制
0111 0000 0010 0000 0000
0100 1000 0000 0010 0000
1100 0000 1000 1000 0001
0001
结果域2,3,4,11,22,25,35,41,42,49,53,60,64有数据存在
165477666265921222
域2 主账号
N..19(LLVAR),BCD表示,一个字节长度+最长10个字节左靠BCD码;
先取长度字节16,再按长度取8字节(16压缩为8字节)5477666265921222
000000
域3 交易处理码
N6 定长6个字节,传输时压缩为3字节BCD码
,具体含义需要查询文档P91
000000014959
域4 交易金额
N12 定长12字节,传输时压缩为6字节BCD码
币种需要查询49域,这里是人民币,拆线呢文档,代表金额149.59元
555556
域11 受卡方系统跟踪号
N6 定长6字节,传输压缩3字节BCD码
0220
域22 服务点输入方式码
N4 定长4个字节,传输压缩2个字节BCD码
查询文档,0220代表磁条交易不含pin
00
域25 服务点条件码
N2 定长2个字节,传输压缩1个字节BCD码
查询文档,00代表正常提交
375477666265921222d250 850600000126000000
域35 2磁道数据
Z..37(LLVAR)2个字节长度值,最大37字节变长数据 传输压缩1个字节长度+最大19字节左靠BCD码
33333333 33333333
域41 受卡机终端标识码
ANS8 8位ASCII码
ASCII码转字符表示 3333 3333
32323232 32323232 32323232 323232
域42 受卡方标识码
ANS15 15位ASCII码
字符表示 2222 2222 2222 222
313536
域49 交易货币代码
AN3 3位ASCII码
人民币代码156
10000000 00000000
域53 安全控制信息
N16 16字节定长信息,传输压缩8字节BCD码
0008 22000001
域60 自定义域
N..17(LLLVAR) 3个字节表示长度,最大17个字节的数字域.传输压缩为2字节右靠BCD码+最大9字节的左靠BCD码
长度值8,具体含义查询文档
60.1 N2 22 消费/冲正
60.2 N6 000001 批次号
0015 0000 0100 1000 0010
域61 原始信息域(位图中没有,但是实际上在60和64域中有一段数据,没有对应的信息,这里我只能牵强附会,认为实际上是61域数据,位图在61位应该置1)
N..029(LLLVAR) 3字节长度+最长29字节的数字 压缩传输时,右靠2字节BCD码+左靠最大15字节BCD码表示
61.1原始交易批次号 N6 000 001
61.2 原始交易pos流水号 N6 001 000
61.3 原始交易时间 N4 0010
31333943 43433842
域64 报文鉴别码 MAC
B64 8个字节的定长域
报文来源正确性鉴别码
每次信息传输,都要重新计算MAC值,以鉴别信息在传送中是否被篡改