8583报文解析1.0
一、规则
6000030000613200321001
0200
7024068420C48A11
166224242900000097
000000
000000006633
000737
2806
0720
0000
00
A557408463A49AB0A96CEA1BCEF80F88
48797BEED5677DCD7996A2A9ED47D0F33F5FFEFB806712582E
3836303030393032
383433313735303738333241494C4C
00725049303637303430323032303531373030303033313032393031373039323339383934373135303630363030303039373037303834314632443443453038303856312E322E392020
313536
0600000000000000
01329F260857A5387B3B16E7949F2701809F101307011703A00000010A0100000000006821587C9F3704065893499F360202C5950500000000009A031901119C01009F02060000000066335F2A02015682027C009F1A0201569F03060000000000009F3303E0E1C89F3501228408A0000003330101029F090200309F1E086D6639305F303100
001422000005000601
4630443332384230
1.1:域规范简表
- 域的定义是基本业内规范,但是不代表要完全跟随规范,不同的项目需求不一样,与规范会有极小差异。
- 这里仅供参考。
| 域 |
长度(字符) |
规则说明 |
| 报文头 |
26 |
|
| 0 |
4 |
操作类型 |
| 1 |
16 |
有效的域的定义,16进制格式 |
| 2 |
2+len |
主账号,前1个字节定义内容长度 |
| 3 |
6 |
交易处理码 |
| 4 |
12 |
交易金额 |
| 5 |
|
|
| 6 |
|
|
| 7 |
|
|
| 8 |
|
|
| 9 |
|
|
| 10 |
|
|
| 11 |
6 |
受卡方系统跟踪号 |
| 12 |
6 |
受卡方所在地时间,格式:hhmmss |
| 13 |
4 |
受卡方所在地日期,格式:MMDD |
| 14 |
4 |
卡有效期,格式:YYMM |
| 15 |
4 |
清算日期,格式:MMDD |
| 16 |
|
|
| 17 |
|
|
| 18 |
|
|
| 19 |
|
|
| 20 |
|
|
| 21 |
|
|
| 22 |
3 |
服务点输入方式码 |
| 23 |
3 |
卡序列号 |
| 24 |
|
|
| 25 |
2 |
服务点条件码 |
| 26 |
2 |
服务点PIN获取码 |
| 27 |
|
|
| 28 |
|
|
| 29 |
|
|
| 30 |
|
|
| 31 |
|
|
| 32 |
2+len |
受理机构标识码,前1个字节定义内容长度 |
| 33 |
|
|
| 34 |
|
|
| 35 |
2+len |
2磁道数据,前1个字节定义内容长度 |
| 36 |
4+len |
3磁道数据,前2个字节定义内容长度 |
| 37 |
12 |
检索参考号 |
| 38 |
6 |
授权标识应答码 |
| 39 |
2 |
应答码 |
| 40 |
|
|
| 41 |
8*2 |
受卡机终端标识码 |
| 42 |
15*2 |
受卡方标识码 |
| 43 |
|
|
| 44 |
2+len |
附加响应数据,前1个字节定义内容长度 |
| 45 |
|
|
| 46 |
|
|
| 47 |
|
|
| 48 |
4+len |
附加数据-私有,前2个字节定义内容长度 |
| 49 |
3*2 |
交易货币代码 |
| 50 |
|
|
| 51 |
|
|
| 52 |
8*2 |
个人标识码数据 |
| 53 |
16 |
安全控制信息 |
| 54 |
4+len |
余额,前2个字节定义内容长度 |
| 55 |
4+len |
IC卡数据域,前2个字节定义内容长度 |
| 56 |
|
|
| 57 |
|
|
| 58 |
4+len |
PBOC电子钱包标准的交易信息,前2个字节定义内容长度 |
| 59 |
4+len |
自定义域,前2个字节定义内容长度 |
| 60 |
4+len |
自定义域,前2个字节定义内容长度 |
| 61 |
4+len |
原始信息域,前2个字节定义内容长度 |
| 62 |
4+len |
自定义域,前2个字节定义内容长度 |
| 63 |
4+len |
自定义域,前2个字节定义内容长度 |
| 64 |
16 |
报文鉴别码 |
1.2:规范说明
1.2.1: 报文头
- 目前未找到准确拆解报文头的线管教学,期待后续补充…
1.2.2: 操作类型
| 请求码 |
响应码 |
类型说明 |
| 0200 |
0210 |
余额查询磁条卡消费银联扫码银联posp扫码 |
| 0220 |
0230 |
打印确认通知 |
| 0400 |
0410 |
冲正 |
| 0500 |
0510 |
批结算 |
| 0700 |
0710 |
微信二维码微信扫码支付宝二维码支付宝扫码银联二维码银联二维码状态查询 |
| 0800 |
0810 |
签到参数下载 |
| 0820 |
0830 |
签退pos状态上送 |
| 0840 |
0850 |
主秘钥下载 |
1.2.3: 位图:有效域明细
- 位于报文体1域,固定8字节的16进制字符
- 以案例为例:
7024068420C48A11
- 先把值转换成二进制:
0111000000100100000001101000010000100000110001001000101000010001
- 长度刚好64位,分别对应64个域,
1代表报文中有该域的存在
1.2.4:域规范简表的表达解释
求生本能解释:纯个人理解的定义,有误请及时提出,谢谢。
- 域:报文从报文头往后,每一段有意义的字符串
- 域长度:分为固定长和自定义长
2.1 固定长:以简表中 纯数字 表示
2.2 自定义长:以简表中“数字+len”表示
2.2.1 数字:“长度标识”占据“数字”个字符,“长度标识”代表该域内容长度的数字(不包含标识本身)
2.2.2 len:该域内容长度(不包含标识本身),长度根据不同的压缩方式存在倍数差异,两倍长或三倍长
1.2.5:域长度说明
- 域长度以字节为单位,所以如果长度是5个字符,实为后补0的6个字符长度(简单理解为长度必须偶数)
- 传输的报文可能经过压缩的,但“长度标识”描述的长度是原文的长度,因此长度存在倍数差异
二、代码
- 默认解析规则仅根据李大爷目前项目常见规定而定
- 只做了初步拆解,并不涉及子域解析,请酌情享用(有时间会考虑2.0版本)
2.1:工具类
import com.lidaye.test.porttest.Test8583.enums.Msg8583;
import java.util.*;
public class Test8583 {
private final static Map<Integer, String> DEFAULT_RULE = new HashMap<>(64);
private final static Set<String> TYPE_CHECK_LIST = new HashSet<>();
static {
DEFAULT_RULE.put(-1,"22");
DEFAULT_RULE.put(0,"4");
DEFAULT_RULE.put(1,"16");
DEFAULT_RULE.put(2,"2-1");
DEFAULT_RULE.put(3,"6");
DEFAULT_RULE.put(4,"12");
DEFAULT_RULE.put(11,"6");
DEFAULT_RULE.put(12,"6");
DEFAULT_RULE.put(13,"4");
DEFAULT_RULE.put(14,"4");
DEFAULT_RULE.put(15,"4");
DEFAULT_RULE.put(22,"3");
DEFAULT_RULE.put(23,"3");
DEFAULT_RULE.put(25,"2