J8583: ISO8583 MessageFactory не имеет руководства по синтаксическому анализу для типа сообщения 0800

#java #iso8583 #j8583

#java #iso8583 #j8583

Вопрос:

Я использую синтаксический анализатор j8583 iso для сообщения ISO (0800 2020000000800000 000000 000001 3239313130303031).

Ниже приведен мой Java-код:

 public class ISOUtility {

    private static BufferedReader reader;

    private static String getMessage() throws IOException {
        if (reader == null) {
            reader = new BufferedReader(new InputStreamReader(System.in));
        }
     //   System.out.println("Paste your ISO8583 message here (no ISO headers): ");
        return "0800 2020000000800000 000000 000001 3239313130303031";
    }

    public static void main(String [] args) throws IOException, ParseException {

        final MessageFactory<IsoMessage> mf = new MessageFactory<IsoMessage>();

       if (1 == 0) {


        //  ConfigParser.createFromClasspathConfig("j8583.xml");
            ConfigParser.configureFromDefault(mf);


        }  else {

            String path="C:\Users\DELL\workspace\SolabParser\j8583.xml";
            if (System.console() != null) {
                System.console().printf("Attempting to configure MessageFactory from %s...%n", path);

            }
            System.out.println("Messagefactory is done");
            String url = "j8583.xml";
            if (path.contains("://")) {
                System.out.println("else ");

                ConfigParser.configureFromUrl(mf, new URL(path));
            } else {
                System.out.println("else ");
                ConfigParser.configureFromUrl(mf, new File(path).toURI().toURL());
            }
        }
        //Now read messages in a loop
        String line = getMessage();
        while (line != null amp;amp; line.length() > 0) {
            IsoMessage m = mf.parseMessage(line.getBytes(), 14);
            if (m != null) {
                System.out.printf("Message type: x%n", m.getType());
                System.out.println("FIELD TYPE    VALUE");
                for (int i = 2; i <= 128; i  ) {
                    IsoValue<?> f = m.getField(i);
                    if (f != null) {
                        System.out.printf("] %-6s [", i, f.getType());
                        System.out.print(f.toString());
                        System.out.println(']');
                    }
                }
            }
            line = getMessage();
        }
    }
}
  

Ниже приведен файл конфигурации.

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE j8583-config PUBLIC "-//J8583//DTD CONFIG 1.0//EN"
    "http://j8583.sourceforge.net/j8583.dtd">
<j8583-config>
<!-- This is a test config file -->

<!-- These are the ISO headers to be prepended to the message types specified -->
<header type="0800"></header>

<template type="0280">
    <field num="3" type="NUMERIC" length="2">99</field>
</template>

<!-- The server example uses this to read the requests -->
<parse type="0200">
    <field num="3" type="NUMERIC" length="6" />
    <field num="4" type="AMOUNT" />
    <field num="7" type="DATE10" />
    <field num="11" type="NUMERIC" length="6" />
    <field num="12" type="TIME" />
    <field num="13" type="DATE4" />
    <field num="15" type="DATE4" />
    <field num="17" type="DATE_EXP" />
    <field num="32" type="LLVAR" />
    <field num="35" type="LLVAR" />
    <field num="37" type="NUMERIC" length="12" />
    <field num="41" type="ALPHA" length="16" />
    <field num="43" type="ALPHA" length="40" />
    <field num="48" type="LLLVAR" />
    <field num="49" type="ALPHA" length="3" />
    <field num="60" type="LLLVAR" />
    <field num="61" type="LLLVAR" />
    <field num="100" type="LLVAR" />
    <field num="102" type="LLVAR" />
</parse>

<!-- The client example uses this to read the responses -->
<parse type="0210">
    <field num="3" type="NUMERIC" length="6" />
    <field num="4" type="AMOUNT" />
    <field num="7" type="DATE10" />
    <field num="11" type="NUMERIC" length="6" />
    <field num="12" type="TIME" />
    <field num="13" type="DATE4" />
    <field num="15" type="DATE4" />
    <field num="17" type="DATE_EXP" />
    <field num="32" type="LLVAR" />
    <field num="35" type="LLVAR" />
    <field num="37" type="NUMERIC" length="12" />
    <field num="38" type="NUMERIC" length="6" />
    <field num="39" type="NUMERIC" length="2" />
    <field num="41" type="ALPHA" length="16" />
    <field num="43" type="ALPHA" length="40" />
    <field num="48" type="LLLVAR" />
    <field num="49" type="ALPHA" length="3" />
    <field num="60" type="LLLVAR" />
    <field num="61" type="LLLVAR" />
    <field num="70" type="ALPHA" length="3" />
    <field num="90" type="ALPHA" length="42" />
    <field num="100" type="LLVAR" />
    <field num="102" type="LLVAR" />
    <field num="126" type="LLLVAR" />
</parse>

<!-- this is for binary tests (message encoding AND fields) -->
<parse type="0600">
    <field num="4" type="AMOUNT" />
    <field num="7" type="DATE10" />
    <field num="11" type="NUMERIC" length="6" />
    <field num="41" type="BINARY" length="8" />
    <field num="42" type="BINARY" length="4" />
    <field num="43" type="ALPHA" length="40" />
    <field num="62" type="LLBIN" />
    <field num="63" type="LLBIN" />
    <field num="64" type="LLLBIN" />
    <field num="65" type="LLLBIN" />
    <field num="102" type="LLLVAR" />
</parse>

<parse type="0800">
    <field num="3" type="ALPHA" length="6"/>
    <field num="12" type="DATE4" legth="14">
    <field num="17" type="DATE4" length="8"/>
    <field num="11" type="NUMERIC" length="6"/>
    <field num="41" type="LLVAR" length="16"/>
</parse>

<parse type="0810" extends="0800">
    <field num="17" type="exclude"/>
    <field num="39" type="ALPHA" length="2"/>
</parse>

<parse type="0201">
    <field num="3" type="NUMERIC" length="19" />
</parse>
<parse type="0202">
    <field num="3" type="NUMERIC" length="22" />
</parse>
<parse type="0280">
    <field num="3" type="NUMERIC" length="2" />
</parse>

</j8583-config>
  

Я использую сообщение типа «0800», для которого я не использую какой-либо заголовок.

Я получаю сообщение об ошибке при компиляции программы: в ISO8583 MessageFactory нет руководства по синтаксическому анализу для типа сообщения 0800

Любая помощь будет оценена.

Комментарии:

1. если вы не используете заголовки для 0800, вы можете опустить эту header запись. Очевидно, у вас есть руководство по синтаксическому анализу для 0800, так что, возможно, вы не читаете этот конфигурационный файл?

Ответ №1:

в поле номер 12 измените написание длины слова и закройте этот тег косой чертой, в нем отсутствует закрывающая косая черта.

 <field num="12" type="DATE4" length="14" />  

Ответ №2:

Я думаю, вы ошиблись с форматом поля 41. В вашем профиле для разных типов сообщений оно отличается.

Вот возможная интерпретация вашего примера сообщения, где БИТ 41 равен 16 ШЕСТНАДЦАТЕРИЧНЫМ символам, преобразованным в 8 букв ASCII (цифр).

https://iso8583.info/cmd/CB/AUTO/msg?080020200000008000000000000000013239313130303031

 ---
# Cheef's parser.
# Copyright (C) 2008-2016 Alexander Shevelev. https://iso8583.info/
# lib   : "/lib/CB/AUTO/" - CB2A Autorisation
# tool  : "msg"
# stat  : 10 nodes, 4 lookup tables, 100.00% passed (4/4)

msg:#"080020200000008000000000000000013239313130303031" # CB2A Autorisation message
- MTI: "0800" # Message Type ID. // Network management request
- DE000: "2020000000800000" # Primary bitmap // 3.11.41.
- BM0:#"0000000000013239313130303031" # Fields at Primary Bitmap
  - DE003:#"000000" # PC
    - S01: "00" # Transaction Code. // Purchase of goods or services
    - S02: "00" # Account, from. // Standard purchase
    - S03: "00" # Account, to. // Standard purchase
  - DE011: "000001" # STAN. // 1
  - DE041: "29110001" # CATI.

# run:0.030