• Stars
    star
    319
  • Rank 131,491 (Top 3 %)
  • Language
    Kotlin
  • License
    Apache License 2.0
  • Created over 9 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Kotlin/Java Client & Server for ISO8583 & Netty

JReactive-8583

Free ISO8583 Connector for JDK (Netty)

Maven Central Build Status Libraries.io for GitHub Codacy Badge Maintainability

Motivation

  1. jPOS library is not free for commercial use.
  2. j8583 is free but does not offer network client

Solution: "J-Reactive-8583" ISO8583 Client and Server built on top of excellent Netty asynchronous messaging framework with the help of j8583 for encoding/decoding. It is distributed under Apache License 2.0.

Supported Features

  • Client and Server endpoints.
  • Java 11+
  • Support ISO8583 messages using j8583 library.
  • Customizable ISO MessageFactory.
  • Automatic responding to Echo messages.
  • Automatic client reconnection.
  • Secure message logger: mask PAN and track data or any other field (customizable). Optionally prints field descriptions.
  • Configurable netty Bootstrap and ChannelPipeline

ISO8583 TCP/IP Transport

For data transmission TCP/IP uses sessions. Each session is a bi-directional data stream. The protocol uses a single TCP/IP session to transfer data between hosts in both directions.

The continuous TCP/IP data stream is split into frames. Each ISO8583 message is sent in a separate frame.

A Frame consists of an N-byte length header and message body. Usually, N==2. The header contains the length of the following message. The high byte of value is transmitted first, and the low byte of value is transmitted second.

N bytes M bytes
Message Length = M ISO–8583 Message

Getting Started

Add dependency to your project:

<dependencies>
    <dependency>
        <groupId>com.github.kpavlov.jreactive8583</groupId>
        <artifactId>netty-iso8583</artifactId>
        <version>${LATEST_VERSION}</version>
    </dependency>
</dependencies>

Now you may use ISO8583 client or server in your code.

Creating and Using ISO-8583 Client

The minimal client workflow includes:

var messageFactory = new J8583MessageFactory<>(ISO8583Version.V1987, MessageOrigin.OTHER);// [1]
Iso8583Client<IsoMessage> client = new Iso8583Client<>(messageFactory);// [2]

client.addMessageListener(new IsoMessageListener<IsoMessage>() { // [3]
    ...
});
client.getConfiguration().replyOnError(true);// [4]
client.init();// [5]

client.connect(host, port);// [6]
if (client.isConnected()) { // [7]

    IsoMessage message = messageFactory.newMessage(...);
    ...
    client.sendAsync(message);// [8]
    // or
    client.send(message);// [9]
    // or
    client.send(message, 1, TimeUnit.SECONDS);// [10]
}

...
client.shutdown();// [11]
  1. First you need to create a MessageFactory. You MUST specify a role of your client for originated messages, e.g. ACQUIRER, ISSUER or OTHER.
  2. Then you create a Iso8583Client providing MessageFactory and, optionally, SocketAddress
  3. Add one or more custom IsoMessageListeners to handle IsoMessages.
  4. Configure the client. You may omit this step if you're fine with default configuration.
  5. Initialize a client. Now it is ready to connect.
  6. Establish a connection. By default, if connection will is lost, it reconnects automatically. You may disable this behaviour or change reconnectInterval.
  7. Verify that connection is established
  8. Send IsoMessage asynchronously
  9. Send IsoMessage synchronously
  10. Send IsoMessage synchronously with timeout support
  11. Disconnect when you're done.

Creating and Using ISO-8583 Server

Typical server workflow includes:

var messageFactory = new J8583MessageFactory<>(ConfigParser.createDefault(), ISO8583Version.V1987, MessageOrigin.ACQUIRER);// [1]
Iso8583Server<IsoMessage> server = new Iso8583Server<>(port, messageFactory);// [2]

server.addMessageListener(new IsoMessageListener<IsoMessage>() { // [3]
    ...
});
server.getConfiguration().replyOnError(true);// [4]
server.init();// [5]

server.start();// [6]
if (server.isStarted()) { // [7]
    ...
}

...
server.shutdown();// [8]
  1. First you need to create a MessageFactory. You MUST specify a role of your server for originated messages, e.g. ACQUIRER, ISSUER or OTHER.
  2. Then you create a Iso8583Server providing MessageFactory and port to bind to
  3. Add one or more custom IsoMessageListeners to handle IsoMessages.
  4. Configure the server. You may omit this step if you're fine with default configuration.
  5. Initialize a server. Now it is ready to start.
  6. Start server. Now it is ready to accept client connections.
  7. Verify that the server is started
  8. Shutdown server when you're done.

Logging

Default IsoMessageLoggingHandler may produce output like:

312 [nioEventLoopGroup-5-1] DEBUG IsoMessageLoggingHandler - [id: 0xa72cc005, /127.0.0.1:50853 => /127.0.0.1:9876] MTI: 0x0200
  2: [Primary account number (PAN):NUMERIC(19)] = '000400*********0002'
  3: [Processing code:NUMERIC(6)] = '650000'
  7: [Transmission date & time:DATE10(10)] = '0720233443'
  11: [System trace audit number:NUMERIC(6)] = '483248'
  32: [Acquiring institution identification code:LLVAR(3)] = '456'
  35: [Track 2 data:LLVAR(17)] = '***'
  43: [Card acceptor name/location (1-23 address 24-36 city 37-38 state 39-40 country):ALPHA(40)] = 'SOLABTEST TEST-3 DF MX                  '
  49: [Currency code, transaction:ALPHA(3)] = '484'
  60: [Reserved national:LLLVAR(3)] = 'foo'
  61: [Reserved private:LLLVAR(5)] = '1234P'
  100: [Receiving institution identification code:LLVAR(3)] = '999'
  102: [Account identification 1:LLVAR(4)] = 'ABCD'

Using client or server configuration

You may:

  • enable message logging. As of 0.2.2 logging is disabled by default (#50).
  • enable and disable printing of sensitive information, like PAN
  • customize which fields should be masked in logs
  • enable and disable printing field descriptions
  • customize tcp frame length field length
  • customize ISO 8583 version

See ConnectorConfiguration , ServerConfiguration and ClientConfiguration .


For frequently asked questions check the FAQ page.

Sequence Diagram

Message processing is described in the following diagram:

Sequence Diagram

ISO 8583 Links

More Repositories

1

fixio

FIX Protocol Support for Netty
Java
101
star
2

spring-hmac-rest

Spring HMAC authentication filter for RESTfull webservice example.
Java
39
star
3

netty-jaxrs

JAX-RS Handler for Netty 4.1
Java
8
star
4

twilio-mock

Twilio Mock API Server
TypeScript
6
star
5

selenide-maven-sample

Sample Maven project with Selenide tests
Java
5
star
6

nginx-secure-proxy

Optimized container for Nginx with very secure SSL and mod_security enabled
Shell
4
star
7

maya

Integration-test library for Kotlin and Java
Kotlin
3
star
8

tomcat-custom-env

Tomcat Custom Configuration Example
Shell
2
star
9

swift-particles

Reusable Swift components library
Swift
1
star
10

securitywatch

Automatically exported from code.google.com/p/securitywatch
Java
1
star
11

ak3-bank

Akka-Kotlin-Koin-Ktor (AK^3) Bank API
Kotlin
1
star
12

spring-cloud-config-sample

Sample SpringFramework-driven application configured to use local or remote configuration server.
Java
1
star
13

stocks

Sample Stocks Service
Kotlin
1
star
14

kpavlov

1
star
15

dynamic-sslsocketfactory

Dynamic (Lazy) SSLSocketFactory Implementation
Java
1
star
16

wiremock

Docker container for Wiremock standalone
Dockerfile
1
star
17

simple-transaction-service

Simple RESTful​ ​API​ ​for​ ​money transfers​ ​between​ ​accounts
Kotlin
1
star
18

user-home-bin

Usefull shell scripts to place to ~/bin
1
star
19

spring-reactive-messaging

Reactive messaging SQS producer/consumer inspired by Spring Messaging and Spring Integration, implemented using Project Reactor.
Kotlin
1
star
20

mock-statsd

Mock StatsD is a Kotlin/Java library for simplified testing and detailed verification of applications sending metrics to a StatsD server. With automated port management and seamless JUnit 5 integration, it ensures efficient and effective metrics testing for superior software reliability.
Kotlin
1
star
21

await4j

Simplify asynchronous programming in Java with Project Loom virtual threads and a familiar async/await style API
Java
1
star