Как добавить в сообщение 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");