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"/>
Showing posts with label JPOS. Show all posts
Showing posts with label JPOS. Show all posts
Wednesday, June 20, 2018
ISO 8583 Message Fields
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-----------------------------
Subscribe to:
Posts (Atom)
