-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Welcome to the ISO8583 wiki!
A lightweight library to create ISO8583 POJOs and serialize them to bytes, and to read bytes and deserialize them into a ISO8583 POJO. This has no external dependencies and is all in its self contained classes. The aim is to make it usable across the mobile and desktop platforms. This has no cost and licensing associated with it.
Look at the BitmapMessageTest.java test case. It gives you the basics on how to operate with BitmapMessage.
Create a list containing your packager for individual fields. The ordering is important. The packagers generally start with the pan field 2, hence the preceding 0,1 elements are made NOPDataPackager. If you want to define an LLVar package where the LL is in EBCDIC data (so an EBCDIC F0F1 length would represent 12) and the var is in ebcdic data you create a field like
add(new Field("2", new EbcdicLengthPackager(2), new EbcdicDataPackager()));
If it was LLL you would simply do EbcdicLengthPackager(3). If there is no variable length portion to a field, just a fixed field, then you just use the data packager to the field. Packagers for BCD,Binary, Ascii and EBCDIC have been provided for the length and data. Take a look at their test cases to understand how its used.
final List<Field> subfields = new ArrayList<Field>() {
{
add(new Field("0", new NOPDataPackager(0)));
add(new Field("1", new NOPDataPackager(0)));
add(new Field("2", new EbcdicLengthPackager(2), new EbcdicDataPackager()));
add(new Field("3", new EbcdicDataPackager(6)));
add(new Field("4", new EbcdicDataPackager(12)));
add(new Field("5", new EbcdicDataPackager(12)));
add(new Field("6", new NOPDataPackager(0)));
add(new Field("7", new EbcdicDataPackager(10)));
add(new Field("8", new NOPDataPackager(0)));
add(new Field("9", new NOPDataPackager(0)));
add(new Field("10", new NOPDataPackager(0)));
add(new Field("11", new EbcdicDataPackager(6)));
add(new Field("12", new EbcdicDataPackager(12)));
add(new Field("13", new EbcdicDataPackager(4)));
add(new Field("14", new EbcdicDataPackager(4)));
add(new Field("15", new NOPDataPackager(0)));
add(new Field("16", new NOPDataPackager(0)));
add(new Field("17", new NOPDataPackager(0)));
add(new Field("18", new NOPDataPackager(0)));
add(new Field("19", new EbcdicDataPackager(3)));
add(new Field("20", new EbcdicDataPackager(3)));
add(new Field("21", new EbcdicDataPackager(3)));
add(new Field("22", new EbcdicDataPackager(12)));
add(new Field("23", new EbcdicDataPackager(3)));
add(new Field("24", new EbcdicDataPackager(3)));
add(new Field("25", new EbcdicDataPackager(4)));
add(new Field("26", new EbcdicDataPackager(4)));
add(new Field("27", new EbcdicDataPackager(1)));
add(new Field("28", new EbcdicDataPackager(9)));
add(new Field("29", new EbcdicDataPackager(9)));
add(new Field("30", new EbcdicDataPackager(24)));
add(new Field("31", new EbcdicLengthPackager(2), new EbcdicDataPackager()));
add(new Field("32", new EbcdicLengthPackager(2), new EbcdicDataPackager()));
add(new Field("33", new EbcdicLengthPackager(2), new EbcdicDataPackager()));
add(new Field("34", new EbcdicLengthPackager(2), new EbcdicDataPackager()));
add(new Field("35", new EbcdicLengthPackager(2), new EbcdicDataPackager()));
add(new Field("36", new EbcdicLengthPackager(2), new EbcdicDataPackager()));
add(new Field("37", new EbcdicDataPackager(12)));
add(new Field("38", new EbcdicDataPackager(6)));
add(new Field("39", new EbcdicDataPackager(3)));
add(new Field("40", new EbcdicDataPackager(3)));
add(new Field("41", new EbcdicDataPackager(8)));
add(new Field("42", new EbcdicDataPackager(15)));
add(new Field("43", new EbcdicLengthPackager(2), new EbcdicDataPackager()));
add(new Field("44", new EbcdicLengthPackager(2), new EbcdicDataPackager()));
add(new Field("45", new EbcdicLengthPackager(2), new EbcdicDataPackager()));
add(new Field("46", new EbcdicLengthPackager(2), new EbcdicDataPackager()));
add(new Field("47", new EbcdicLengthPackager(3), new EbcdicDataPackager()));
add(new Field("48", new EbcdicLengthPackager(3), new EbcdicDataPackager()));
add(new Field("49", new EbcdicDataPackager(3)));
add(new Field("50", new EbcdicDataPackager(3)));
add(new Field("51", new EbcdicDataPackager(3)));
add(new Field("52", new EbcdicDataPackager(8)));
add(new Field("53", new EbcdicLengthPackager(2), new EbcdicDataPackager()));
add(new Field("54", new EbcdicLengthPackager(3), new EbcdicDataPackager()));
add(new Field("55", new EbcdicLengthPackager(3), new EbcdicDataPackager()));
add(new Field("56", new EbcdicLengthPackager(2), new EbcdicDataPackager()));
add(new Field("57", new EbcdicDataPackager(3)));
add(new Field("58", new EbcdicLengthPackager(2), new EbcdicDataPackager()));
add(new Field("59", new EbcdicLengthPackager(3), new EbcdicDataPackager()));
add(new Field("60", new EbcdicLengthPackager(3), new BinaryDataPackager()));
add(new Field("61", new EbcdicLengthPackager(3), new EbcdicDataPackager()));
add(new Field("62", new EbcdicLengthPackager(3), new BinaryDataPackager()));
add(new Field("63", new EbcdicLengthPackager(3), new EbcdicDataPackager()));
add(new Field("64", new EbcdicDataPackager(8)));
}
};
final List<Field> fields = new ArrayList<Field>() {
{
add(new Field("0", new EbcdicDataPackager(4))); //MTI
add(new Field("1", new BitmapPackager(8), subfields));//Bitmap
}
};
Create a BitmapMessage Object BitmapMessage msg = new BitmapMessage(fields);
Pass in the data bytes received, from a tcp connection or file. The hex string is used here for readability. Call the objects unpack message to parse the bytes using the packagers configured (list of field packagers)for each field
String bytesInHex = "F1F1F2F0783407424640C014F1F5F3F7F4F7F5F4F0F5F1F5F4F9F0F0F2F3F9F4F8F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F1F8F1F7F1F1F0F8F1F0F5F5F5F3F0F3F1F2F0F0F0E2F4F1F6F0F0F0F0F1F0F0F1F1F0F0F5F6F9F7F1F5F5F1F5F4F9F0F3F1F0F3F4F7F7F1F0F2F3F3F7F1F2F3F4F5F6F7F8F9F0F1F2F3E0E2C7E0F0F1F1F6F0F0F0F0F0F0F0F0F0F1F2F3F4F5F6F7F8F9F04040404040F8F4F0F8F4F0F4F1F3D4E2F8F4F0F0F5FFFF0000F0F0F0F0F0F240404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040F0F0F0F0F0F240404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040F0F0F0F0F0F240404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040F0F3F1F2F0F2F0F1F0F0C6D9D6E2E361C3C8C1D9D3C5E2A1A1A1A1A1A1A1A1A1A1A1A1A140E3C5D9D4E240C1D5C440C3D6D5C4C9E3C9D6D5E240E5C5D9E2C9D6D540C1C3C3C5D7E3C5C440C2E840E3C8C540C3C1D9C4D4C5D4C2C5D940F1F2F3F4F5F1F7F1F7F1F1F0F8F1F0F5F5F5F3F1F0F0F0F0F1E28583A4998540C59385948595A340C9C440404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040F0F1F2F3F4F5F6F7F8F9F1F0F1F0F1F0F1F0F1F0F1F0F1F0F1F1C1E7C6C4F380000000F0F3";
msg.unpack(Utils.hexStringToByteArray(bytesInHex));
You can see the unpacked message using the deacribe ethod
System.out.print(msg.describe());
[ 0] : [1120]
[Bitmap ] : [783407424640C014]
[Bitmap ] : [2 3 4 5 11 12 14 22 23 24 26 31 34 38 39 42 49 50 60 62 ]
[ 2] : [374754051549002]
[ 3] : [394800]
[ 4] : [000000000000]
[ 5] : [000000000000]
[ 11] : [000018]
[ 12] : [171108105553]
[ 14] : [0312]
[ 22] : [000S41600001]
[ 23] : [001]
[ 24] : [100]
[ 26] : [5697]
[ 31] : [515490310347710]
[ 34] : [371234567890123\SG\0116]
[ 38] : [000000]
[ 39] : [000]
[ 42] : [1234567890 ]
[ 49] : [840]
[ 50] : [840]
[ 60] : [D4E2F8F4F0F0F5FFFF0000F0F0F0F0F0F240404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040F0F0F0F0F0F240404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040F0F0F0F0F0F240404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040F0F3F1F2F0F2F0F1F0F0C6D9D6E2E361C3C8C1D9D3C5E2A1A1A1A1A1A1A1A1A1A1A1A1A140E3C5D9D4E240C1D5C440C3D6D5C4C9E3C9D6D5E240E5C5D9E2C9D6D540C1C3C3C5D7E3C5C440C2E840E3C8C540C3C1D9C4D4C5D4C2C5D940F1F2F3F4F5F1F7F1F7F1F1F0F8F1F0F5F5F5F3F1F0F0F0F0F1E28583A4998540C59385948595A340C9C440404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040F0F1F2F3F4F5F6F7F8F9F1F0F1F0F1F0F1F0F1F0F1F0F1]
[ 62] : [C1E7C6C4F380000000F0F3]
You can use the get and set methods to get values and set values for the data elements. The data packagers have a compliance parameter, which can be passed in to make sure you don't inadvertently print the pans,tracks,cvv and expiry date in the clear.
A specialized Tag Length Value data packager is also available to handle standard (non ber tlv) tlv data.
Example Here field 2 is a TLV field prepended by a
public void unpackPacktest2() throws Exception {
final List<Field> subfields = new ArrayList<Field>() {
{
add(new Field<String>("0", new NOPDataPackager(0)));
add(new Field<String>("1", new NOPDataPackager(0)));
add(new Field<Map<String, String>>("2", new AsciiLengthPackager(3), new GenericTLVDataPackager(
new AsciiDataPackager(3), new AsciiLengthPackager(3), new AsciiDataPackager())));
}
};
final List<Field<String>> fields = new ArrayList<Field<String>>() {
{
add(new Field("0", new AsciiDataPackager(4)));
add(new Field("1", new BitmapPackager(8), subfields));
}
};
BitmapMessage bm = new BitmapMessage<>(fields);
HashMap<String, String> h = new HashMap<String, String>() {
{
put("005", "55555");
put("006", "666666");
put("007", "7777777");
}
};
bm.setMTI("0100");
bm.set("2", h);
byte[] x = bm.pack();
System.out.println(bm.describe()));
}
The output would be...
[ 0] : [0100]
[Bitmap Hex] : [4000000000000000]
[Bitmap Bit] : [2 ]
[ 2] : [
[tag ][length][value]
[005 ][5 ][55555]
[006 ][6 ][666666]
[007 ][7 ][7777777]
]