Pada bab-bab awal implementasi, kita menggunakan class ServerSocket dan Socket dimana untuk melakukan parsing harus kita lakukan secara manual satu-persatu. Beruntunglah kita sebagai programmer Java
, karena di bahasa pemrograman Java terdapat 1 library yang cukup bagus yaitu jPOS. Meskipun library jPOS ini opensource, tapi untuk dokumentasi-nya (jPOS Programmer’s Guide) kita diharuskan membeli sebesar $ 50 saja (sebuah harga yang tidak terlalu mahal bukan ?)
Sedangkan untuk source code jPOS sendiri, bisa kita download menggunakan anonymous subversion pada alamathttps://jpos.svn.sourceforge.net/svnroot/jpos (untuk pengembangan menggunakan library jPOS, sangat dianjurkan untuk mendownload source code ini sebagai bahan referensi)


Apasih kelebihan dari library jPOS ini ? Yang jelas adalah, library ini memangkas semua proses manual yang harus kita lakukan ketika kita menggunakan Socket biasa. Selain itu, jPOS juga mendukung beberapa protokol-protokol yang biasa digunakan dalam implementasi ISO 8583. Untuk dapat menggunakan jpos ada beberapa hal dasar yang harus kita ketahui yaitu :
- ISOPackager
- ISOChannel
- ISOServer Dan ISOMUX
- ISOMsg
ISOPackager
Packager atau ISOPackager pada library library jPOS ini digunakan sebagai definisi panjang dan tipe data tiap-tiap Data Element yang akan digunakan dalam komunikasi. Ada banyak contoh packager yang dapat kita lihat dalam direktori jpos/dist/cfg/packager yang salah satu contoh-nya yaitu packager untuk iso93ascii.xml seperti dibawah ini:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |
<!DOCTYPE isopackager SYSTEM "genericpackager.dtd"> | |
<!-- packager/iso93ascii.xml --> | |
<!-- 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="8" | |
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="6" | |
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"/> | |
<isofield | |
id="48" | |
length="999" | |
name="Additional data - private" | |
class="org.jpos.iso.IFA_LLLCHAR"/> | |
<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> |
Selain menggunakan file xml, packager juga dapat dikonfigurasikan melalui file java dengan ketentuan kita harus meng-extends class ISOBasePackager seperti dibawah ini :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package id.web.martinusadyh.iso8583.jpos; | |
import org.jpos.iso.IFA_AMOUNT; | |
import org.jpos.iso.IFA_BINARY; | |
import org.jpos.iso.IFA_BITMAP; | |
import org.jpos.iso.IFA_LLCHAR; | |
import org.jpos.iso.IFA_LLLCHAR; | |
import org.jpos.iso.IFA_LLNUM; | |
import org.jpos.iso.IFA_NUMERIC; | |
import org.jpos.iso.IFB_BINARY; | |
import org.jpos.iso.IF_CHAR; | |
import org.jpos.iso.ISOBasePackager; | |
import org.jpos.iso.ISOFieldPackager; | |
/** | |
* | |
* @author Martinus Ady H <mrt.itnewbies@gmail.com> | |
*/ | |
public class CustomPackager extends ISOBasePackager { | |
public CustomPackager() { | |
setFieldPackager(new ISOFieldPackager[]{ | |
/*000*/new IFA_NUMERIC(4, "Message Type Indicator"), | |
/*001*/ new IFA_BITMAP(16, "BIT MAP"), | |
/*002*/ new IFA_LLNUM(19, "PAN - PRIMARY ACCOUNT NUMBER"), | |
/*003*/ new IFA_NUMERIC(6, "PROCESSING CODE"), | |
/*004*/ new IFA_NUMERIC(12, "AMOUNT, TRANSACTION"), | |
/*005*/ new IFA_NUMERIC(12, "AMOUNT, SETTLEMENT"), | |
/*006*/ new IFA_NUMERIC(12, "AMOUNT, CARDHOLDER BILLING"), | |
/*007*/ new IFA_NUMERIC(10, "TRANSMISSION DATE AND TIME"), | |
/*008*/ new IFA_NUMERIC(8, "AMOUNT, CARDHOLDER BILLING FEE"), | |
/*009*/ new IFA_NUMERIC(8, "CONVERSION RATE, SETTLEMENT"), | |
/*010*/ new IFA_NUMERIC(8, "CONVERSION RATE, CARDHOLDER BILLING"), | |
/*011*/ new IFA_NUMERIC(6, "SYSTEM TRACE AUDIT NUMBER"), | |
/*012*/ new IFA_NUMERIC(6, "TIME, LOCAL TRANSACTION"), | |
/*013*/ new IFA_NUMERIC(4, "DATE, LOCAL TRANSACTION"), | |
/*014*/ new IFA_NUMERIC(4, "DATE, EXPIRATION"), | |
/*015*/ new IFA_NUMERIC(4, "DATE, SETTLEMENT"), | |
/*016*/ new IFA_NUMERIC(4, "DATE, CONVERSION"), | |
/*017*/ new IFA_NUMERIC(4, "DATE, CAPTURE"), | |
/*018*/ new IFA_NUMERIC(4, "MERCHANTS TYPE"), | |
/*019*/ new IFA_NUMERIC(3, "ACQUIRING INSTITUTION COUNTRY CODE"), | |
/*020*/ new IFA_NUMERIC(3, "PAN EXTENDED COUNTRY CODE"), | |
/*021*/ new IFA_NUMERIC(3, "FORWARDING INSTITUTION COUNTRY CODE"), | |
/*022*/ new IFA_NUMERIC(3, "POINT OF SERVICE ENTRY MODE"), | |
/*023*/ new IFA_NUMERIC(3, "CARD SEQUENCE NUMBER"), | |
/*024*/ new IFA_NUMERIC(3, "NETWORK INTERNATIONAL IDENTIFIEER"), | |
/*025*/ new IFA_NUMERIC(2, "POINT OF SERVICE CONDITION CODE"), | |
/*026*/ new IFA_NUMERIC(2, "POINT OF SERVICE PIN CAPTURE CODE"), | |
/*027*/ new IFA_NUMERIC(1, "AUTHORIZATION IDENTIFICATION RESP LEN"), | |
/*028*/ new IFA_AMOUNT(9, "AMOUNT, TRANSACTION FEE"), | |
/*029*/ new IFA_AMOUNT(9, "AMOUNT, SETTLEMENT FEE"), | |
/*030*/ new IFA_AMOUNT(9, "AMOUNT, TRANSACTION PROCESSING FEE"), | |
/*031*/ new IFA_AMOUNT(9, "AMOUNT, SETTLEMENT PROCESSING FEE"), | |
/*032*/ new IFA_LLNUM(11, "ACQUIRING INSTITUTION IDENT CODE"), | |
/*033*/ new IFA_LLNUM(11, "FORWARDING INSTITUTION IDENT CODE"), | |
/*034*/ new IFA_LLCHAR(28, "PAN EXTENDED"), | |
/*035*/ new IFA_LLNUM(37, "TRACK 2 DATA"), | |
/*036*/ new IFA_LLLCHAR(104, "TRACK 3 DATA"), | |
/*037*/ new IF_CHAR(12, "RETRIEVAL REFERENCE NUMBER"), | |
/*038*/ new IF_CHAR(6, "AUTHORIZATION IDENTIFICATION RESPONSE"), | |
/*039*/ new IF_CHAR(2, "RESPONSE CODE"), | |
/*040*/ new IF_CHAR(3, "SERVICE RESTRICTION CODE"), | |
/*041*/ new IF_CHAR(8, "CARD ACCEPTOR TERMINAL IDENTIFICACION"), | |
/*042*/ new IF_CHAR(15, "CARD ACCEPTOR IDENTIFICATION CODE"), | |
/*043*/ new IF_CHAR(40, "CARD ACCEPTOR NAME/LOCATION"), | |
/*044*/ new IFA_LLCHAR(25, "ADITIONAL RESPONSE DATA"), | |
/*045*/ new IFA_LLCHAR(76, "TRACK 1 DATA"), | |
/*046*/ new IFA_LLLCHAR(999, "ADITIONAL DATA - ISO"), | |
/*047*/ new IFA_LLLCHAR(999, "ADITIONAL DATA - NATIONAL"), | |
/*048*/ new IFA_LLLCHAR(999, "ADITIONAL DATA - PRIVATE"), | |
/*049*/ new IF_CHAR(3, "CURRENCY CODE, TRANSACTION"), | |
/*050*/ new IF_CHAR(3, "CURRENCY CODE, SETTLEMENT"), | |
/*051*/ new IF_CHAR(3, "CURRENCY CODE, CARDHOLDER BILLING"), | |
/*052*/ new IFB_BINARY(8, "PIN DATA"), | |
/*053*/ new IFA_NUMERIC(16, "SECURITY RELATED CONTROL INFORMATION"), | |
/*054*/ new IFA_LLLCHAR(120, "ADDITIONAL AMOUNTS"), | |
/*055*/ new IFA_LLLCHAR(999, "RESERVED ISO"), | |
/*056*/ new IFA_LLLCHAR(999, "RESERVED ISO"), | |
/*057*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL"), | |
/*058*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL"), | |
/*059*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL"), | |
/*060*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE"), | |
/*061*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE"), | |
/*062*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE"), | |
/*063*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE"), | |
/*064*/ new IFA_BINARY(8, "MESSAGE AUTHENTICATION CODE FIELD"), | |
/*065*/ new IFA_BINARY(8, "BITMAP, EXTENDED"), | |
/*066*/ new IFA_NUMERIC(1, "SETTLEMENT CODE"), | |
/*067*/ new IFA_NUMERIC(2, "EXTENDED PAYMENT CODE"), | |
/*068*/ new IFA_NUMERIC(3, "RECEIVING INSTITUTION COUNTRY CODE"), | |
/*069*/ new IFA_NUMERIC(3, "SETTLEMENT INSTITUTION COUNTRY CODE"), | |
/*070*/ new IFA_NUMERIC(3, "NETWORK MANAGEMENT INFORMATION CODE"), | |
/*071*/ new IFA_NUMERIC(4, "MESSAGE NUMBER"), | |
/*072*/ new IFA_NUMERIC(4, "MESSAGE NUMBER LAST"), | |
/*073*/ new IFA_NUMERIC(6, "DATE ACTION"), | |
/*074*/ new IFA_NUMERIC(10, "CREDITS NUMBER"), | |
/*075*/ new IFA_NUMERIC(10, "CREDITS REVERSAL NUMBER"), | |
/*076*/ new IFA_NUMERIC(10, "DEBITS NUMBER"), | |
/*077*/ new IFA_NUMERIC(10, "DEBITS REVERSAL NUMBER"), | |
/*078*/ new IFA_NUMERIC(10, "TRANSFER NUMBER"), | |
/*079*/ new IFA_NUMERIC(10, "TRANSFER REVERSAL NUMBER"), | |
/*080*/ new IFA_NUMERIC(10, "INQUIRIES NUMBER"), | |
/*081*/ new IFA_NUMERIC(10, "AUTHORIZATION NUMBER"), | |
/*082*/ new IFA_NUMERIC(12, "CREDITS, PROCESSING FEE AMOUNT"), | |
/*083*/ new IFA_NUMERIC(12, "CREDITS, TRANSACTION FEE AMOUNT"), | |
/*084*/ new IFA_NUMERIC(12, "DEBITS, PROCESSING FEE AMOUNT"), | |
/*085*/ new IFA_NUMERIC(12, "DEBITS, TRANSACTION FEE AMOUNT"), | |
/*086*/ new IFA_NUMERIC(16, "CREDITS, AMOUNT"), | |
/*087*/ new IFA_NUMERIC(16, "CREDITS, REVERSAL AMOUNT"), | |
/*088*/ new IFA_NUMERIC(16, "DEBITS, AMOUNT"), | |
/*089*/ new IFA_NUMERIC(16, "DEBITS, REVERSAL AMOUNT"), | |
/*090*/ new IFA_NUMERIC(42, "ORIGINAL DATA ELEMENTS"), | |
/*091*/ new IF_CHAR(1, "FILE UPDATE CODE"), | |
/*092*/ new IF_CHAR(2, "FILE SECURITY CODE"), | |
/*093*/ new IF_CHAR(5, "RESPONSE INDICATOR"), | |
/*094*/ new IF_CHAR(7, "SERVICE INDICATOR"), | |
/*095*/ new IF_CHAR(42, "REPLACEMENT AMOUNTS"), | |
/*096*/ new IFA_BINARY(8, "MESSAGE SECURITY CODE"), | |
/*097*/ new IFA_AMOUNT(17, "AMOUNT, NET SETTLEMENT"), | |
/*098*/ new IF_CHAR(25, "PAYEE"), | |
/*099*/ new IFA_LLNUM(11, "SETTLEMENT INSTITUTION IDENT CODE"), | |
/*100*/ new IFA_LLNUM(11, "RECEIVING INSTITUTION IDENT CODE"), | |
/*101*/ new IFA_LLCHAR(17, "FILE NAME"), | |
/*102*/ new IFA_LLCHAR(28, "ACCOUNT IDENTIFICATION 1"), | |
/*103*/ new IFA_LLCHAR(28, "ACCOUNT IDENTIFICATION 2"), | |
/*104*/ new IFA_LLLCHAR(100, "TRANSACTION DESCRIPTION"), | |
/*105*/ new IFA_LLLCHAR(999, "RESERVED ISO USE"), | |
/*106*/ new IFA_LLLCHAR(999, "RESERVED ISO USE"), | |
/*107*/ new IFA_LLLCHAR(999, "RESERVED ISO USE"), | |
/*108*/ new IFA_LLLCHAR(999, "RESERVED ISO USE"), | |
/*109*/ new IFA_LLLCHAR(999, "RESERVED ISO USE"), | |
/*110*/ new IFA_LLLCHAR(999, "RESERVED ISO USE"), | |
/*111*/ new IFA_LLLCHAR(999, "RESERVED ISO USE"), | |
/*112*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL USE"), | |
/*113*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL USE"), | |
/*114*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL USE"), | |
/*115*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL USE"), | |
/*116*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL USE"), | |
/*117*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL USE"), | |
/*118*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL USE"), | |
/*119*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL USE"), | |
/*120*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE USE"), | |
/*121*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE USE"), | |
/*122*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE USE"), | |
/*123*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE USE"), | |
/*124*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE USE"), | |
/*125*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE USE"), | |
/*126*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE USE"), | |
/*127*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE USE"), | |
/*128*/ new IFA_LLLCHAR(999, "MAC 2") | |
}); | |
} | |
} |
Sedangkan cara penggunaan-nya adalah sebagai berikut :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Untuk packager bertipe xml | |
ISOPackager packager = new GenericPackager("packager/iso93ascii.xml"); | |
// Untuk packager bertipe class | |
ISOPackager packager = new CustomPackager(); |
Sampai disini sudah mengerti ? Jika sudah, mari kita masuk ke pembahasan ISOChannel 

ISOChannel
Class ISOChannel atau Channel pada library jPOS ini digunakan untuk membungkus detail implementasi dari protokol-protokol yang digunakan oleh setiap vendor. Selain itu ISOChannel ini juga digunakan untuk mengirimkan dan menerima object ISOMsg. Beberapa Channel yang telah didukung oleh library jPOS ini antara lain :
Channel Name | Description | URL |
---|---|---|
AmexChannel | Implementasi ISOChannel untuk American Express | detail |
ASCIIChannel | ISOChannel yang menggunakan 4 ASCII karakter header sebagai penanda panjang message | detail |
Base24Channel | Implements an ISOChannel capable to exchange messages with ACI’s BASE24[tm] over an X.25 link. | detail |
BASE24TCPChannel | Implements an ISOChannel able to exchange messages with ACI’s BASE24 over a TCP link. | detail |
BCDChannel | Talks with TCP based NCCs Sends [LEN][TPDU][ISOMSG] (len=2 bytes HEX). | detail |
ChannelPool | - | detail |
CSChannel | ISOChannel implementation – CS standard Channel. | detail |
FSDChannel | - | detail |
GZIPChannel | ISOChannel implementation. | detail |
HEXChannel | Sends a four ASCII hex characters indicating message length (up to 0xffff). | detail |
LogChannel | Extracts | detail |
LoopbackChannel | - | detail |
NACChannel | Talks with TCP based NACs Sends [LEN][TPDU][ISOMSG] (len=2 bytes network byte order). | detail |
NCCChannel | Talks with TCP based NCCs Sends [LEN][TPDU][ISOMSG] (len=2 bytes BCD). | detail |
PADChannel | Implements an ISOChannel suitable to be used to connect to an X.25 PAD. | detail |
PostChannel | ISOChannel implementation – Postilion Channel Send packet len (2 bytes network byte order MSB/LSB) followed by raw data. | detail |
RawChannel | ISOChannel implementation – RAW Channel Send packet len (4 bytes network byte order) followed by raw data. | detail |
RBPChannel | Implements Record Boundary Preservation protocol. | detail |
TelnetXMLChannel | Implements an ISOChannel able to exchange jPOS generated (or compliant) XML based ISO-8583 messages through a Telnet session the telnet commands are simply ignored. | detail |
VAPChannel | ISOChannel implementation – VISA’s VAP framing. | detail |
X25Channel | Implements an ISOChannel suitable to be used to connect to an X.25 PAD. | detail |
XMLChannel | Implements an ISOChannel able to exchange jPOS generated (or compliant) XML based ISO-8583 messages. | detail |
Channel atau ISOChannel disini mempunyai peran yang sangat penting sekali dalam proses tersambung atau tidak-nya antara vendor yang satu dengan yang lain dan biasanya implementasi tiap vendor berbeda-beda
Sedangkan pada library jPOS, penggunaan Channel ini sangat mudah seperti terlihat pada potongan kode dibawah ini :

This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
... | |
ASCIIChannel channel = new ASCIIChannel(hostname, portNumber, packager); | |
... |
ISOServer Dan ISOMUX
Jika pada implementasi sebelum-nya kita menggunakan class ServerSocket sebagai implementasi sebuah server dan class Socket sebagai implementasi sebuah client, pada library jPOS kita dapat menggunakan class ISOServer sebagai implementasi Server-nya dan class ISOMUX sebagai implementasi client-nya. Agar message yang kita kirimkan ke server tidak tertukar dengan message yang lain, maka ketika kita melakukan inisialisasi pada ISOMUX overridelah method
getKey(ISOMsg isoMsg)
seperti contoh dibawah ini :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
ISOMUX isoMux = new ISOMUX(channel) { | |
@Override | |
protected String getKey(ISOMsg m) throws ISOException { | |
return super.getKey(m); | |
} | |
}; | |
// jalankan ISOMUXnya | |
new Thread(isoMux).start(); |
Sedangkan cara untuk menggunakan class ISOServer adalah sebagai berikut :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
ISOServer server = new ISOServer(portNumber, channel, null); | |
new Thread(server).start(); |
ISOMsg
Class ISOMsg pada library jPOS ini adalah merupakan inti dari message yang akan kita kirim dan kita terima. Dibandingkan dengan cara manual yang telah kita lakukan pada tahap implementasi di bab sebelum-nya, untuk mengisi nilai pada data element tertentu pada class ISOMsg dapat kita lakukan secara langsung dengan cara seperti dibawah ini :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// bikin network request | |
ISOMsg networkReq = new ISOMsg(); | |
networkReq.setMTI("1800"); | |
networkReq.set(3, "123456"); | |
networkReq.set(7, new SimpleDateFormat("yyyyMMdd").format(new Date())); | |
networkReq.set(11, "000001"); | |
networkReq.set(12, new SimpleDateFormat("HHmmss").format(new Date())); | |
networkReq.set(13, new SimpleDateFormat("MMdd").format(new Date())); | |
networkReq.set(48, "Tutorial ISO 8583 Dengan Java"); | |
networkReq.set(70, "001"); |
Sedangkan untuk mengirimkan-nya pada sebuah server, kita dapat membungkus ISOMsg kedalam object ISORequest dan mengirimkan object ISORequest tersebut ke method
queue(ISORequest isoRequest)
pada class ISOMUX seperti contoh dibawah ini :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
ISORequest req = new ISORequest(networkReq); | |
isoMux.queue(req); |
Dan untuk mendapat respon dari server, kita bisa menggunakan method
getResponse(Integer TIMEOUT)
dari class ISORequest seperti kode dibawah ini :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
ISOMsg reply = req.getResponse(50*1000); | |
if (reply != null) { | |
System.out.println("Req ["+new String(networkReq.pack()) + "]"); | |
System.out.println("Res ["+new String(reply.pack()) + "]"); | |
} |
Sampai disini pembahasan tentang apa itu jPOS sudah bisa dikatakan selesai
Nah sekarang bagaimanakah implementasi menggunakan jPOS ? Mari kita lihat pada bab selanjut-nya 


sangat membantu banget.. tks sharingnya
ReplyDeleteKursus jPos dimana ya ??? penasaran saya
ReplyDeleteBisa coba ke artivisi.com pak klo pingin tahu lebih detail :)
Delete