我正在通过基于java的应用程序生成SWIFT消息MT 110和MT 103。为了与终端客户进行协调和共享,我们需要将从SWIFT终端接收的Ack Nak消息映射回MT 110和MT 103事务。要做到这一点,我需要解析每个ACK文件并找出
20:发件人参考ABC1380Q02418
451:0 (ACK)
451:1 (NAK)然后405字段。
我尝试过使用Prowide (妻子)开源SWIFT Java库来实现这一点,但是我无法解析ACK。通过库,我能够解析MT 110和MT 103消息,但不能解析ACK或NAK消息。需要帮助您了解如何通过Prowide (WIFE)开源SWIFT Java库解析SWIFT文件。
下面粘贴了示例ACK消息:
23/12/15-11:50:14 BulBoardCTFACK 0192-000001 1
-例如类型和传输
向SWIFT (ACK)发送原件的通知(传输)
网络交付状态: Network
优先/交付:正常
消息输入参考: 1150 151223 ABCINBADEL2567311531
快速输入: FIN 103单客户Credt传输
发件人: ABCDINBBDEL TTTT银行有限公司(XXXXX分行) YYYYYYYYY
接收人: ANZBAU3MXXX澳大利亚和新西兰银行集团有限公司墨尔本AU
20:发件人参考ABC1380Q02418
23B:银行营运守则
32A: Val /Curr/Interbnk Settld日期:2015年12月23日货币:澳元(澳元)金额:#8000,0#
33B:货币/指示金额货币:澳元(澳元)金额:#8000,0#
50K:订购客户名称和地址/M4132378 ABC DEF 76 AX,模特镇分机,XXXXXXXX
53A:发件人通讯员- FI BIC /1111111 00001 ABCDEFBBDEL ABC
57D:在Inst -Name & Addr //Addr 063144共同财富银行澳大利亚SWIFT代码CTBAAU2S帐户
59:受益客户名称& Addr /555555 ABCDEF YYYYYYYYY
70:汇款信息维护
71A:控罪详情
71 F:寄件人收费货币:澳元(澳元)金额:#0,0#
{CHK:41B1AA23FEDF}
PKI签名:MAC-等效
类别:网络报告
创建时间: 23/12/15 11:50:03
应用: SWIFT接口
操作员:系统
文本
{1:F21ABCDEFBBADEL2567311531}{4:{177:1512231150}{451:0}}
发布于 2016-12-27 16:25:29
发布的示例是扩展打印输出,而不是SWIFT FIN格式的消息。但是,在最后一行中,称为"Text“,您有FIN系统消息,这是Prowide岩心可解析的。
{1:F21ABCDEFBBADEL2567311531}{4:{177:1512231150}{451:0}}
系统消息中的字段451指示消息是加到(0)还是nacked (1)。在nacked时,字段405将包含错误代码。例如:{405:T 33002}
最常见的结构是带有ACK/NAK的系统消息,后面是原始消息的完整副本:
{1:F21LITEBEBBAXXX0066000079}{4:{177:1104180901}{451:0}}{1:F01LITEBEBBAXXX0066000079}{2:I999LITEBEBBXXXXN}{4:
:20:TESTREF1
:79:This is text line 1
-}{5:{CHK:7602B010CF31}{TNG:}}
第一步是确定接收到的消息是否是和ACK/NAK。一旦消息被解析为SwiftMessage,就可以使用此方法来验证它是普通的FIN用户对用户消息,还是带有ACK/NAK的系统消息。
SwiftMessage.isSystemMessage()
SwiftMessage.isAck()
SwiftMessage.isNack()
第二步是将ACK/NAK信息与原始消息的标识分开。此示例使用最常见的格式,即ACK/NAK消息,后面是原始消息的完整副本(例如,SAA AFT或SA使用的格式)。要同时解析ACK/NAK和原始副本:
Swiftparser parser = new SwiftParser();
SwiftMessage ack = parser.parse(msg);
SwiftMessage original = parser.parse(ack.getUnparsedTexts().getAsFINString());
最后,要将已加/nacked消息与其原始消息匹配,必须对候选消息进行查询(通常搜索同一天的消息和相同的消息类型)。库中不包含查找候选信息,因为它涉及搜索应用程序数据库或从文件系统目录读取发送的消息。尽管在候选人内部可以这样完成匹配:
AckMessageComparator comparator = new AckMessageComparator();
for (SwiftMessage candidate : candidates) {
if (comparator.compare(original, candidate) == 0) {
//candidate is the message acked/nacked
}
}
根据确认通知源的不同,消息的结构可能有所不同。例如,原始消息的完整副本可能会丢失。但是,必须有其他类型的对原始acked/nacked消息的引用,例如MUR (消息用户引用),如下所示:
{1:F21LITEBEBBAXXX0066000079}{4:{177:1104180901}{451:0}{108:FOO16101900001}}
因此,要匹配原始消息,而不是使用完整的消息副本和AckMessageComparator,必须找到具有相同MUR的消息:
for (SwiftMessage candidate : candidates) {
if (StringUtils.equals(ack.getMUR(), candidate.getMUR())) {
candidate is the message acked/nacked
}
}
如果ACK/NAK中没有原始消息副本或MUR,则可能存在UUID (唯一标识符),并且可以匹配从UUID字段(如接收地址、消息类型和引用)中剥离候选人。
ACK/NAK必须以某种方式提供信息,以正确匹配被确认的原始消息。
发布于 2019-05-29 17:40:42
ACK/NAK通知被标识为服务id 21。
您可以使用Prowide中的ServiceMessage21类来解析Acks和Nacks
https://www.javadoc.io/doc/com.prowidesoftware/pw-swift-core/SRU2018-7.10.4
https://stackoverflow.com/questions/34810441
复制相似问题