Showing posts with label JPOS. Show all posts
Showing posts with label JPOS. Show all posts

Wednesday, June 20, 2018

ISO 8583 Message Fields

ISO 8583 Message Fields:
<IsoDataField No="0" length="4" name="MESSAGE TYPE INDICATOR"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="1" length="16" name="BIT MAP"   class="org.jpos.iso.IFA_BITMAP"/>
<IsoDataField No="2" length="19" name="SECRET_ID/PAN"   class="org.jpos.iso.IFA_LLNUM"/>
<IsoDataField No="3" length="6" name="PROCESSING CODE"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="4" length="12" name="AMOUNT, TRANSACTION"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="5" length="12" name="AMOUNT, SETTLEMENT"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="6" length="12" name="AMOUNT, CARDHOLDER BILLING"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="7" length="10" name="TRANSMISSION DATE AND TIME"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="8" length="8" name="AMOUNT, CARDHOLDER BILLING FEE"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="9" length="8" name="CONVERSION RATE, SETTLEMENT"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="10" length="8" name="CONVERSION RATE, CARDHOLDER BILLING"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="11" length="6" name="SYSTEM TRACE AUDIT NUMBER"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="12" length="6" name="TIME, LOCAL TRANSACTION"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="13" length="4" name="DATE, LOCAL TRANSACTION"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="14" length="4" name="DATE, EXPIRATION"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="15" length="4" name="DATE, SETTLEMENT"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="16" length="4" name="DATE, CONVERSION"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="17" length="4" name="DATE, CAPTURE"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="18" length="4" name="MERCHANTS TYPE"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="19" length="3" name="ACQUIRING INSTITUTION COUNTRY CODE"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="20" length="3" name="PAN EXTENDED COUNTRY CODE"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="21" length="3" name="FORWARDING INSTITUTION COUNTRY CODE"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="22" length="3" name="POINT OF SERVICE ENTRY MODE"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="23" length="3" name="CARD SEQUENCE NUMBER"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="24" length="3" name="NETWORK INTERNATIONAL IDENTIFIEER"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="25" length="2" name="POINT OF SERVICE CONDITION CODE"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="26" length="2" name="POINT OF SERVICE PIN CAPTURE CODE"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="27" length="1" name="AUTHORIZATION IDENTIFICATION RESP LEN"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="28" length="9" name="AMOUNT, TRANSACTION FEE"   class="org.jpos.iso.IFA_AMOUNT"/>
<IsoDataField No="29" length="9" name="AMOUNT, SETTLEMENT FEE"   class="org.jpos.iso.IFA_AMOUNT"/>
<IsoDataField No="30" length="9" name="AMOUNT, TRANSACTION PROCESSING FEE"   class="org.jpos.iso.IFA_AMOUNT"/>
<IsoDataField No="31" length="9" name="AMOUNT, SETTLEMENT PROCESSING FEE"   class="org.jpos.iso.IFA_AMOUNT"/>
<IsoDataField No="32" length="11" name="ACQUIRING INSTITUTION IDENT CODE"   class="org.jpos.iso.IFA_LLNUM"/>
<IsoDataField No="33" length="11" name="FORWARDING INSTITUTION IDENT CODE"   class="org.jpos.iso.IFA_LLNUM"/>
<IsoDataField No="34" length="28" name="PAN EXTENDED"   class="org.jpos.iso.IFA_LLCHAR"/>
<IsoDataField No="35" length="37" name="TRACK 2 DATA"   class="org.jpos.iso.IFA_LLNUM"/>
<IsoDataField No="36" length="104" name="TRACK 3 DATA"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="37" length="12" name="RETRIEVAL REFERENCE NUMBER"   class="org.jpos.iso.IF_CHAR"/>
<IsoDataField No="38" length="6" name="AUTHORIZATION IDENTIFICATION RESPONSE"   class="org.jpos.iso.IF_CHAR"/>
<IsoDataField No="39" length="2" name="RESPONSE CODE"   class="org.jpos.iso.IF_CHAR"/>
<IsoDataField No="40" length="3" name="SERVICE RESTRICTION CODE"   class="org.jpos.iso.IF_CHAR"/>
<IsoDataField No="41" length="8" name="CARD ACCEPTOR TERMINAL IDENTIFICACION"   class="org.jpos.iso.IF_CHAR"/>
<IsoDataField No="42" length="15" name="CARD ACCEPTOR IDENTIFICATION CODE"   class="org.jpos.iso.IF_CHAR"/>
<IsoDataField No="43" length="40" name="CARD ACCEPTOR NAME/LOCATION"   class="org.jpos.iso.IF_CHAR"/>
<IsoDataField No="44" length="25" name="ADITIONAL RESPONSE DATA"   class="org.jpos.iso.IFA_LLCHAR"/>
<IsoDataField No="45" length="76" name="TRACK 1 DATA"   class="org.jpos.iso.IFA_LLCHAR"/>
<IsoDataField No="46" length="999" name="ADITIONAL DATA - ISO"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="47" length="999" name="ADITIONAL DATA - NATIONAL"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="48" length="999" name="ADITIONAL DATA - PRIVATE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="49" length="3" name="CURRENCY CODE, TRANSACTION"   class="org.jpos.iso.IF_CHAR"/>
<IsoDataField No="50" length="3" name="CURRENCY CODE, SETTLEMENT"   class="org.jpos.iso.IF_CHAR"/>
<IsoDataField No="51" length="3" name="CURRENCY CODE, CARDHOLDER BILLING"   class="org.jpos.iso.IF_CHAR"/>
<IsoDataField No="52" length="16" name="PIN DATA"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="53" length="16" name="SECURITY RELATED CONTROL INFORMATION"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="54" length="120" name="ADDITIONAL AMOUNTS"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="55" length="999" name="RESERVED ISO"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="56" length="999" name="RESERVED ISO"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="57" length="999" name="RESERVED NATIONAL"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="58" length="999" name="RESERVED NATIONAL"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="59" length="999" name="RESERVED NATIONAL"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="60" length="999" name="RESERVED PRIVATE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="61" length="999" name="RESERVED PRIVATE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="62" length="999" name="RESERVED PRIVATE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="63" length="999" name="RESERVED PRIVATE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="64" length="8" name="MESSAGE AUTHENTICATION CODE FIELD"   class="org.jpos.iso.IFA_BINARY"/>
<IsoDataField No="65" length="1" name="BITMAP, EXTENDED"   class="org.jpos.iso.IFA_BINARY"/>
<IsoDataField No="66" length="1" name="SETTLEMENT CODE"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="67" length="2" name="EXTENDED PAYMENT CODE"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="68" length="3" name="RECEIVING INSTITUTION COUNTRY CODE"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="69" length="3" name="SETTLEMENT INSTITUTION COUNTRY CODE"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="70" length="3" name="NETWORK MANAGEMENT INFORMATION CODE"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="71" length="4" name="MESSAGE NUMBER"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="72" length="4" name="MESSAGE NUMBER LAST"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="73" length="6" name="DATE ACTION"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="74" length="10" name="CREDITS NUMBER"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="75" length="10" name="CREDITS REVERSAL NUMBER"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="76" length="10" name="DEBITS NUMBER"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="77" length="10" name="DEBITS REVERSAL NUMBER"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="78" length="10" name="TRANSFER NUMBER"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="79" length="10" name="TRANSFER REVERSAL NUMBER"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="80" length="10" name="INQUIRIES NUMBER"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="81" length="10" name="AUTHORIZATION NUMBER"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="82" length="12" name="CREDITS, PROCESSING FEE AMOUNT"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="83" length="12" name="CREDITS, TRANSACTION FEE AMOUNT"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="84" length="12" name="DEBITS, PROCESSING FEE AMOUNT"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="85" length="12" name="DEBITS, TRANSACTION FEE AMOUNT"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="86" length="16" name="CREDITS, AMOUNT"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="87" length="16" name="CREDITS, REVERSAL AMOUNT"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="88" length="16" name="DEBITS, AMOUNT"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="89" length="16" name="DEBITS, REVERSAL AMOUNT"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="90" length="42" name="ORIGINAL DATA ELEMENTS"   class="org.jpos.iso.IFA_NUMERIC"/>
<IsoDataField No="91" length="1" name="FILE UPDATE CODE"   class="org.jpos.iso.IF_CHAR"/>
<IsoDataField No="92" length="2" name="FILE SECURITY CODE"   class="org.jpos.iso.IF_CHAR"/>
<IsoDataField No="93" length="6" name="RESPONSE INDICATOR"   class="org.jpos.iso.IF_CHAR"/>
<IsoDataField No="94" length="7" name="SERVICE INDICATOR"   class="org.jpos.iso.IF_CHAR"/>
<IsoDataField No="95" length="42" name="REPLACEMENT AMOUNTS"   class="org.jpos.iso.IF_CHAR"/>
<IsoDataField No="96" length="16" name="MESSAGE SECURITY CODE"   class="org.jpos.iso.IFA_BINARY"/>
<IsoDataField No="97" length="17" name="AMOUNT, NET SETTLEMENT"   class="org.jpos.iso.IFA_AMOUNT"/>
<IsoDataField No="98" length="25" name="PAYEE"   class="org.jpos.iso.IF_CHAR"/>
<IsoDataField No="99" length="11" name="SETTLEMENT INSTITUTION IDENT CODE"   class="org.jpos.iso.IFA_LLNUM"/>
<IsoDataField No="100" length="11" name="RECEIVING INSTITUTION IDENT CODE"   class="org.jpos.iso.IFA_LLNUM"/>
<IsoDataField No="101" length="17" name="FILE NAME"   class="org.jpos.iso.IFA_LLCHAR"/>
<IsoDataField No="102" length="28" name="FROM ACCOUNT"   class="org.jpos.iso.IFA_LLCHAR"/>
<IsoDataField No="103" length="10" name="ACCOUNT IDENTIFICATION 2"   class="org.jpos.iso.IFA_LLCHAR"/>
<IsoDataField No="104" length="100" name="TRANSACTION DESCRIPTION"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="105" length="999" name="RESERVED ISO USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="106" length="999" name="RESERVED ISO USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="107" length="999" name="RESERVED ISO USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="108" length="999" name="RESERVED ISO USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="109" length="999" name="RESERVED ISO USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="110" length="999" name="RESERVED ISO USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="111" length="999" name="RESERVED ISO USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="112" length="999" name="RESERVED NATIONAL USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="113" length="999" name="RESERVED NATIONAL USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="114" length="999" name="RESERVED NATIONAL USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="115" length="999" name="RESERVED NATIONAL USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="116" length="999" name="RESERVED NATIONAL USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="117" length="999" name="RESERVED NATIONAL USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="118" length="999" name="RESERVED NATIONAL USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="119" length="999" name="RESERVED NATIONAL USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="120" length="999" name="RESERVED PRIVATE USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="121" length="999" name="RESERVED PRIVATE USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="122" length="999" name="RESERVED PRIVATE USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="123" length="999" name="RESERVED PRIVATE USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="124" length="999" name="RESERVED PRIVATE USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="125" length="999" name="RESERVED PRIVATE USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="126" length="999" name="RESERVED PRIVATE USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="127" length="999" name="RESERVED PRIVATE USE"   class="org.jpos.iso.IFA_LLLCHAR"/>
<IsoDataField No="128" length="8" name="MAC 2"   class="org.jpos.iso.IFA_BINARY"/>

Friday, May 4, 2012

ISO Message: Packing and Un-Packing

Dear Reader,
Here I am writing about how to pack and unpack ISO messages for banking transactions.
For basic necessary stuffs please read my earlier written blog and then come here, link is below:
http://deepakmodi2006.blogspot.in/2012/04/iso-8583-standard-in-java-for-financial.html

jPOS is a Java platform-based, ISO-8583 based financial transaction library/framework that can be 
customized and extended in order to implement financial interchanges.

So first thing to do is download JPOS libraries from its website.
Following Jars are required for the same. Please see the picture below.

For packing and unpacking an ISO message I have written four programs: basic.xml genericpackager.dtd BuildISOMessage.java ParseISOMessage.java Output of program.. ------------------------------------------- package dmodi; import java.io.IOException; import org.jpos.iso.ISOException; import org.jpos.iso.ISOMsg; import org.jpos.iso.packager.GenericPackager; public class BuildISOMessage { public static void main(String[] args) throws IOException, ISOException { //Create Packager based on XML that contain DE type GenericPackager packager = new GenericPackager("basic.xml"); // Create ISO Message ISOMsg isoMsg = new ISOMsg(); isoMsg.setPackager(packager); isoMsg.setMTI("0200"); isoMsg.set(3, "201234"); isoMsg.set(4, "10000"); isoMsg.set(7, "110722180"); isoMsg.set(11, "123456"); isoMsg.set(32, "100005"); isoMsg.set(44, "A5DFGR"); isoMsg.set(105, "ABCDEFGHIJ 1234567890"); // print the DE list logISOMsg(isoMsg); // Get and print the output result byte[] data = isoMsg.pack(); String dataString=new String(data); System.out.println("Packed ISO Message : " +dataString); ParseISOMessage parse=new ParseISOMessage(); parse.setData(dataString); parse.parseIsoMessage(); } private static void logISOMsg(ISOMsg msg) { System.out.println("----ISO MESSAGE to Pack-----"); try { System.out.println(" MTI : " + msg.getMTI()); for (int i = 1; i <= msg.getMaxField(); i++) { if (msg.hasField(i)) { System.out.println(" Field-" + i + " : " + msg.getString(i)); } } } catch (ISOException e) { e.printStackTrace(); } finally { System.out.println("--------------------"); } } } ------------------------------------------- //ParseISOMessage.java package dmodi; import java.io.IOException; import org.jpos.iso.ISOException; import org.jpos.iso.ISOMsg; import org.jpos.iso.packager.GenericPackager; public class ParseISOMessage { String data=""; public void parseIsoMessage() throws IOException, ISOException { // Create Packager based on XML that contain DE type GenericPackager packager = new GenericPackager("basic.xml"); System.out.println("Data to unpack : " + data); // Create ISO Message ISOMsg isoMsg = new ISOMsg(); isoMsg.setPackager(packager); isoMsg.unpack(data.getBytes()); // print the DE list logISOMsg(isoMsg); } private static void logISOMsg(ISOMsg msg) { System.out.println("----Unpacked ISO MESSAGE-----"); try { System.out.println(" MTI : " + msg.getMTI()); for (int i = 1; i <= msg.getMaxField(); i++) { if (msg.hasField(i)) { System.out.println(" Field-" + i + " : " + msg.getString(i)); } } } catch (ISOException e) { e.printStackTrace(); } finally { System.out.println("--------------------"); } } public void setData(String strData){ data=strData; } } ------------------------------------------- //basic.xml <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE isopackager SYSTEM "genericpackager.dtd"> <isopackager> <isofield id="0" length="4" name="MESSAGE TYPE INDICATOR" class="org.jpos.iso.IFA_NUMERIC"/> <isofield id="1" length="64" name="BIT MAP" class="org.jpos.iso.IFA_BITMAP"/> <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="7" length="10" name="TRANSMISSION DATE AND TIME" class="org.jpos.iso.IFA_NUMERIC"/> <isofield id="11" length="6" name="SYSTEM TRACE AUDIT NUMBER" class="org.jpos.iso.IFA_NUMERIC"/> <isofield id="32" length="6" name="Acquirer Id" class="org.jpos.iso.IFA_NUMERIC"/> <isofield id="44" length="25" name="ADITIONAL RESPONSE DATA" class="org.jpos.iso.IFA_LLCHAR"/> <isofield id="105" length="999" name="RESERVED ISO USE" class="org.jpos.iso.IFA_LLLCHAR"/> </isopackager> ------------------------------------------- //genericpackager.dtd <?xml version="1.0" encoding="UTF-8"?> <!ELEMENT isopackager (isofield+,isofieldpackager*)*> <!ATTLIST isopackager maxValidField CDATA #IMPLIED> <!ATTLIST isopackager bitmapField CDATA #IMPLIED> <!ATTLIST isopackager firstField CDATA #IMPLIED> <!ATTLIST isopackager emitBitmap (true|false) #IMPLIED> <!ATTLIST isopackager headerLength CDATA #IMPLIED> <!-- isofield --> <!ELEMENT isofield (#PCDATA)> <!ATTLIST isofield id CDATA #REQUIRED> <!ATTLIST isofield length CDATA #REQUIRED> <!ATTLIST isofield name CDATA #REQUIRED> <!ATTLIST isofield class NMTOKEN #REQUIRED> <!ATTLIST isofield token CDATA #IMPLIED> <!ATTLIST isofield pad (true|false) #IMPLIED> <!-- isofieldpackager --> <!ELEMENT isofieldpackager (isofield+,isofieldpackager*)*> <!ATTLIST isofieldpackager id CDATA #REQUIRED> <!ATTLIST isofieldpackager name CDATA #REQUIRED> <!ATTLIST isofieldpackager length CDATA #REQUIRED> <!ATTLIST isofieldpackager class NMTOKEN #REQUIRED> <!ATTLIST isofieldpackager token CDATA #IMPLIED> <!ATTLIST isofieldpackager pad (true|false) #IMPLIED> <!ATTLIST isofieldpackager packager NMTOKEN #REQUIRED> <!ATTLIST isofieldpackager emitBitmap (true|false) #IMPLIED> <!ATTLIST isofieldpackager maxValidField CDATA #IMPLIED> <!ATTLIST isofieldpackager bitmapField CDATA #IMPLIED> <!ATTLIST isofieldpackager firstField CDATA #IMPLIED> <!ATTLIST isofieldpackager headerLength CDATA #IMPLIED> ------------------------------------------- Output: ----ISO MESSAGE to Pack----- MTI : 0200 Field-3 : 201234 Field-4 : 10000 Field-7 : 110722180 Field-11 : 123456 Field-32 : 100005 Field-44 : A5DFGR Field-105 : ABCDEFGHIJ 1234567890 -------------------- Packed ISO Message : 0200B2200001001000000000000000800000201234000000010000011072218012345610000506A5DFGR021ABCDEFGHIJ 1234567890 Data to unpack : 0200B2200001001000000000000000800000201234000000010000011072218012345610000506A5DFGR021ABCDEFGHIJ 1234567890 ----Unpacked ISO MESSAGE----- MTI : 0200 Field-3 : 201234 Field-4 : 000000010000 Field-7 : 0110722180 Field-11 : 123456 Field-32 : 100005 Field-44 : A5DFGR Field-105 : ABCDEFGHIJ 1234567890 -------------------- -----------------------------------END--------------------------------

Monday, April 23, 2012

Dealing with ISOMsg and JPOS in Java

Dear reader,
This article is solely for my reference. If it is not useful too, please don't comment.

//Complete method for Credit using JPos connector
public TransactionResult credit() {
    TransactionResult tr = null;
    QMUX qmx = null;
    ISOMsg reqMsg = null;
    reqMsg = createCreditMsg(SystemInfo, PaymentRequest, "NPCI");
    String muxName = "mux.npci-mux";
    if (muxName == null)
        throw new ProcessingException("Unable to obtain QMUX name");
    qmx = (QMUX) NameRegistrar.get(muxName);
    int timeOut = 30000;
    
    respMsg = (OboISOMsg) qmx.request(reqMsg, timeOut);  //OboISOMsg extends IsoMsg, see below

    //Checking for Timeout
    if (respMsg == null || "91".equalsIgnoreCase(respMsg.getString(39))) {   //"00" means successful response
        System.out.println("Request Timed Out! Sending the verification message");
        ISOMsg verfMsg = (ISOMsg) reqMsg.clone();
        NPCIUserData srcUserData = (NPCIUserData) paymReq.getTransUnit().getUserData();
        NPCIUserData tgtUserData = (NPCIUserData) paymReq.getTransUnit().getMemberData();
        try {
            verfMsg.set(120,"Deepak8801001"); //name+nbin+mas; Take data from srcUserData and tgtUserData
            int retryCount = count++;
            for (int i = 0; i < 3; i++) {  //3 times re-sending.
                verfMsg.set(11, "111222");  //STAN: 6 digits
                int verifyReqTimeOut = 2000;
                respMsg = (OboISOMsg) qmx.request(verfMsg, verifyReqTimeOut);
                if (respMsg != null    && !"91".equalsIgnoreCase(respMsg.getString(39)))
                    break;
            }
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }
    
    //Checking for proper response
    if(respMsg != null && respMsg.msgProcessingOK) {  //Means response is proper
        tr = processCreditResponse(respMsg, paymReq.getTransUnit().getUserData().getDeviceNumber(), reqMsg); 
    }
    //Means a failed response
    else {
        tr = new TransactionResult();
        tr.setStatus("FAILED");
        ProcessorResult pResult = new ProcessorResult();
        if (reqMsg != null) {
            pResult.set("DE11", reqMsg.getString(11));
            pResult.set("DE37", reqMsg.getString(37));
        }
        tr.setProcessorrResult(pResult);
    }
 return tr;
}

public TransactionResult processCreditResponse(ISOMsg respMsg,
            String devNbr, ISOMsg reqMsg) throws InvalidParameterException,
            MethodNotSupportedException, ProcessingException {
        TransactionResult tr = (TransactionResult) processDefaultResponse(
                new TransactionResult(), respMsg, devNbr, reqMsg);
        return tr;
}

protected ProcessorResponse processDefaultResponse(
            ProcessorResponse pr, ISOMsg respMsg, String dn, ISOMsg reqMsg) {
        pr.setDeviceNumber(dn);
        pr.setMappedAccountNumber(respMsg.getString(2));
        pr.setReturnCode(respMsg.getString(39));
        pr.setStatus(("00".equals(respMsg.getString(39)) ? "SUCCESS": "FAILED"));
        if (respMsg.hasField(38))
            pr.setExternalTransactionRef(respMsg.getString(38));

        ProcessorResult procRes = new ProcessorResult();
        procRes.set("DE3", respMsg.getString(3)); // processing cd
        procRes.set("DE7", respMsg.getString(7)); // transm dt
        procRes.set("DE11", respMsg.getString(11)); // trc nbr
        procRes.set("DE12", respMsg.getString(12)); // tx time
        procRes.set("DE13", respMsg.getString(13)); // tx date
        procRes.set("DE37", respMsg.getString(37)); // retrvl ref nbr
        procRes.set("DE39", respMsg.getString(39)); // response cd
        if (respMsg.hasField(120)) {
            String beneName = getBeneficiaryName(respMsg);
            if (beneName != null)
                procRes.set("BENEFICIARY", beneName); // beneficiary Name
        }
        pr.setProcessorrResult(procRes);
        return pr;
}


public class OboISOMsg extends ISOMsg {
    private byte[] rawMsg = null;
    public boolean msgProcessingOK = true;
    private Exception processingErr = null;
    private Long dbID = null;
    public boolean msgIsUnhandled = false;
    private long processingTime = 0L;
}

public class ProcessorPaymentRequest extends ProcessorRequest {    
    private Amount amount;
    private String memoText;
    private String transactionType;
    private String firstName    =    null;
    private String lastName        =    null;
    private String middleName    =    null;
    private String cardType        =    null;
    //setter and getter
}

public class PaymentRequest  extends ProcessorPaymentRequest {    
    private TransactionUnit transUnit;
    private String memo;
    //setter and getter
}
public class TransactionUnit extends EWPBusinessObject{
    public static final String kNullStr    =    "{NULL}";
    private UserData userData;
    private UserData memberData;
    private String status;
    private Amount fee;
    private String externalRefId;    
    private String processrCode;
    //setter and getter
}    

public class SystemInfo implements Serializable{
    private static final String kUnknown    =    "unknown";    
    private String systemCode    = kUnknown;
    private String serverIP        = kUnknown;    
    private String callerIP        = kUnknown;
    //setter and getter
}    
    
<void method="put"> 
     <string>jPOS_MUX_NAME</string> 
     <string>mux.npci-mux</string> 
</void> 


public ISOMsg createCreditMsg(SystemInfo sysInf, PaymentRequest paymReq, String fi) throws Exception {
        ISOMsg msg = new ISOMsg("0200");
        NPCIUserData srcUserData = (NPCIUserData) paymReq.getTransUnit().getUserData();
        NPCIUserData tgtUserData = (NPCIUserData) paymReq.getTransUnit().getMemberData();
        try {
            msg.set(2, tgtUserData.getNBin() + "00" + "1" + "00"+ tgtUserData.getDeviceNumber());
            msg.set(3, NPCIConstants.DE3_PROCESSING_CODE);  //900000
            msg.set(4, ISOUtil.padleft(amount, 12, '0'));   //amount can be replaced by 
                                                            //ISOCurrency.convertToIsoMsg("12500")
            msg.set(7, ISODate.getDateTime(new Date()));
            msg.set(11, "111222");  //STAN: 6 digits
            msg.set(12, ISODate.getTime(new Date()));
            msg.set(13, ISODate.getDate(new Date()));
            msg.set(18, NPCIConstants.DE18_MCC); //4814
            msg.set(22, NPCIConstants.DE22_POS_ENTRY_MODE); //019
            msg.set(25, NPCIConstants.DE25_POS_CONDITION_CODE); //05
            msg.set(32, NPCIConstants.DE32_AcquirerId); //100035
            msg.set(37, getISO8583P037RtrRefNbr(msg));  //Reference number, check method 
                                                        //getISO8583P037RtrRefNbr() given below.            
            msg.set(41, NPCIConstants.DE41_Tid    + srcUserData.getDeviceNumber().substring(5, 10););    
            
            msg.set(42, ISOUtil.strpad(NPCIConstants.DE42_Mid) + srcUserData.getDeviceNumber(), 15);
            msg.set(49, NPCIConstants.DE49_CurrencyCode); //356: for Indian rupees
            msg.set(120, "Deepak8801001"); //name+nbin+mas
        } catch (ISOException e) {
            e.printStackTrace();
        }
        return msg;
}

protected String getISO8583P037RtrRefNbr(ISOMsg req) {
        String rrn = null;
        Date d = new Date();
        String jd = ISODate.getJulianDate(d); // YDDD
        SimpleDateFormat sd = new SimpleDateFormat("HH");
        String hh = sd.format(d); // HH
        rrn = jd + hh + req.getString(11);
        return rrn;
}
    
public class UserData {        
    private String deviceNumber;
    private String accountNumber;
    private Long accountId;
    private String mappedAccountNumber;
    private String mappedRoutingNumber;
    private String validationPIN;
    private String mappedAccountExpiry;
    private String firstName;
    private String lastName;
    private String middleName;
    private String prepaidCardStatus;
    private AddressTO userAddress;
    private String bank_ICA; ///For Master Card Money Send
    private String cardType;
    private String mappedACType;
    private UserLocale userLocale;
    //setter and getter
}    
public class NPCIUserData extends UserData {    
    private String mas;
    private String NBin;
    //setter and getter
}
----------------------------------END---------------------------------------

Tuesday, April 10, 2012

ISO-8583 Standard in Java for Financial Transactions

Dear Reader,

I am writing about "ISO-8583 Standard" which is used in financial transactions that I learnt
while writing code and monitoring these banking/financial transactions.

A Financial transaction is a communication between 2 Systems through socket connection. Of course
this connection is maintained by network team. Once connection is established, each system (Sender and Recipient)
can send messages in ISO-8583 format which is common for request and response. However there are attributes which
differentiates a message into Request and Response.

From our experience the communication starts with Sign-on and then Echo messages and then financial transaction 
starts. Also periodically an echo message is sent to make sure the other system is still alive.

So following steps are involved in Transaction Flow:
    1. System A open connection to System B (through specific IP and Port).
    2. Connection established.
    3. System A send Sign-On request message.
    4. System B send Sign-on response message.
    5. System A will start sending Echo request message periodically (e.g. every 2 minute).
    6. System B will send Echo response message whenever receive Echo request message.
    7. When financial transaction happen, System A will send Transaction request message.
    8. Then System B will send Transaction response message.
    9. If something wrong happens (usually Timeout, so System A didn’t get the response), System A 
       will send Reversal request message to cancel the previous transaction.
    10. System B will send Reversal response message based on previous transaction.

I hope the flow is clear now. Next the question is how is this ISO-8583 message looks like.
An ISO-8583 message is made of the following parts:
   a. Message Type Indicator (MTI).
   b. One or more bitmaps, indicating which data elements are present.
   c. Data Elements, the fields of the message.

   
Message Type Indicator or MTI is 4 digits numeric that describe the message type. Commonly used are:
    - 02xx : Financial Message (e.g 0200 for request, 0210 for response)
    - 04xx : Reversal Message (e.g 0400 for request, 0410 for response)
    - 08xx : Network Management Message (e.g 0800 for request, 0810 for response)
    
    

    This 4 digit numeric field classifies the high level function of the message. A message type indicator 
    includes the ISO 8583 version, the Message Class, the Message Function and the Message Origin. 
    The following example (MTI 0110) lists what each digit indicates:    
        0xxx -> version of ISO 8583 (1987 version: 0-1987, 1-1993, 2-2003, 9-Private Usage).
        x1xx -> class of the Message (Authorization Message: 1-Authorization Message, 2-Financial Message, 
                4-Reversal Message)
                
        xx1x -> function of the Message (Request Response: 0-Request, 1-Request Response, 2-Advice, 
                4-Notification, 8-Response Acknowledgement).
        xxx0 -> who began the communication (Acquirer: 0-Acquirer, 1-Acquirer Repeat, 2-Issuer, 3-Issuer Repeat).

Complete example is below on the above pattern:
0200-     (Meaning: Acquirer Financial Request), Value: Request for funds, typically from an ATM or NPCI.
0210-     (Meaning: Issuer Response to Financial Request), Value:    Issuer response to request for funds.
More details can be checked at Wikipedia: http://en.wikipedia.org/wiki/ISO_8583

Bitmaps: 
Within ISO-8583, a bitmap is a field or subfield within a message which indicates which other data elements 
or data element subfields are present in a message. A message will contain at least one bitmap, 
called the Primary Bitmap which indicates which of Data Elements 1 to 64 are present. A secondary bitmap may 
also be present, generally as data element one and indicates which of data elements 65 to 128 are present. 
Similarly, a tertiary, but these are rarely used. In most of the messages Primary bitmap is enough.

The bitmap may be transmitted as 8 bytes of binary data, or as 16 hexadecimal characters 0-9, A-F. A field is 
present only when the specific bit in the bitmap is true. For example, 
byte '82x is binary '1000 0010' which means fields 1 and 7 are present in the message and fields 2, 3, 4, 5, 6, 
and 8 are not present. More details can be checked at Wikipedia: http://en.wikipedia.org/wiki/ISO_8583

Data Elements:
 Data Elements are the essence of the whole ISO message, which contains information about the transaction 
 (transaction type, amount, customer id, etc). 
 Data elements are the individual fields carrying the transaction information. There are up to 128 data 
 elements specified in the original ISO 8583:1987 standard, and up to 192 data elements in later releases.
 The 1993 revision added new definitions, deleted some, while leaving the message format itself unchanged. 
 Each data element have their own format, attribute and length. Each data element number also have standard 
 purpose, for example DE #4 is transaction amount.
 
 I am explaining below based on the example above. Check Wikipedia link given above again for full list.
 Each data element is designed to have a fixed set of either numeric, alpha numeric or variable character
 sets. These are called data type for each data element. Below are few abbreviations and meanings:

 a         Alpha, including blanks
 n         Numeric values only
 s         Special characters only
 an     Alphanumeric
 as     Alpha & special characters only
 ns     Numeric and special characters only
 ans     Alphabetic, numeric and special characters.
 b         Binary data
 z         Tracks 2 and 3 code set as defined in ISO/IEC 7813 and ISO/IEC 4909 respectively
 . or .. or ...     variable field length indicator, each . indicating a digit.
 x or xx or xxx     fixed length of field or maximum length in the case of variable length fields.

So, 
 DE6     n 12     Amount, cardholder billing with fixed 12 digits.
 DE7     n 10     Transmission date & time with fixed 10 digits.
 DE32     n ..11     Acquiring institution identification code with variable length. In our system: 100035.
 DE39     an 2     Response code, In our system: 00-Success, any other-Failure.
 
Now Few Data Elements name and details are given below: 
 DE32 = AcquirerId;
 DE41 = TID;
 DE42 = MID;
 DE49 = 356;
 DE3 = Processing code;
 DE4 = Transaction amount;
 DE7 – Transmission date & time (10 digits);
 DE11 – Systems trace audit number (STAN- 6 digits);
 DE44 – Additional response data;
 DE105 – Reserved for ISO use;

To make it practical let’s use an example. We want to send:
    DE3 : 201234
    DE4 : 10000
    DE7 : 1107221830
    DE11 : 123456
    DE44 : A5DFGR
    DE32 : 100035
    DE105 : ABCDEFGHIJ 1234567890

So now you will have a large bit pattern holding these values, that I don't want to display this.
By the way there is an open source Tool/Jar called JPOS Library which does this conversion. So we 
just use that Jar and set these attributes based on Data elements position in Code. 

Next I will write article about implementing ISO-8583 using JPOS library.

-----------------------------END-----------------------------