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();
Advertisement
Answer
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>