如何使用Java发送ISO8583消息



如果这是一个重复的问题,我真的很抱歉,但我在其他线程中尝试了很多答案,但都不适用。

我正试图使用TLSv1.2协议通过SSLSocket向远程服务器发送ISO8583消息,我使用密钥库配置了证书,并试图发送一个ISO8583示例消息:08002220010000800000900000011312115000000180105000003

0800:MTI
2220010000800000:二进制十六进制编码位图(仅存在字段3、7、11、24、41;时间
000001:STAN01:功能代码
05000003:终端ID

然后,我将消息转换为一个字节数组,并使用套接字OutputStream发送它,但服务器没有响应,并且在尝试读取InputStream时它处于冻结状态。

出于这个问题的目的,我选择测试手动设置的示例消息,而不使用任何打包方法。

我是ISO8583的新手,所以我不知道自己做错了什么。

这是我迄今为止尝试过的代码,非常感谢谁能帮助我。

Thread thread = new Thread(() -> {
try {
X509TrustManager[] tmm;
KeyStore ks  = KeyStore.getInstance("BKS");
InputStream is = getResources().openRawResource(R.raw.tunrootca2);
ks.load(is, KEY_PASSWORD.toCharArray());
tmm=tm(ks);
SSLContext ctx = SSLContext.getInstance("TLSv1.2");
ctx.init(null, tmm, null);
SSLSocketFactory SocketFactory = ctx.getSocketFactory();
SSLSocket socket = (SSLSocket) SocketFactory
.createSocket(REMOTE_ENDPOINT, REMOTE_ENDPOINT_PORT);

String sampleMessage = "080022200100008000009000000113120000000180105000003";
byte[] bytesMessage = sampleMessage.getBytes(StandardCharsets.UTF_16LE);
byte[] bytes = packData(bytesMessage);
OutputStream out = socket.getOutputStream();
out.write(bytes);
byte[] buffer = new byte[256];
InputStream in = socket.getInputStream();
int read;
while((read = in.read(buffer)) != -1) {
String output = new String(buffer, 0, read);
Log.v("SOCKET_OUTPUT", output);
}
} catch (Exception e) {
e.printStackTrace();
}
});
thread.start();
});

PackData函数

static byte[] packData(byte[] data) {
int len = data.length;
byte buf[] = new byte[len + 2];
buf[0] = (byte) (len >> 8 & 255);
buf[1] = (byte) (len & 255);
System.arraycopy(data, 0, buf, 2, len);
return buf;
}

设置套接字通信可能很棘手。如果可能的话,我建议使用WebSockets进行通信,因为它们已经设置好了通信协议的连接方式。

但如果你要坚持使用普通插座:

  1. 在您的写调用之后,调用flush((;

    out.write(bytes);
    out.flush();
    
  2. 如果1不起作用,事情就会变得更棘手。由于您无法控制其中的服务器端部分,因此很难知道您需要向它们发送什么,以便让它们向您发回一些内容。您可以尝试发送换行符。但除此之外,您发送的内容与另一端服务器期望的内容不匹配

---编辑---

我查阅了ISO8583,对你要做的事情有了更好的了解。你可以忽略我之前关于使用WebServer套接字的建议。

您缺少基本知识。不能使用字符串串联来构建ISO消息。您必须为这些启用字段设置正确的位图。也许可以试着遵循下面的示例。它将指导你掌握基本知识。

https://kodejava.org/how-do-i-pack-an-iso-8583-message/

您的代码看起来不错。您连接的是哪种后端?8583有点像xml,它是一种格式描述,但每个处理器都使用它来构建自己的特定协议,因此您确实需要向连接的供应商询问协议文档。

一些事情可能是问题:

  • 刷新OutputStream当您完成写入时,消息可能仍然挂在您的操作系统缓冲区中
  • 查看供应商文档是否需要某种框架,您可能需要在消息中添加校验和,或者
  • 您可能需要在消息前添加一个长度标头。8583最初建立在中继协议之上,其中传输处理消息长度。许多解析器还没有赶上向TCP/IP的过渡:(

最新更新