Friday, 3 October 2014

Pengenalan jPOS

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:

<?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>
view raw iso93ascii.xml hosted with ❤ by GitHub


Selain menggunakan file xml, packager juga dapat dikonfigurasikan melalui file java dengan ketentuan kita harus meng-extends class ISOBasePackager seperti dibawah ini :

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 :

// Untuk packager bertipe xml
ISOPackager packager = new GenericPackager("packager/iso93ascii.xml");
// Untuk packager bertipe class
ISOPackager packager = new CustomPackager();
view raw gistfile1.java hosted with ❤ by GitHub


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 NameDescriptionURL
AmexChannelImplementasi ISOChannel untuk American Expressdetail
ASCIIChannelISOChannel yang menggunakan 4 ASCII karakter header sebagai penanda panjang messagedetail
Base24ChannelImplements an ISOChannel capable to exchange messages with ACI’s BASE24[tm] over an X.25 link.detail
BASE24TCPChannelImplements an ISOChannel able to exchange messages with ACI’s BASE24 over a TCP link.detail
BCDChannelTalks with TCP based NCCs Sends [LEN][TPDU][ISOMSG] (len=2 bytes HEX).detail
ChannelPool-detail
CSChannelISOChannel implementation – CS standard Channel.detail
FSDChannel-detail
GZIPChannelISOChannel implementation.detail
HEXChannelSends a four ASCII hex characters indicating message length (up to 0xffff).detail
LogChannelExtracts blocks from standard jPOS log.detail
LoopbackChannel-detail
NACChannelTalks with TCP based NACs Sends [LEN][TPDU][ISOMSG] (len=2 bytes network byte order).detail
NCCChannelTalks with TCP based NCCs Sends [LEN][TPDU][ISOMSG] (len=2 bytes BCD).detail
PADChannelImplements an ISOChannel suitable to be used to connect to an X.25 PAD.detail
PostChannelISOChannel implementation – Postilion Channel Send packet len (2 bytes network byte order MSB/LSB) followed by raw data.detail
RawChannelISOChannel implementation – RAW Channel Send packet len (4 bytes network byte order) followed by raw data.detail
RBPChannelImplements Record Boundary Preservation protocol.detail
TelnetXMLChannelImplements 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
VAPChannelISOChannel implementation – VISA’s VAP framing.detail
X25ChannelImplements an ISOChannel suitable to be used to connect to an X.25 PAD.detail
XMLChannelImplements 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 :

...
ASCIIChannel channel = new ASCIIChannel(hostname, portNumber, packager);
...
view raw gistfile1.java hosted with ❤ by GitHub


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 :

ISOMUX isoMux = new ISOMUX(channel) {
@Override
protected String getKey(ISOMsg m) throws ISOException {
return super.getKey(m);
}
};
// jalankan ISOMUXnya
new Thread(isoMux).start();
view raw gistfile1.java hosted with ❤ by GitHub


Sedangkan cara untuk menggunakan class ISOServer adalah sebagai berikut :

ISOServer server = new ISOServer(portNumber, channel, null);
new Thread(server).start();
view raw gistfile1.java hosted with ❤ by GitHub


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 :

// 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");
view raw gistfile1.java hosted with ❤ by GitHub


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 :

ISORequest req = new ISORequest(networkReq);
isoMux.queue(req);
view raw gistfile1.java hosted with ❤ by GitHub

Dan untuk mendapat respon dari server, kita bisa menggunakan method getResponse(Integer TIMEOUT) dari class ISORequest seperti kode dibawah ini :

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()) + "]");
}
view raw gistfile1.java hosted with ❤ by GitHub

Sampai disini pembahasan tentang apa itu jPOS sudah bisa dikatakan selesai :) Nah sekarang bagaimanakah implementasi menggunakan jPOS ? Mari kita lihat pada bab selanjut-nya :)


3 comments:

  1. sangat membantu banget.. tks sharingnya

    ReplyDelete
  2. Kursus jPos dimana ya ??? penasaran saya

    ReplyDelete
    Replies
    1. Bisa coba ke artivisi.com pak klo pingin tahu lebih detail :)

      Delete