i have to build an iso 8583 message and for that i used the jpos library which is, according to my researches, the best libray to handle iso 8583 communications. I succeeded to build and send iso 8583 messages with fields in range 0-128 as you can see in this code :
public class SimpleClient {
public ISOMsg sendData() throws ISOException, IOException, org.jpos.iso.ISOException {
ISOPackager packager = new GenericPackager("packager/iso93ascii.xml");
ISOMsg isoMsg = new ISOMsg();
isoMsg.setPackager(packager);
isoMsg.set(new ISOField(0, "1200"));
isoMsg.set(new ISOField(3, "920000"));
isoMsg.set(new ISOField(4, "100000005000"));
isoMsg.set(new ISOField(11, "000001"));
isoMsg.set(new ISOField(12, "144306"));
isoMsg.set(new ISOField(13, "0202"));
isoMsg.set(new ISOField(14, "3012"));
isoMsg.set(new ISOField(15, "1205"));
isoMsg.set(new ISOField(18, "5961"));
isoMsg.set(new ISOField(22, "020"));
isoMsg.set(new ISOField(23, "000"));
isoMsg.set(new ISOField(25, "00"));
isoMsg.set(new ISOField(26, "53"));
// isoMsg.set(new ISOField(28, "000000000"));
isoMsg.set(new ISOField(32, "27610000001"));
isoMsg.set(new ISOField(35, "9876500000306082"));
isoMsg.set(new ISOField(37, "43063829"));
isoMsg.set(new ISOField(41, "20390059"));
isoMsg.set(new ISOField(42, "111120000012"));
isoMsg.set("43", "support@hologram.com");
isoMsg.set("48.1", "12");
ASCIIChannel channel = new ASCIIChannel("127.0.0.1",
5000, packager);
channel.connect();
channel.send(isoMsg);
ISOMsg resIsoMsg = channel.receive();
byte[] msg = resIsoMsg.pack();
// channel.send(msg);
System.out.println("========================================================================================");
String res = ISOUtil.byte2hex(msg);
System.out.println(res);
System.out.println("========================================================================================");
System.out.println(Arrays.toString(msg));
System.out.println("========================================================================================");
byte[] bytes = ISOUtil.hex2byte(res);
System.out.println(Arrays.toString(bytes));
System.out.println("========================================================================================");
printISOMessage(resIsoMsg);
System.out.println("========================================================================================");
ISOMsg iso = new ISOMsg();
iso.setPackager(packager);
iso.unpack(bytes);
iso.dump(System.out, "");
System.out.println("========================================================================================");
return isoMsg;
}
private void printISOMessage(ISOMsg isoMsg) throws org.jpos.iso.ISOException {
System.out.printf("MTI = %s%n", isoMsg.getMTI());
for (int i = 1; i <= isoMsg.getMaxField(); i++) {
if (isoMsg.hasField(i)) {
System.out.printf("Field (%s) = %s%n", i, isoMsg.getString(i));
}
}
}
public static void main(String args[]) throws ISOException, IOException, org.jpos.iso.ISOException {
SimpleClient s=new SimpleClient();
s.sendData();
}
}
and the response class
public class Response {
private Map<String, Object> dataFields = new HashMap<>();
public Map<String, Object> getDataFields() {
return dataFields;
}
public void setDataFields(Map<String, Object> dataFields) {
this.dataFields = dataFields;
}
}
but i have a problem, if we would like to set subfields for field 40 for instance, how can we set them and integrate them in the ISOMsg object to send?
UPDATE : here is my packager :
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE isopackager PUBLIC
"-//jPOS/jPOS Generic Packager DTD 1.0//EN"
"http://jpos.org/dtd/generic-packager-1.0.dtd">
<!-- ISO 8583:1993 (ASCII) field descriptions for GenericPackager -->
<isopackager>
<isofield
id="0"
length="4"
name="Message Type Indicator"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="1"
length="16"
name="Bitmap"
class="org.jpos.iso.IFA_BITMAP"/>
<isofield
id="2"
length="19"
name="Primary Account number"
class="org.jpos.iso.IFA_LLNUM"/>
<isofield
id="3"
length="6"
name="Processing Code"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="4"
length="12"
name="Amount, Transaction"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="5"
length="12"
name="Amount, Reconciliation"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="6"
length="12"
name="Amount, Cardholder billing"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="7"
length="10"
name="Date and time, transmission"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="8"
length="8"
name="Amount, Cardholder billing fee"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="9"
length="8"
name="Conversion rate, Reconciliation"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="10"
length="8"
name="Conversion rate, Cardholder billing"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="11"
length="6"
name="Systems trace audit number"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="12"
length="12"
name="Date and time, Local transaction"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="13"
length="4"
name="Date, Effective"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="14"
length="4"
name="Date, Expiration"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="15"
length="6"
name="Date, Settlement"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="16"
length="4"
name="Date, Conversion"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="17"
length="4"
name="Date, Capture"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="18"
length="4"
name="Merchant type"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="19"
length="3"
name="Country code, Acquiring institution"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="20"
length="3"
name="Country code, Primary account number"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="21"
length="3"
name="Country code, Forwarding institution"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="22"
length="12"
name="Point of service data code"
class="org.jpos.iso.IF_CHAR"/>
<isofield
id="23"
length="3"
name="Card sequence number"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="24"
length="3"
name="Function code"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="25"
length="4"
name="Message reason code"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="26"
length="4"
name="Card acceptor business code"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="27"
length="1"
name="Approval code length"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="28"
length="6"
name="Date, Reconciliation"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="29"
length="3"
name="Reconciliation indicator"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="30"
length="24"
name="Amounts, original"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="31"
length="99"
name="Acquirer reference data"
class="org.jpos.iso.IFA_LLCHAR"/>
<isofield
id="32"
length="11"
name="Acquirer institution identification code"
class="org.jpos.iso.IFA_LLNUM"/>
<isofield
id="33"
length="11"
name="Forwarding institution identification code"
class="org.jpos.iso.IFA_LLNUM"/>
<isofield
id="34"
length="28"
name="Primary account number, extended"
class="org.jpos.iso.IFA_LLCHAR"/>
<isofield
id="35"
length="37"
name="Track 2 data"
class="org.jpos.iso.IFA_LLCHAR"/>
<isofield
id="36"
length="104"
name="Track 3 data"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="37"
length="12"
name="Retrieval reference number"
class="org.jpos.iso.IF_CHAR"/>
<isofield
id="38"
length="6"
name="Approval code"
class="org.jpos.iso.IF_CHAR"/>
<isofield
id="39"
length="3"
name="Action code"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="40"
length="3"
name="Service code"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="41"
length="8"
name="Card acceptor terminal identification"
class="org.jpos.iso.IF_CHAR"/>
<isofield
id="42"
length="15"
name="Card acceptor identification code"
class="org.jpos.iso.IF_CHAR"/>
<isofield
id="43"
length="99"
name="Card acceptor name/location"
class="org.jpos.iso.IFA_LLCHAR"/>
<isofield
id="44"
length="99"
name="Additional response data"
class="org.jpos.iso.IFA_LLCHAR"/>
<isofield
id="45"
length="76"
name="Track 1 data"
class="org.jpos.iso.IFA_LLCHAR"/>
<isofield
id="46"
length="204"
name="Amounts, Fees"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="47"
length="999"
name="Additional data - national"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofieldpackager
id="48"
length="999"
name="RESERVED PRIVATE USE"
class="org.jpos.iso.IFA_LLLCHAR"
packager="org.jpos.iso.packager.GenericSubFieldPackager">
<isofield
id="1"
length="999"
name="Additional data - private"
class="org.jpos.iso.IFA_LLLCHAR"/>
</isofieldpackager>
<isofield
id="49"
length="3"
name="Currency code, Transaction"
class="org.jpos.iso.IF_CHAR"/>
<isofield
id="50"
length="3"
name="Currency code, Reconciliation"
class="org.jpos.iso.IF_CHAR"/>
<isofield
id="51"
length="3"
name="Currency code, Cardholder billing"
class="org.jpos.iso.IF_CHAR"/>
<isofield
id="52"
length="8"
name="Personal identification number [PIN] data"
class="org.jpos.iso.IFA_BINARY"/>
<isofield
id="53"
length="48"
name="Security related control information"
class="org.jpos.iso.IFA_LLBINARY"/>
<isofield
id="54"
length="120"
name="Amounts, additional"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="55"
length="255"
name="IC card system related data"
class="org.jpos.iso.IFA_LLLBINARY"/>
<isofield
id="56"
length="35"
name="Original data elements"
class="org.jpos.iso.IFA_LLNUM"/>
<isofield
id="57"
length="3"
name="Authorization life cycle code"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="58"
length="11"
name="Authorizing agent institution Id Code"
class="org.jpos.iso.IFA_LLNUM"/>
<isofield
id="59"
length="999"
name="Transport data"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="60"
length="999"
name="Reserved for national use"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="61"
length="999"
name="Reserved for national use"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="62"
length="999"
name="Reserved for private use"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="63"
length="999"
name="Reserved for private use"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="64"
length="8"
name="Message authentication code field"
class="org.jpos.iso.IFA_BINARY"/>
<isofield
id="65"
length="8"
name="Reserved for ISO use"
class="org.jpos.iso.IFA_BINARY"/>
<isofield
id="66"
length="204"
name="Amounts, original fees"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="67"
length="2"
name="Extended payment data"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="68"
length="3"
name="Country code, receiving institution"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="69"
length="3"
name="Country code, settlement institution"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="70"
length="3"
name="Country code, authorizing agent Inst."
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="71"
length="8"
name="Message number"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="72"
length="999"
name="Data record"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="73"
length="6"
name="Date, action"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="74"
length="10"
name="Credits, number"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="75"
length="10"
name="Credits, reversal number"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="76"
length="10"
name="Debits, number"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="77"
length="10"
name="Debits, reversal number"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="78"
length="10"
name="Transfer, number"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="79"
length="10"
name="Transfer, reversal number"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="80"
length="10"
name="Inquiries, number"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="81"
length="10"
name="Authorizations, number"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="82"
length="10"
name="Inquiries, reversal number"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="83"
length="10"
name="Payments, number"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="84"
length="10"
name="Payments, reversal number"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="85"
length="10"
name="Fee collections, number"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="86"
length="16"
name="Credits, amount"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="87"
length="16"
name="Credits, reversal amount"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="88"
length="16"
name="Debits, amount"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="89"
length="16"
name="Debits, reversal amount"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="90"
length="10"
name="Authorizations, reversal number"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="91"
length="3"
name="Country code, transaction Dest. Inst."
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="92"
length="3"
name="Country code, transaction Orig. Inst."
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="93"
length="11"
name="Transaction Dest. Inst. Id code"
class="org.jpos.iso.IFA_LLNUM"/>
<isofield
id="94"
length="11"
name="Transaction Orig. Inst. Id code"
class="org.jpos.iso.IFA_LLNUM"/>
<isofield
id="95"
length="99"
name="Card issuer reference data"
class="org.jpos.iso.IFA_LLCHAR"/>
<isofield
id="96"
length="999"
name="Key management data"
class="org.jpos.iso.IFA_LLLBINARY"/>
<isofield
id="97"
length="17"
name="Amount, Net reconciliation"
class="org.jpos.iso.IFA_AMOUNT"/>
<isofield
id="98"
length="25"
name="Payee"
class="org.jpos.iso.IF_CHAR"/>
<isofield
id="99"
length="11"
name="Settlement institution Id code"
class="org.jpos.iso.IFA_LLCHAR"/>
<isofield
id="100"
length="11"
name="Receiving institution Id code"
class="org.jpos.iso.IFA_LLNUM"/>
<isofield
id="101"
length="17"
name="File name"
class="org.jpos.iso.IFA_LLCHAR"/>
<isofield
id="102"
length="28"
name="Account identification 1"
class="org.jpos.iso.IFA_LLCHAR"/>
<isofield
id="103"
length="28"
name="Account identification 2"
class="org.jpos.iso.IFA_LLCHAR"/>
<isofield
id="104"
length="100"
name="Transaction description"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="105"
length="16"
name="Credits, Chargeback amount"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="106"
length="16"
name="Debits, Chargeback amount"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="107"
length="10"
name="Credits, Chargeback number"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="108"
length="10"
name="Debits, Chargeback number"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="109"
length="84"
name="Credits, Fee amounts"
class="org.jpos.iso.IFA_LLCHAR"/>
<isofield
id="110"
length="84"
name="Debits, Fee amounts"
class="org.jpos.iso.IFA_LLCHAR"/>
<isofield
id="111"
length="999"
name="Reserved for ISO use"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="112"
length="999"
name="Reserved for ISO use"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="113"
length="999"
name="Reserved for ISO use"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="114"
length="999"
name="Reserved for ISO use"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="115"
length="999"
name="Reserved for ISO use"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="116"
length="999"
name="Reserved for national use"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="117"
length="999"
name="Reserved for national use"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="118"
length="999"
name="Reserved for national use"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="119"
length="999"
name="Reserved for national use"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="120"
length="999"
name="Reserved for national use"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="121"
length="999"
name="Reserved for national use"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="122"
length="999"
name="Reserved for national use"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="123"
length="999"
name="Reserved for private use"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="124"
length="999"
name="Reserved for private use"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="125"
length="999"
name="Reserved for private use"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="126"
length="999"
name="Reserved for private use"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="127"
length="999"
name="Reserved for private use"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="128"
length="8"
name="Message authentication code field"
class="org.jpos.iso.IFA_BINARY"/>
</isopackager>
and finally the exception i got :
Exception in thread "main" org.jpos.iso.ISOException: error
packing field 48 (org.jpos.iso.ISOException: org.jpos.iso.IFA_LLLCHAR: Problem packing field -1 (java.lang.ClassCastException: java.util.BitSet cannot be cast to java.lang.String))
at org.jpos.iso.ISOBasePackager.pack(ISOBasePackager.java:185)
at org.jpos.iso.ISOMsg.pack(ISOMsg.java:467)
at org.jpos.iso.BaseChannel.pack(BaseChannel.java:981)
at org.jpos.iso.BaseChannel.send(BaseChannel.java:598)
at com.hologram.simulateur.acteurs.SimpleClient.sendData(SimpleClient.java:50)
at com.hologram.simulateur.acteurs.SimpleClient.main(SimpleClient.java:84)
Nested:org.jpos.iso.ISOException: org.jpos.iso.IFA_LLLCHAR: Problem packing field -1 (java.lang.ClassCastException: java.util.BitSet cannot be cast to java.lang.String)
at
org.jpos.iso.ISOStringFieldPackager.pack(ISOStringFieldPackager.java:157)
at org.jpos.iso.packager.GenericSubFieldPackager.pack(GenericSubFieldPackager.java:135)
at org.jpos.iso.ISOMsgFieldPackager.pack(ISOMsgFieldPackager.java:60)
at org.jpos.iso.ISOBasePackager.pack(ISOBasePackager.java:176)
at org.jpos.iso.ISOMsg.pack(ISOMsg.java:467)
at org.jpos.iso.BaseChannel.pack(BaseChannel.java:981)
at org.jpos.iso.BaseChannel.send(BaseChannel.java:598)
at com.hologram.simulateur.acteurs.SimpleClient.sendData(SimpleClient.java:50)
at com.hologram.simulateur.acteurs.SimpleClient.main(SimpleClient.java:84)
Nested:java.lang.ClassCastException: java.util.BitSet cannot be cast to java.lang.String
at org.jpos.iso.ISOStringFieldPackager.pack(ISOStringFieldPackager.java:143)
at org.jpos.iso.packager.GenericSubFieldPackager.pack(GenericSubFieldPackager.java:135)
at org.jpos.iso.ISOMsgFieldPackager.pack(ISOMsgFieldPackager.java:60)
at org.jpos.iso.ISOBasePackager.pack(ISOBasePackager.java:176)
at org.jpos.iso.ISOMsg.pack(ISOMsg.java:467)
at org.jpos.iso.BaseChannel.pack(BaseChannel.java:981)
at org.jpos.iso.BaseChannel.send(BaseChannel.java:598)
at com.hologram.simulateur.acteurs.SimpleClient.sendData(SimpleClient.java:50)
at com.hologram.simulateur.acteurs.SimpleClient.main(SimpleClient.java:84)
LINE 50->channel.send(isoMsg); LINE 84-> s.sendData();
Its failing as its trying to set the bitmpap field -1
If you don't have a bitmpap for DE48
Define your DE48 as the following with emitBitmap to false
<isofieldpackager id="48" emitBitmap="false" length="999" name="RESERVED PRIVATE USE" class="org.jpos.iso.IFA_LLLCHAR" packager="org.jpos.iso.packager.GenericSubFieldPackager">
<isofield id="1" length="999" name="Additional data - private" class="org.jpos.iso.IFA_LLLCHAR" />
</isofieldpackager>
Sample test code
public static void main(String[] args) throws ISOException {
ISOMsg m = new ISOMsg("0100");
GenericPackager pkg = new GenericPackager("path to packager");
Logger l = new Logger();
l.addListener(new SimpleLogListener());
m.setPackager(pkg);
m.set("48.1","ABCD");
byte[] arr = m.pack();
m.unpack(arr);
m.dump(System.out, "");
}
Since we do pack and unpack we ae sure that the data is being being handled correctly.
output
<isomsg direction="none">
<!-- org.jpos.iso.packager.GenericPackager[path to packager] -->
<field id="bitmap" value="{48}" type="bitmap"/>
<field id="0" value="0100"/>
<isomsg direction="none" id="48">
<!-- org.jpos.iso.packager.GenericSubFieldPackager -->
<field id="1" value="ABCD"/>
</isomsg>
</isomsg>