如何在 jpos 中为 ascii 通道和 iso93ascii 打包程序构造 ISO8583 消息 header?

how to construct ISO8583 message header for ascii channel and iso93ascii packager in jpos?

我正在尝试使用 java 中的 JPOS 创建 ISO8583 消息,使用 ASCII 通道发送消息并使用 iso93ascii 打包程序打包 ISO 消息。

但是在发送消息后,我收到来自服务器的无效 header 错误。

所以我的问题是 header 究竟是由什么组成的,以及如何为 MTI 值 1200 构建 header。

ISOMsg.setHeader("HEADER".getBytes());

我的HEADER应该怎么装?

新发展:

查看服务器配置后,我需要发送 header 前缀为 ISO8583 消息的长度(十六进制的 2 字节长度转换为字节)。我怎样才能使用 JPOS 做到这一点?我也无法使用 channel.setHeader("xxx").getBytes()).

设置任何内容

如何查看从我的终端发送到服务器的原始消息。

以下是部分代码摘录

部署文件

filename : 10_clientsimualtor_channel.xml

<?xml version="1.0" ?>
<channel-adaptor name='jpos-client-adaptor'
    class="org.jpos.q2.iso.ChannelAdaptor" logger="Q2">
<channel class="org.jpos.iso.channel.ASCIIChannel" logger="Q2"
          packager="org.jpos.iso.packager.ISO93APackager" header= "ISO026000075">

  <property name="host" value="xxx.xx.xx.xx" />
  <property name="port" value="xxxxx" />
</channel>
<in>jpos-client-send</in>
<out>jpos-client-receive</out>
<reconnect-delay>10000</reconnect-delay>
</channel-adaptor>

代码:

packager = new ISO93APackager();

            ISOMsg m = new ISOMsg();
            m.setPackager(packager);
            System.out.println(packager);

            m.setHeader("ISO026000075".getBytes());
             System.out.println("Head err..........."+newString(m.getHeader()));

            Date now = new Date();

            m.setMTI("1200");
            m.set(2,"xx");
            m.set(3,"xxxxx");
            m.set(4,"000000010000");
            m.set(11,"214491");
            m.set(12,"160203");

            m.set(123, "xxxxxx");
            m.set(125, "xxxx");

           byte b[] = m.pack();
           System.out.println("\n\n\n\nPACKAGER =====------"+m.getPackager());
           System.out.printf("\n\n\n\nMessage ===== %s",new String(b));

            System.out.println("\n\n\n"+ISOUtil.hexdump(b));return m;

您可以将 header 设置在频道级别(即 channel.setHeader("xxx").getBytes()) 或 per-message 级别(即 m.setHeader("xxx".getBytes()))。

通道在接收时知道 header 长度很重要,因此即使您使用每条消息 header,您也应该在通道级别设置一个虚拟 header还有。

使用 Q2 和 ChannelAdaptor 或 QServer 组件会让您的生活变得更加轻松。看看 http://jpos.org/doc/proguide-draft.pdf

How do I see what raw message is being sent from my terminal to the server?

最简单的方法是扩展您的频道并从其发送和接收方法中执行 hexdump。

这是一个简单的测试代码,它将创建客户端和服务器,发送和接收带有 header 的消息。 您将看到输出包含已发送的 header 定义。 一旦你得到它,通过部署将它移动到 Q2 做事的方式应该工作。

将包装器替换为您在代码中使用的包装器。 确保您的打包程序 xml 中没有 header 属性。 将 header 添加到您的客户端通道适配器部署中。

import java.io.IOException;

import org.jpos.iso.ISOChannel;
import org.jpos.iso.ISOException;
import org.jpos.iso.ISOMsg;
import org.jpos.iso.ISORequestListener;
import org.jpos.iso.ISOServer;
import org.jpos.iso.ISOSource;
import org.jpos.iso.ServerChannel;
import org.jpos.iso.channel.ASCIIChannel;
import org.jpos.iso.packager.GenericPackager;
import org.jpos.util.Logger;
import org.jpos.util.SimpleLogListener;
import org.jpos.util.ThreadPool;

public class Test {

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

        Logger l = new Logger();
        l.addListener(new SimpleLogListener());
        GenericPackager serverPkg = new GenericPackager(
                "C:\temp\iso93asciiB-custom.xml");
        serverPkg.setLogger(l, "Server"); // So that the output can be differentiated based on realm

        GenericPackager clientPkg = new GenericPackager(
                "C:\temp\iso93asciiB-custom.xml");
        clientPkg.setLogger(l, "Client");// So that the output can be differentiated based on realm
        // Simulate a server and listen on a port
        ISOChannel serverChannel = new ASCIIChannel(serverPkg);
        ((ASCIIChannel) serverChannel).setHeader("ISO70100000");
        // AN equivalent in your channel adaptor deploy file would be
        // <channel class="org.jpos.iso.channel.ASCIIChannel"
        // packager="org.jpos.iso.packager.GenericPackager"
        // header="ISO70100000"> .....
        // This is evident from the ChanelAdaptor code
        // QFactory.invoke (channel, "setHeader", e.getAttributeValue ("header"));
        ((ASCIIChannel) serverChannel).setLogger(l, "server");
        ISOServer server = new ISOServer(7654, (ServerChannel) serverChannel,
                new ThreadPool(10, 100, "serverListeningThread"));

        server.addISORequestListener(new ISORequestListener() {
            // If the client sends a message, the server will respond with and approval if its a request message
            @Override
            public boolean process(ISOSource source, ISOMsg msg) {
                try {
                    if (!msg.isRequest()) {
                        msg.setResponseMTI();
                        msg.set(39, "000");
                        source.send(msg);
                    }
                }
                catch (ISOException | IOException ex) {

                }

                return true;
            }
        });
        Thread serverThread = new Thread(server);
        serverThread.start(); // beyond this point the server is listening for a client connection

        ASCIIChannel clientChannel = new ASCIIChannel("127.0.0.1", 7654, clientPkg);
        clientChannel.setHeader("ISO70100000");​ //Similar to server, you can configure the constant in your deploy file​
        clientChannel.setLogger(l, "client");
        clientChannel.connect(); // connect to server, it will be seen in the output console
        ISOChannel connectChannel = server.getLastConnectedISOChannel();// Since server can have multiple connections,
                                                                        // we get the last one that connected to it.
        ISOMsg serverInitiatedRequest = new ISOMsg();

        serverInitiatedRequest.set(0, "1804");
        serverInitiatedRequest.set(7, "1607161705");
        serverInitiatedRequest.set(11, "888402");
        serverInitiatedRequest.set(12, "160716170549");
        serverInitiatedRequest.set(24, "803");
        serverInitiatedRequest.set(25, "0000");
        serverInitiatedRequest.set(33, "101010");
        serverInitiatedRequest.set(37, "619817888402");

        connectChannel.send(serverInitiatedRequest); // use the last one connected to send a request message to the client.
        ISOMsg receivedRequest = clientChannel.receive();// receive the serers request message at the client

        ISOMsg clientResponse = (ISOMsg) receivedRequest.clone();
        clientResponse.setResponseMTI();
        clientResponse.set(39, "000");
        clientChannel.send(clientResponse); // send the response to server

    }

}

您的输出应该类似于

<log realm="client/127.0.0.1:7654" at="Sun Jul 17 12:31:55 IST 2016.764" lifespan="33ms">
  <connect>
    127.0.0.1:7654
  </connect>
</log>
<log realm="Server" at="Sun Jul 17 12:31:55 IST 2016.784" lifespan="4ms">
  <pack>
    31383034023001808800000031363037313631373035383838343032313630373136313730353439383033303030303036313031303130363139383137383838343032
  </pack>
</log>
<log realm="server/127.0.0.1:10614" at="Sun Jul 17 12:31:55 IST 2016.785" lifespan="7ms">
  <send>
    <isomsg direction="outgoing">
      <!-- org.jpos.iso.packager.GenericPackager[C:\temp\iso93asciiB-custom.xml] -->
      <field id="0" value="1804"/>
      <field id="7" value="1607161705"/>
      <field id="11" value="888402"/>
      <field id="12" value="160716170549"/>
      <field id="24" value="803"/>
      <field id="25" value="0000"/>
      <field id="33" value="101010"/>
      <field id="37" value="619817888402"/>
    </isomsg>
  </send>
</log>
<log realm="Client" at="Sun Jul 17 12:31:55 IST 2016.787" lifespan="1ms">
  <unpack>
    31383034023001808800000031363037313631373035383838343032313630373136313730353439383033303030303036313031303130363139383137383838343032
    <bitmap>{7, 11, 12, 24, 25, 33, 37}</bitmap>
    <unpack fld="7" packager="org.jpos.iso.IFA_NUMERIC">
      <value>1607161705</value>
    </unpack>
    <unpack fld="11" packager="org.jpos.iso.IFA_NUMERIC">
      <value>888402</value>
    </unpack>
    <unpack fld="12" packager="org.jpos.iso.IFA_NUMERIC">
      <value>160716170549</value>
    </unpack>
    <unpack fld="24" packager="org.jpos.iso.IFA_NUMERIC">
      <value>803</value>
    </unpack>
    <unpack fld="25" packager="org.jpos.iso.IFA_NUMERIC">
      <value>0000</value>
    </unpack>
    <unpack fld="33" packager="org.jpos.iso.IFA_LLNUM">
      <value>101010</value>
    </unpack>
    <unpack fld="37" packager="org.jpos.iso.IF_CHAR">
      <value>619817888402</value>
    </unpack>
  </unpack>
</log>
<log realm="client/127.0.0.1:7654" at="Sun Jul 17 12:31:55 IST 2016.789" lifespan="4ms">
  <receive>
    <isomsg direction="incoming">
      <!-- org.jpos.iso.packager.GenericPackager[C:\temp\iso93asciiB-custom.xml] -->
      <header>49534F3730313030303030</header>
      <field id="0" value="1804"/>
      <field id="7" value="1607161705"/>
      <field id="11" value="888402"/>
      <field id="12" value="160716170549"/>
      <field id="24" value="803"/>
      <field id="25" value="0000"/>
      <field id="33" value="101010"/>
      <field id="37" value="619817888402"/>
    </isomsg>
  </receive>
</log>
<log realm="Client" at="Sun Jul 17 12:31:55 IST 2016.791">
  <pack>
    31383134023001808A00000031363037313631373035383838343032313630373136313730353439383033303030303036313031303130363139383137383838343032303030
  </pack>
</log>
<log realm="Server" at="Sun Jul 17 12:31:55 IST 2016.791">
  <unpack>
    31383134023001808A00000031363037313631373035383838343032313630373136313730353439383033303030303036313031303130363139383137383838343032303030
    <bitmap>{7, 11, 12, 24, 25, 33, 37, 39}</bitmap>
    <unpack fld="7" packager="org.jpos.iso.IFA_NUMERIC">
      <value>1607161705</value>
    </unpack>
    <unpack fld="11" packager="org.jpos.iso.IFA_NUMERIC">
      <value>888402</value>
    </unpack>
    <unpack fld="12" packager="org.jpos.iso.IFA_NUMERIC">
      <value>160716170549</value>
    </unpack>
    <unpack fld="24" packager="org.jpos.iso.IFA_NUMERIC">
      <value>803</value>
    </unpack>
    <unpack fld="25" packager="org.jpos.iso.IFA_NUMERIC">
      <value>0000</value>
    </unpack>
    <unpack fld="33" packager="org.jpos.iso.IFA_LLNUM">
      <value>101010</value>
    </unpack>
    <unpack fld="37" packager="org.jpos.iso.IF_CHAR">
      <value>619817888402</value>
    </unpack>
    <unpack fld="39" packager="org.jpos.iso.IFA_NUMERIC">
      <value>000</value>
    </unpack>
  </unpack>
</log>
<log realm="server/127.0.0.1:10614" at="Sun Jul 17 12:31:55 IST 2016.792" lifespan="26ms">
  <receive>
    <isomsg direction="incoming">
      <!-- org.jpos.iso.packager.GenericPackager[C:\temp\iso93asciiB-custom.xml] -->
      <header>49534F3730313030303030</header>
      <field id="0" value="1814"/>
      <field id="7" value="1607161705"/>
      <field id="11" value="888402"/>
      <field id="12" value="160716170549"/>
      <field id="24" value="803"/>
      <field id="25" value="0000"/>
      <field id="33" value="101010"/>
      <field id="37" value="619817888402"/>
      <field id="39" value="000"/>
    </isomsg>
  </receive>
</log>
<log realm="client/127.0.0.1:7654" at="Sun Jul 17 12:31:55 IST 2016.793" lifespan="3ms">
  <send>
    <isomsg direction="outgoing">
      <!-- org.jpos.iso.packager.GenericPackager[C:\temp\iso93asciiB-custom.xml] -->
      <header>49534F3730313030303030</header>
      <field id="0" value="1814"/>
      <field id="7" value="1607161705"/>
      <field id="11" value="888402"/>
      <field id="12" value="160716170549"/>
      <field id="24" value="803"/>
      <field id="25" value="0000"/>
      <field id="33" value="101010"/>
      <field id="37" value="619817888402"/>
      <field id="39" value="000"/>
    </isomsg>
  </send>
</log>

从 jpos 你只会得到 header.in 的 hexdump 为了发送 ascii93 版本你需要将 hexdump 转换为字节然后位。

https://github.com/vikrantlabde/iso8583-Java/blob/master/src/ISO/iso8583.java

您可以使用此程序打包发送isoascii93消息