Chinaunix首页 | 论坛 | 博客
  • 博客访问: 309075
  • 博文数量: 40
  • 博客积分: 1
  • 博客等级: 民兵
  • 技术积分: 670
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-31 11:19
个人简介

从事银行核心系统设计开发的程序猿

文章存档

2019年(1)

2018年(4)

2017年(11)

2016年(6)

2015年(18)

分类: 信息化

2015-08-24 02:37:49

*报文格式


AS400核心系统的联机交易报文,是体现系统设计优劣的一个重要部分,并且,也决定了联机交易主控的处理方式。


系统的报文规范遵循简单灵活安全高效的原则,应做到以下几点。首先,交易通过短连接单次通讯完成,不需要先分配端口,多次交互,也没有任何前后交易的状态耦合。其次,交易报文一次一密全文加密,并且不需要每次交易做多次密钥交换动作。即使将成功报文原样重新发送,系统也会识别为重复提交而不会重复执行。最后,报文组织应充分考虑AS400应用程序的写法,既要满足交易程序参数传递的性能,又要尽量保持报文灵活,并减少无意义的内容传送。在交易RPG程序中,输入输出接口,基本上都是以DS或DS数组的形式PARM传递进来处理。因此,体现单个字段key-value的XML,JSON之类格式,就不太适合作为AS400报文使用。因此,Firebird设计了一种特定的报文格式。


整体报文结构规则是,不论输入报文或者输出报文,除了少数报文头字段,其余均以接口结构方式组织。接口结构由接口名称,记录条数,单条长度,接口内容四个部分组成。一个交易的接口结构顺序,是否出现均不固定,不影响交易的执行。特别的,当接口为数组时,报文只需出现实际条数的接口内容,如果数组为空,则整个数组接口都不会出现。这样就减少了报文的大小,提升了通讯效率。在交易输出报文中,除了预先定义的交易输出接口外,还可以附加的方式返回其他特殊用途接口。例如提示信息,常用于交易成功但需要传递的提醒或警告,需要下传的凭证打印等。这在之前用户空间USER SPACE时介绍过。每个交易除了公共定义的接口外,最多有9个自定义输入接口,9个自定义输出接口,这些接口都可以是单一结构或数组,单条接口结构最大64KB。接口内部是定长的,但接口数量和出现顺序可任意组合。


目前系统设定的输入输出报文大小上限是1MB,通过修改主控的常量定义,可最大扩充到16MB。报文在通讯中作为整体一次TCP传递,一笔交易一次通讯交互即可,无需应用系统分片。


具体的输入报文格式如下:
总长度 INT 4
交易序号 INT 8
校验码 INT 4
公共接口名称 STR 10
公共接口记录条数 INT 2
公共接口单条长度 INT 2
公共接口内容 BUF
接口一名称 STR 10
接口一记录条数 INT 2
接口一单条长度 INT 2
接口一内容 BUF
……
接口N名称 STR 10
接口N记录条数 INT 2
接口N单条长度 INT 2
接口N内容 BUF



输出报文格式分两种情况。


当返回的是交易成功报文时:
总长度 INT 4
交易序号 INT 8
校验码 INT 4
返回码 STR 10
公共接口名称 STR 10
公共接口记录条数 INT 2
公共接口单条长度 INT 2
公共接口内容 BUF
接口一名称 STR 10
接口一记录条数 INT 2
接口一单条长度 INT 2
接口一内容 BUF
……
接口N名称 STR 10
接口N记录条数 INT 2
接口N单条长度 INT 2
接口N内容 BUF


当返回的是出错报文时:
总长度 INT 4
交易序号 INT 8
校验码 INT 4
返回码 STR 10
出错文件名 STR 10
错误信息内容 STR 80
接口一名称 STR 10
接口一记录条数 INT 2
接口一单条长度 INT 2
接口一内容 BUF
……
接口N名称 STR 10
接口N记录条数 INT 2
接口N单条长度 INT 2
接口N内容 BUF



下面详细解释一下报文头各字段含义。
总长度:输入输出报文的开头4个字节为报文总长度,即从交易序号开始,后续报文的字节数。总长度如果是负数,有特殊用途,表示这笔交易会运行于调试模式,而不影响其他交易的正常模式,适合用于生产环境的疑难问题跟踪重现。
交易序号:用于标识每一笔交易的唯一增长值。无符号长整形数值,Firebird使用的是全局时间戳(毫秒级)加2位组合步骤序号。举例来说,如果是柜面渠道直连核心交易,那么就是时间戳加00,如2015082401315512300,表示2015-08-24 01:31:55.123发送的交易。如果是通过综合前置或ESB调度的组合交易,如2015082401315512302,表示2015-08-24 01:31:55.123发送的交易,在组合流程中的第2步调用。交易序号应保证按柜员号每笔增长,系统拒绝不正常的交易序号,以防止伪造或重复报文攻击。
校验码:对后续报文全文加密并计算出的校验码,用于防止报文被篡改。
返回码:输出报文时存在,如果交易正常,返回码为'OK',如果出错,则为错误代码。如果为AS400系统级错误,则为F+系统错误代码,如FCPF3282。如果是应用错误,则为E+应用错误代码,如ECNBRNORL。
出错文件名:交易出错时存在此字段,表示产生错误的源程序名。在后台主控日志中,还可以查到产生系统错误的源程序行号。
错误信息内容:错误的说明信息,通常为代入数据后的错误中文描述。例如:机构表中机构号064001不存在。


接下来就是接口部分。
输入的公共接口有3个,INHD是输入公共结构,INFE是交易收费数组,INCS是券面数组。注意,后2者只有存在数据时才会出现。
输出的公共接口有2个,OTHD是输出公共结构,OTVC是交易产生的传票数组。同样,OTVC只有产生传票的交易才会出现。
输出特有的接口有1个,OTFE是输出收费数组,用于收费输入不正确或没输时,交易报错并回显正确的收费项。因此这个接口只有在特定出错场景才会出现。
输出额外附加的接口,包括OTWN,交易警告和提示信息数组,以及下传的其他凭证打印接口结构。


那么,在交易程序中,报文接口是怎么体现的呢?可以看一下具体的程序代码片段。


  1. **定义常量
  2. DC_NBO1 C CONST(50)
  3. DC_NBO2 C CONST(50)
  4. DC_NBO3 C CONST(50)
  5. *************************
  6. **定义参照外部结构的结构、数组 
  7. DT_INHD E DS EXTNAME(INHD) QUALIFIED TEMPLATE
  8. DT_INFE E DS EXTNAME(INFE) QUALIFIED TEMPLATE
  9. DT_INCS E DS EXTNAME(INCS) QUALIFIED TEMPLATE
  10. DT_OTHD E DS EXTNAME(OTHD) QUALIFIED TEMPLATE
  11. DT_OTVC E DS EXTNAME(OTVC) QUALIFIED TEMPLATE
  12. DT_I1 E DS EXTNAME(T020002I1) QUALIFIED TEMPLATE
  13. DT_O1 E DS EXTNAME(T020002O1) QUALIFIED TEMPLATE
  14. DT_O2 E DS EXTNAME(T020002O2) QUALIFIED TEMPLATE
  15. DT_O3 E DS EXTNAME(T020002O3) QUALIFIED TEMPLATE
  16. *************************
  17. **定义参照内部结构、变量(LIKE)的结构、数组
  18. DPIN DS QUALIFIED
  19. D INHD LIKEDS(T_INHD)
  20. D INFE DIM(C_NBINFE) LIKEDS(T_INFE)
  21. D INCS DIM(C_NBINCS) LIKEDS(T_INCS)
  22. D I1 LIKEDS(T_I1)
  23. **
  24. DPOT DS QUALIFIED
  25. D OTHD LIKEDS(T_OTHD)
  26. D OTVC DIM(C_NBOTVC) LIKEDS(T_OTVC)
  27. D O1 DIM(C_NBO1) LIKEDS(T_O1)
  28. D O2 DIM(C_NBO2) LIKEDS(T_O2)
  29. D O3 DIM(C_NBO3) LIKEDS(T_O3)
  30. ***********************************************************
  31. **定义程序入口
  32. C *ENTRY PLIST
  33. C PARM PMG
  34. C PARM PIN
  35. C PARM POT


这段是020002交易的主程序。联机交易的PARM都是3个,PMG是错误信息结构,PIN是输入接口结构,POT是输出接口结构。020002交易有1个自定义输入I1,3个自定义输出O1,O2,O3均为最大50条记录的数组。因此加上公共接口,就体现为PIN,POT的完整内容。因为报文只会出现有数据的接口内容,所以将内容填入正确的位置,就是主控程序的工作职责了,对交易程序来说,无需关心。


阅读(4330) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~