SwiftPWFilter
SwiftPWFilter是利用prowide的开源项目WIFE框架去实现的对Swift报文的解析于组装,目前使用的是该项目的开源版本,开项目还提供企业级版本。
1.配置规则
目前filter提供SWIFT解析(in),SWIFT组装(out)两种功能;
解析的时候利用etag去解析,值形式为:SEQUENCE:TAG或TAG ,如A:20,就是获取的序列A下的20域,需要特殊说明的是,如果是TAG的形式,如果本身TAG是循环的,返回的即是字符串数组,否则是字符串;如果是SEQUENCE:TAG的形式,SEQUENCE是循环的,返回的即是二维数组,否则是一维数组,以上说明后期使用的时候需要特别注意;
解析的时候会把部分报文公共参数放入到上下文object对象中以Map的形势,包括application id、logical terminal、sequence number、service id、session number、message priority、message type、receiver、sender、message direction;
组装的时候利用etag标记TAG,value作为TAG对应的值处理,需要说明这时候的TAG不同于解析时候的etag,他不包括SEQUENCE。同时需要说明的是目前组装之后的报文缺少校验,不能保证报文的正确性;
组装报文的时候还需要利用etag放入部分报文的功能参数,参数名为:application_id、logical_terminal、sequence_number、service_id、session_number、message_priority、message_type、receiver、sender; 组装报文目前只能默认组装“I”类型的incoming报文;
2.示例
<transaction id="t">
<step id="1">
<filter type="out" ref="SwiftPWFilter">
<!--BLOCK1 -->
<field etag="application_id" value="F" description="F/A/L应用程序表示" />
<field etag="service_id" value="01" description="01/02/03/04/...应用程序协议单元标示" />
<field etag="sender" value="PSBCCNBJAXXX" description="发报行" />
<field etag="session_number" value="0001" description="序号1" />
<field etag="sequence_number" value="000001" description="序号2" />
<!--BLOCK2 -->
<field etag="message_type" value="103" description="序号2" />
<!-- SWIFT后面O为发报行 I为收报行 -->
<field etag="receiver" value="RCBCCNBJAXXX" description="收报行" />
<field etag="message_priority" value="U2020" description="电报紧急状态1位/" />
<field etag="message_priority" value="U2020" description="电报紧急状态1位/" />
<!--BLOCK4 -->
<field etag="20" value="FX197038-144539" description="20栏位" />
<field etag="22A" value="NEWT" description="22A栏位" />
</filter>
<log value="${this}"/>
</step>
</transaction>
在cfg/etc/commons.xml中注册filter
<filters>
<filter class="SwiftPWFilter" id="SwiftPWFilter" />
</filters>
控制台打印结果如下
组报结果
[${this}]={1:F01PSBCCNBJAXXX0001000001}{2:I103RCBCCNBJXXXXU2020}{4: :20:FX197038-144539 :22A:NEWT -}
3.SWIFT报文类型及格式
3.1SWIFT电文类型
用户报文,用于SWIFT会员用户之间相互发送和接收的报文,也是SWIFT报文最核心和最复杂的内容,MT1XX——MT9XX类报文都属于用户报文。
系统报文(System Message),用户SWIFT系统反馈信息给SWIFT用户的报文,如MT008 系统请求取消、MT009系统请求退出、MT081用户当日浏览记录、MT094广播信息等,涉及报文编号为MT0XX。
系统报文(Service Message),用于反馈特定系统信息的电文,包括2!n格式电文,如02 登录请求电文,03 选择命令,05 取消命令,06 退出命令等,涉及报文编号有02、03、05、06、21、22、23、24、25、26、42、43。
错误码(Error Code),用于反馈特定的错误类型,格式为2!n或者3!C,例如000表示电文没有正文,01表示因电文过期导致的退出/取消确认错误,A01表示因应用程序接口阻塞导致的中止应用程序接口错误。
3.2SWIFT电文结构
报头Header Block
报头为发报行(Sender)、收报行(Receiver)和报文输入编号(Message Input Number)信息。
正文Text Block
正文为电文主体部分,包括域标签和内容,域标签由分界符(:)、域编号(nn)、格式选项([a])、分界符(:)构成,内容为发送给收报行的信息。
报尾Tail Block
报尾为报文密押信息(MAC)和校验信息(CHK)。
3.3SWIFT CODE格式
SWIFT CODE实际上在SWIFT里称为BIC(Bank Identifier Code),银行识别码。其格式如下:
Bank Code+Country Code+Location Code+Branch Code
4!a + 2!a + 2!c +[3!c]
如中国农业银行总行ABOCCNBJXXX
中国农业银行纽约分行ABOCUS33
中国农业银行广东省分行ABOCCNBJ190
注:[3!C]为XXX表示该金融机构总部
3.4SWIFT字符表示方式
前文中经常会提到4!a、[3!C]等表示方式,SWIFT中对于字符表示的规定如下:
n----------------表示一位数字
a----------------表示一位字母
c----------------表示一位数字或者字母
x----------------表示一个字符 (SWIFT允许的任意字符,数字、字母大小写、换行、回车、空格等)
d----------------表示数字或者“,”(SWIFT里数字的表示中“,”代表小数点)
2n----------------表示最多两位数字
2!n----------------表示必须两位数字
4*35X----------------表示填入内容最多四行,每行最多35个字符
[/34X]----------------表示“/”后最多跟34个字符,“[]”表示可选项
3.5SWIFT BIC是否启用
金融机构无论是否接入SWIFT网络都可以申请登记BIC。如果该金融机构的电子 系统已经接入SWIFT网络,则已经启用了SWIFT BIC,没有启用的BIC第八位为数字1,如CHBAHKH1。未启用的BIC Code不能用于收报行和发报行,但是可用于正文标识金融机构。
3.6SWIFT Message Type是否为密押电文
SWIFT电文的安全性来源之一就是银行之间会互相建立密押关系,而涉及加押的电文为MT1XX、MT2XX、MT(4-8)XX类电文,MT3XX、MT9XX类电文不加押。