Как добавить в сообщение ISO 8583 заголовок, используемый jpos. - ISO 8583 - JPOS

Я новичок в разработке с использованием ISO 8583, мне нужно добавить заголовок перед сообщением ISO. но я реализую их таким образом и в заголовок сообщения то же самое не добавляется. Что я делаю не так? Я надеюсь, что вы можете мне помочь.

          GenericPackager packager = new GenericPackager("tes1.xml");


            // Create a new ISOMsg object using the custom packager
            ISOMsg isoMsg = new ISOMsg();
            isoMsg.setPackager(packager);
                isoMsg.setHeader("ISO008000099".getBytes());
            isoMsg.setMTI("0800");
            isoMsg.set(7, "1011110140");
            isoMsg.set(11, "047478");
            isoMsg.set(70, "401");
            
            
            ASCIIChannel c = new ASCIIChannel("localhost", 6000, packager);
            c.connect();
            c.send(isoMsg);
            System.out.println("ISO message : " + new String(isoMsg.pack()));
            //System.out.println(new String(isoMsg.pack()));

при показе отправляемого iso-сообщения заголовок не наблюдается

      0000  30 38 30 30 38 32 32 30  30 30 30 30 30 30 30 30  0800822000000000
0010  30 30 30 30 30 34 30 30  30 30 30 30 30 30 30 30  0000040000000000
0020  30 30 30 30 31 30 31 31  31 31 30 31 34 30 30 34  0000101111014004
0030  37 34 37 38 34 30 31                              7478401

Сообщение отправлено: 0800822000000000000004000000000000001011110140047478401

сообщение должно быть отправлено следующим образом: ISO0080000990800822000000000000004000000000000001011110140047478401

Я использую следующую конфигурацию:

      <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE isopackager SYSTEM "genericpackager3.dtd">

<!-- ISO 8583:1987 (ASCII) field descriptions for GenericPackager -->

<isopackager>

  <header length="12" value =""></header>
<isofield
      id="0"
      length="4"
      name="MESSAGE TYPE INDICATOR"
      class="org.jpos.iso.IFA_NUMERIC"/>
  <isofield
      id="1"
      length="16"
      name="BIT MAP"
      class="org.jpos.iso.IFA_BITMAP"/>
  <isofield
      id="2"
      length="21"
      name="PAN - PRIMARY ACCOUNT NUMBER"
      class="org.jpos.iso.IFA_LLNUM"/>
  <isofield
      id="3"
      length="6"
      name="PROCESSING CODE"
      class="org.jpos.iso.IFA_NUMERIC"/>
  <isofield
      id="4"
      length="12"
      name="AMOUNT, TRANSACTION"
      class="org.jpos.iso.IFA_NUMERIC"/>

поля, которые отправляются в сообщении:

      <isomsg direction="outgoing">
  <!-- org.jpos.iso.packager.GenericPackager[tes1.xml] -->
  <header>49534F303038303030303939</header>
  <field id="0" value="0800"/>
  <field id="7" value="1011110140"/>
  <field id="11" value="047478"/>
  <field id="70" value="401"/>
</isomsg>

2 ответа

Хотя вы можете переопределить заголовок, используемый каналом, вызвавISOMsg.setHeaderканалу по-прежнему нужен заголовок-заполнитель, чтобы знать, сколько байтов ему нужно прочитать во время приема.

В вашем случае проблема в том, что ASCIIChannel не является подходящим каналом для вашего обмена. ASCIIChannel не поддерживает заголовок. Судя по содержимому, которое я вижу, возможно, вам нужно использовать BASE24TCPChannel и установить для него заголовок.

При использовании jPOS все намного проще, если вы используете Q2 (который вы можете запускать автономно или из предпочитаемого вами приложения (SpringBoot, Quarkus, JBoss/Wildfly и т. д.).

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

Чтобы увидеть, что передается на другую сторону, вам понадобится инструмент анализа, например tcpdump или Wireshark. Или, поскольку это тест, вам лучше использовать netcat, чтобы увидеть, что получит другая сторона, примерно так:

      nc -l 6000 | xxd

я добавилxxdчтобы показать шестнадцатеричный дамп, но вы также можете перенаправить вывод в файл, а затем открыть его с помощью шестнадцатеричного средства просмотра/редактора. Там вы увидите, что помимо заголовка вы увидите 4 байта длины в виде цифр ASCII. Как сказал апрель,ASCIIChannelвозможно, это не тот канал, который вам нужен.

Для установки заголовка на уровне канала, а вам нужно будет сделать это для правильного получения ответа, эта строка должна помочь:

      channel.setHeader("ISO008000099");
Другие вопросы по тегам