5

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

但是在发送消息后,我从服务器收到了无效的标头错误。

所以我的问题是标题到底是由什么组成的,我如何为 MTI 值 1200 构建我的标题。

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

我应该如何构建我的 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;
4

3 回答 3

3

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

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

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

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

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>
于 2016-08-18T03:48:42.560 回答
2

您可以在频道级别设置标题(即channel.setHeader("xxx").getBytes()),或将其设置在每个消息级别(即m.setHeader("xxx".getBytes()))。

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

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

于 2016-02-07T20:50:04.693 回答
1

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

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

你可以使用这个程序来打包和发送 isoascii93 消息

于 2016-09-21T09:30:59.617 回答