提问者:小点点

使用JPOS在两个Iso8583消息中附加2字节的十六进制长度


我正在使用 JPOS 发送 0800 网络请求。但问题是 2 字节的标头长度没有附加到我的消息中。如果消息的长度为 42,但添加 2 字节的标头应使其为 44。TCP 转储:

 length 42
        0x0000:  4500 005e 4448 4000 4006 8842 0a14 5140  E..^DH@.@..B..Q@
        0x0010:  0a5f 085d 952e 30c8 5cdb c683 49e6 692d  ._.]..0.\...I.i-
        0x0020:  8018 01f6 6e60 0000 0101 080a 0775 0600  ....n`.......u..
        0x0030:  889f a492 3038 3030 8220 0100 0000 0000  ....0800........
        0x0040:  0400 0000 0000 0000 3132 3234 3139 3035  ........12241905
        0x0050:  3136 3132 3033 3437 3030 3130 3033       16120347001003

由于我的消息长度为42,002A应该以十六进制转储形式追加。

消息应为:

My Code:
BaseChannel channel = new NACChannel(packager, null);
channel.setHost("xx.xx.xx.xx", xxxxx);
channel.connect();
ISOMsg isoMsg = new ISOMsg();
isoMsg.setPackager(packager);
isoMsg.setMTI("0800");
isoMsg.set(7, "1224190516");
isoMsg.set(11, "120347");
isoMsg.set(24, "001");
isoMsg.set(70, "003");
byte[] send_PackedRequestData = isoMsg.pack();
channel.send(send_PackedRequestData);

如何将消息的长度附加到开头,使其成为

002A0800................1224190516120347001003

共1个答案

匿名用户

使用String.format("x%s ",strIsoMsg.length()/2,strIsoMsg)

我为您提供了一个模式代码,您可以使用该模式发送消息。这

   ISO87BPackager packager = new ISO87BPackager();

   ISOMsg isoMsg = new ISOMsg();
   isoMsg.setPackager(packager);
   isoMsg.setMTI("0800");
   isoMsg.set(3, "000000"); //PROCESSING CODE
   isoMsg.set(4, strAmount); //AMOUNT, TRANSACTION
   ...
   ...
   ...

   byte[] b1 = isoMsg.pack();
   isoMsg.set(64, MAC.calcMac(b1));
   byte[] b2 = isoMsg.pack();
   strIsoMsg = "700800900" + new String(Hex.encodeHex(b2));
   
   String msgHexWithLen = String.format("%04x%s",  strIsoMsg.length()/2, strIsoMsg);
   byte[] bytes = IsoParser.hexStringToByteArray(msgHexWithLen);
   ...
   ...
   ...
   Socket socket = new Socket();
   socket.connect(new InetSocketAddress("x.y.z.w", 7151), 5000);
   socket.setSoTimeout(30000);

   socket.getOutputStream().write(bytes, 0, bytes.length);
   socket.getOutputStream().flush();