„EFER”,
TELEPÍTÉSI UTASÍTÁS
EFER PAYMENT GATEWAY
2013. június 25.
Dokumentum adatlap Projekt/modul megnevezése: Projekt/modul fantázia neve: Dokumentáció típusa: Verziószám: Oldalszám címlappal, adatlappal: Állapot: Kiadás kelte: Utolsó mentés kelte: Készítette: Fájlnév:
Payment Gateway EFER PAYMENT GATEWAY EFER PAYMENT GATEWAY Telepítési utasítás 1.1.1 dokumentum 40
Kapják:
Átadva 2013.01.24. 2013.06.25. IND EFER_EFER_GATEWAY_TU_2013.06.25.d oc KIFÜ, Getronics, Bankok
Ellenőrzések Név Lomniczi Rudolf
Dátum 2013.06.25.
Aláírás
Dátum 2013.06.25.
Aláírás
Jóváhagyás Név Muha Csaba
Módosítások Verzió V0.0.1 V0.0.2 V1.0.0 V1.1.0 V1.1.1
Dátum 2012.12.20. 2013.01.24. 2013.02.13. 2013.05.28 2013.06.25
Módosítás rövid leírása Első átadott verzió Példaprogram kiegészítés Telepítési leírás kiegészítése Konfigurációs beállítások kiegészítése Tanúsítványigénylés kiegészítése
2/40
TARTALOMJEGYZÉK EFER PAYMENT .............................................................................................. 1 GATEWAY ........................................................................................................ 1 TELEPÍTÉSI UTASÍTÁS .................................................................................. 5 1
Bevezetés ................................................................................................. 5 1.1 1.2 1.3
2
Dokumentum ..................................................................................................................... 5 Dokumentum hatóköre ...................................................................................................... 5 Hivatkozott dokumentumok ............................................................................................... 5
Jelölések................................................................................................... 5 2.1
Változók ............................................................................................................................ 5
3 A telepítőcsomag telepítéséhez szükséges környezet összeállítása .................................................................................................... 6 3.1 Hardver és szoftver követelmények................................................................................... 6 3.2 A telepítéshez szükséges szoftverkörnyezet telepítése és konfigurálása .......................... 6 3.2.1 Java Platform Standard Edition (Java SE) JDK 6 Update 14 ........................................ 6 3.2.2 Apache Ant ................................................................................................................... 6 3.2.3 GlassFish Application Server ........................................................................................ 7
4
A telepítőcsomag telepítése ................................................................... 7 4.1 Build másolása .................................................................................................................. 7 4.2 Környezetfüggő paraméterek beállítása ............................................................................ 8 4.3 Védelmi mechanizmusok konfigurációja ............................................................................ 9 4.3.1 Tanúsítványok igénylése ............................................................................................ 10 4.3.1.1 Jelszómódosítás ............................................................................................... 10 4.3.1.2 Tanúsítvány kérések előállítása ........................................................................ 10 4.3.2 Aláírt tanúsítványok beállítása .................................................................................... 11 4.3.3 SSL kliens tanúsítvány beállítása ............................................................................... 13 4.3.4 SSL szerver tanúsítvány beállítása ............................................................................. 13 4.4 Telepítés ......................................................................................................................... 14 4.5 EFER Payment Gateway Client alkalmazás telepítése.................................................... 15
5
EFER GATEWAY CLIENT ..................................................................... 17 5.1 Implementált szolgáltatások ............................................................................................ 17 5.1.1 Fizetendő tételek listája .............................................................................................. 18 5.1.1.1 Példa program: ................................................................................................. 18 5.1.1.2 Kérés adatkör: .................................................................................................. 19 5.1.1.3 Válasz adatkör: ................................................................................................. 20 5.1.2 EFER tétel Referencia és Státusz megadása ............................................................. 23
3/40
5.1.2.1 Példa program: ................................................................................................. 23 5.1.2.2 Kérés adatkör: .................................................................................................. 24 5.1.2.3 Válasz adatkör: ................................................................................................. 25 5.1.3 Fizetési ígérvény fogadása az FMSZ-ek felől ............................................................. 26 5.1.3.1 Példa program: ................................................................................................. 26 5.1.3.2 Kérés adatkör: .................................................................................................. 27 5.1.3.3 Válasz adatkör: ................................................................................................. 28 5.1.4 EFER tétel státuszának lekérdezése .......................................................................... 29 5.1.4.1 Példa program: ................................................................................................. 29 5.1.4.2 Kérés adatkör: .................................................................................................. 30 5.1.4.3 Válasz adatkör: ................................................................................................. 30 5.1.5 Elutasított fizetési ígérvény fogadása az FMSZ-ek felől .............................................. 31 5.1.5.1 Példa program: ................................................................................................. 31 5.1.5.2 Kérés adatkör: .................................................................................................. 32 5.1.5.3 Válasz adatkör: ................................................................................................. 33 5.1.6 Fizető fél ellenőrzése .................................................................................................. 34 5.1.6.1 Példa program: ................................................................................................. 34 5.1.6.2 Kérés adatkör: .................................................................................................. 35 5.1.6.3 Válasz adatkör: ................................................................................................. 36 5.1.7 Riasztás banki háttérrendszer felé .............................................................................. 37 5.1.7.1 Példa program: ................................................................................................. 37 5.1.7.2 Kérés adatkör: .................................................................................................. 38 5.1.8 Kapcsolodó adatkörök ................................................................................................ 38
6
Projekt struktúra .................................................................................... 39 6.1 ind.efer.gateway .............................................................................................................. 39 6.1.1 efer.gateway-ejb ......................................................................................................... 39 6.1.2 efer.gateway-war ........................................................................................................ 39 6.1.3 lib................................................................................................................................ 39 6.1.4 sql............................................................................................................................... 40 6.2 ind.efer.gateway.client..................................................................................................... 40
7
Mellékletek .............................................................................................. 40 7.1 7.2 7.3 7.4
1. melléklet: Telepítőcsomag ........................................................................................... 40 2. melléklet: EFER KFM Üzemeltetési leírás ................................................................... 40 3. melléklet: EFER Telepítési utasítás ............................................................................. 40 4. melléklet: Banki Gateway specifikáció ......................................................................... 40
4/40
TELEPÍTÉSI UTASÍTÁS 1 BEVEZETÉS 1.1 Dokumentum A dokumentum az EFER Payment Gateway és elemeinek telepítési feltételeit és feladatait tartalmazza. A dokumentum alapján a modul első telepítését a Megrendelő el tudja végezni a Szállító felügyeletével és támogatásával. Továbbá a dokumentum tartalmazza a Gateway API hívások részletes leírását, példa alkalmazással és forráskóddal szemléltetve
1.2 Dokumentum hatóköre A modul verzióváltásának lépéseit jelen dokumentum nem tartalmazza, azt egyes telepítőcsomagok szállítólevelei tartalmazzák. A dokumentum az EFER PAYMENT GATEWAY, mint a KFM és az FMSZ fizetési megoldás szolgáltató interfésze közti üzenet továbbító JEE alkalmazással kapcsolatos tudnivalókat taglalja. Nem tartalmazza az EFER KFM modul interfész leírását, viszont az FMSZ-ek számára kiadott Java interfész leírását igen.
1.3 Hivatkozott dokumentumok Dokumentum EFER Üzemeltetési leírás EFER Telepítési leírás Banki Gateway specifikáció
Fájl EFER_UL_KFM_v0.2.8_20110426.doc EFER_TU_KFM_v0.4.11_20120612.doc EFER_GWfmsz_v1 3 0_20130131_rc.doc
Kiadás dátuma 20110426 20120612 20130131
2 JELÖLÉSEK A dokumentumban az alábbi tipográfiai jelöléseket alkalmazzuk: konfigurációs fájl, fájlrészlet, parancs, amit a Solaris shell-be kell írni
2.1 Változók A dokumentumban vannak konfigurációs elemek, melyek tulajdonságai a konkrét környezettől függenek. Ezekre a környezetfüggő elemekre a dokumentum változóként tekint, és ${változónév} formában hivatkozik rájuk. A változók az alábbiak: Név
Jelentés
GLASSFISH_HOME
A Glassfish alkalmazásszerver útvonala.
JAVA_HOME
A JDK telepítési könyvtára
5/40
3 A TELEPÍTŐCSOMAG TELEPÍTÉSÉHEZ SZÜKSÉGES KÖRNYEZET ÖSSZEÁLLÍTÁSA 3.1 Hardver és szoftver követelmények A telepítés fő feltételei a következők: Szervergép telepített Glassfish v3.1.2.2 (build 5) alkalmazásszerverrel (a Glassfish telepítés utáni állapotában, semmilyen Glassfish komponens frissítése nem szükséges) Oracle 11g adatbázis A szervergép és az adatbázis között legyen meg a kiépített megfelelő hálózati kapcsolat. A szállító által adott telepítőcsomag tartalmát át kell másolni az export/efer.payment.gateway nevű jegyzékbe. A telepítés további feltételei: Java Platform Standard Edition (Java SE) 6 JDK (update 14 vagy magasabb verziószámú javasolt)
3.2 A telepítéshez szükséges szoftverkörnyezet telepítése és konfigurálása 3.2.1 Java Platform Standard Edition (Java SE) JDK 6 Update 14 Telepítőcsomag: Az export/lib/JDK jegyzékben található, vagy a http://java.sun.com/products/archive/j2se/6u14/index.html oldalon a Java Development Kit (JDK) linkről tölthető le. A telepítő csomagot az operációs rendszernek megfelelően kell kiválasztani. Telepítési leírás: A http://java.sun.com/javase/6/webnotes/install/index.html oldalon található. Dokumentáció:A http://java.sun.com/javase/6/docs/api/ és http://java.sun.com/javase/6/docs/ oldalakon található. A JAVA_HOME változó jelöli az elérési útvonalat, ahova a termék telepítve lett.
3.2.2 Apache Ant Telepítőcsomag: Az export/lib/org.apache.ant-1.8.1 jegyzékben található, vagy a http://ant.apache.org/bindownload.cgi oldalról tölthető le.. A szükséges verzió: 1.8.1. Telepítési leírás: Az Ant telepítésének feltétele, hogy a Java Platform Standard Edition (Java SE) 6 JDK (update 14 vagy magasabb verziószámú javasolt) telepítve legyen az adott gépen, a csomagban lévő java és javac parancs elérhető legyen a PATH környezeti változó által, és a JAVA_HOME környezeti változó a telepített Java jegyzékét tartalmazza.
6/40
A telepítőcsomag tartalmát ki kell tömöríteni egy jegyzékbe. Jelölje a jegyzéket az ANT_HOME környzeti változó. Ezt követően biztosítani kell, hogy az ${ANT_HOME}/bin jegyzék szerepeljen a PATH környezeti változóban, és rendelkezésre álljon maga az ANT_HOME környzeti változó is. Amennyiben ez a két beállítás megtörtént, az ant parancs használható. Dokumentáció: A letöltött és kitömörített telepítőcsomag docs jegyzékében található.
3.2.3 GlassFish Application Server Telepítőcsomag: Az export/lib/Glassfish jegyzékben található, vagy a http://glassfish.java.net/downloads/3.1.2.2-final.html oldalról tölthető le. A telepítő csomagot az operációs rendszernek megfelelően kell kiválasztani. Telepítési leírás: A http://glassfish.java.net/downloads/3.1.2.2-final.html oldalon található. Dokumentáció: A http://glassfish.java.net/docs/ oldalon található. A GLASSFISH_HOME változó jelöli az elérési útvonalat, ahova a termék telepítve lett. A telepítés során be kell állítani a megfelelő Oracle JDBC drivert, ami a feltelepített Oracle alkalmazásban található a következő útvonalon: oracle/product/10.2.0/db_1/jdbc/lib/ojdbc14.jar. A példában megadott útvonal a 10.2.0-ás verziójú Oracleből van , a verzió függvényében változhat az útvonal. A terméket a fordításhoz elég csak feltelepíteni, elindítani sem kell, mert a fordítás során a benne lévő programozási könyvtárat lesznek felhasználva, semmilyen konfiguráció nem szükséges. A telepítés során szükséges futnia a terméknek.
4 A TELEPÍTŐCSOMAG TELEPÍTÉSE A telepítési folyamatot a Gateway-nek szánt, előző pontokban leírt, követelményeknek megfelelő szerver gépre kell telepíteni A szervergépen azzal a felhasználóval kell a telepítést elvégezni, aki a Glassfish-t is futtatja. Ez a fejezet az első telepítőcsomag telepítését tartalmazza. Általánosan elmondható, hogy minden további telepítőcsomag telepítése tipikusan ezeket a lépéseket tartalmazza, azonban a konkrét csomaghoz tartozó konkrét telepítési leírás magában a csomagban mindig megtalálható. Abban a leírásban lehetnek eltérések az itt leírtaktól.
4.1 Build másolása A szállító által adott telepítő csomag bináris fájljait az export/efer.payment.gateway jegyzék tartalmazza. Az export/efer. payment.gateway jegyzék teljes tartalmát az applikációs szervergépre kell másolni a /tmp jegyzékbe. A fenti másolásokat annak a felhasználónak a nevében kell végezni, aki nevében a Glassfish fut. A telepítési folyamat során biztosítani kell, hogy a /tmp jegyzék tartalma ne sérüljön vagy törlődjön.
7/40
4.2 Környezetfüggő paraméterek beállítása A telepítőcsomagban levő export/efer.payment.gateway/efer.gateway.properties fájlban az előre beállított értékeket újra le kell ellenőrizni. A következő értékek beállítására van szükség. efer.kfm.fmsz.wsdl.url=file:
/EFERFMSZService.wsdl efer.kfm.connectTimeout = 10000 efer.kfm.requestTimeout = 10000
Először meg kell határozni az EFER publikus címét (protokoll, IP, port). Ezeket az értékeket az EFER üzemeltetője adja (ld. http://kifu.gov.hu/letoltes/efer/efer_segedlet_csatlakozo_szervezet_kapcsolodasahoz.pdf). jelen dokumentum írásakor ezek aktuális értéke: https://84.206.27.51:8443
Az EFER GW banki infrastruktúrában való elhelyezkedésétől függően két eset lehetséges: 1. a GW-t futtató Glassfish példány(ok) közvetlenül elérik az EFER-t, 2. vagy a GW-t futtató Glassfish példány(ok) a bank által üzemeltetett hálózaton keresztül közvetetten érik el az EFER-t (pl. Apache webszerveren keresztül, proxy-zva, terminálva az SSL-t). A telepítés szempontjából kiemelten fontos, hogy melyik eset áll fenn. A dokumentum további részeiben, amikor 1. és 2. esetekre hivatkozunk, akkor azalatt a fenti eseteket értjük. Az 1. esetben az EFER publikus címét kell majd beállítani az EFER GW-ben. A 2. esetben az EFER bank oldali címét kell beállítani. Ez bankfüggő érték, ekkor biztosítania kell a banknak, hogy az EFER GW által látott belső banki címről a kérések továbbításra kerüljenek az EFER publikus címére. Az 1. eset megvalósítása javasolt. Ha előállt az EFER GW által látott EFER cím, akkor a hoszthoz fel kell venni egy bejegyzést az EFER GW-t futtattó gép „hosts” fájljába. Ez a fájl, a GW-t futtató szerver operációs rendszerétől függő helyen található, Unix alapú operációs rendszereknél a teljes útvonal:“/etc/hosts”. A KFM_HOME értéke minden esetben meg kell egyezzen az EFER külső nevével, ami az EFER tanúsítványában szerepel, jelen dokumentum írásakor ennek aktuális értéke: teszt.efer.gov.hu. Az 1. esetben a hosts fájlba az alábbi bejegyzést kell felvinni: 84.206.27.51 teszt.efer.gov.hu
A telepítőcsomagban levő export/efer.payment.gateway/EFERFMSZService.wsdl fájlban csak a Web Service endpointot kell modosítani. Az 1. esetben ennek értéke (a teljes cím): https://teszt.efer.gov.hu:8443/EFERFMSZService/EFERFMSZService
A fájlban a cím helye: <service name="EFERFMSZService"> <port name="EFERFMSZPort" binding="tns:EFERFMSZPortBinding"> <soap:address location= <protokoll>://:/EFERFMSZService/EFERFMSZService" />
8/40
Paraméterek módosítása után kötelező újraindítani az alkalmazásszervert. Név
Jelentés
GLASSFISH_HOME
A Glassfish alkalmazásszerver útvonala.
KFM_HOME
A KFM alkalmazásszerver domain neve.
KFM_PORT
A KFM alkalmazásszerver PORT száma
4.3 Védelmi mechanizmusok konfigurációja Az EFER használata során az alábbi, bankot is érintő védelmi mechanizmusokat kell használni: (1) Az EFER webszolgáltatása csak https protokoll fölött elérhető kölcsönös SSL azonosítással, amihez privát kulcs szükséges a bank oldalán. (2) A bank (GW) webszolgáltatásának csak https protokoll fölött kölcsönös SSL azonosítással kell elérhetőnek lennie az EFER számára, amihez az EFER a saját privát kulcsát használja (minden bank esetén ugyanaz). (3) Az EFER webszolgáltatása csak digitálisan aláírt kéréseket fogad, így ehhez a bank oldalán egy újabb privát kulcs szükséges. (4) A bank (GW) webszolgáltatásának csak digitálisan aláírt kéréseket kell fogadnia, amihez az EFER a saját privát kulcsát használja (minden bank esetén ugyanaz, de eltér az SSL azonosítás során használttól). A fenti esetekhez az alábbi tanúsítványokra van szükség: (a) EFER SSL szerver tanúsítvány: Az (1) pontban az EFER szerver tanúsítványa. (b) Bank SSL kliens tanúsítvány: Az (1) pontban a bank SSL kliens tanúsítványa, amivel azonosítja magát az EFER számára. (c) Bank SSL szerver tanúsítvány: A (2) pontban a bank szerver tanúsítványa. (d) EFER SSL kliens tanúsítvány: A (2) pontban az EFER SSL kliens tanúsítványa, amivel azonosítja magát a bank számára. (e) Bank aláíró tanúsítványa: A bank ezzel írja alá a SOAP üzeneteket, mielőtt beküldi őket az EFER-be. (f) EFER aláíró tanúsítványa: Az EFER ezzel írja alá a SOAP üzeneteket, mielőtt beküldi őket a bankba. Az (a), (d) és (f) tanúsítványok minden bank esetén azonosak, bankfüggetlenek. A (b), (c) és (e) tanúsítványok a bank tanúsítványai, ezek így bankfüggőek. Így a hozzájuk tartozó privát kulcsoknak a bank oldalán léteznie kell. Az alábbi feladatokra a keytool nevű eszköz használata ajánlott, ez a jre bin könyvtárában található.
9/40
4.3.1 Tanúsítványok igénylése Egy környezethez 3 tanúsítványt kell igényelnie a banknak. Tanúsíványonként egy-egy excel kitöltése és a vonatkozó tanúsítvány kérelem elküldése szükséges (ld. http://kifu.gov.hu/letoltes/efer/efer_segedlet_csatlakozo_szervezet_kapcsolodasahoz.pdf). A továbbiakban két kulcstárolóra van szükség, ezek az installált Glassfish alatt találhatók: glassfish3/glassfish/domains/<domain>/config/keystore.jks
A továbbiakban erre így hivatkozunk:
Továbbá: glassfish3/glassfish/domains/<domain>/config/cacerts.jks
A továbbiakban erre így hivatkozunk:
4.3.1.1 Jelszómódosítás Az alábbi lépésben módosíthatja a kulcstárolók jelszavát (a továbbiakban feltételezzük, hogy ha módosította, akkor mindkettőt módosította, ugyanarra az értékre), de nem kötelező (a jelszó bármikor módosítható a továbbiakban is, ha jelszómódosítás problémát okozna a Glassfish működésében). Az alapértelmezés szerinti jelszó changeit mindenhol a Glassfish kulcstárolókban. A továbbiakban így jelöljük a kulcstárolók (új) jelszavát:
Amennyiben nem változtatja meg a jelszót, akkor ez mindenhol changeit lesz. A jelszómódosítás parancsa: keytool -storepasswd -v -new -keystore -storepass changeit keytool -storepasswd -v -new -keystore -storepass changeit
A kulcstárolóban már van egy privát kulcsos tanúsítvány (s1as), amit a Glassfish alapértelmezés szerint használ az SSL-hez. Ha a tároló jelszava módosul, akkor ennek a jelszavát is módosítani kell. Glassfish alatt ugyanis a kulcstárolóban lévő minden egyes privát kulcs jelszavának meg kell egyeznie a kulcstároló jelszavával. keytool -keypasswd -v -alias s1as -keypass changeit -new -keystore -storepass
4.3.1.2 Tanúsítvány kérések előállítása Ezt követően létre kell hozni az egyes tanúsítvány kérelmeket. Minden kérelem során először készül egy privát kulcs, majd az alapján a tanúsítvány kérelem. A privát kulcs a kulcstárolóban marad, az a kérelemnek nem része. Amikor a kérelem aláírásra kerül, az
10/40
aláírt tanúsítványt majd importálni kell a kulcstárolóba. Ekkor épül össze a privát kulcs az aláírt tanúsítvánnyal. A privát kulcsok és tanúsítvány kérelmek előállítása: keytool -genkey -v -alias bank_ssl_client -keypass -keyalg RSA -keysize 2048 -keystore -storepass -dname "" validity 365 keytool -certreq -v -alias bank_ssl_client -file BANK_SSL_KLIENS_TANUSITVANY.csr keypass -keystore -storepass keytool -genkey -v -alias bank_ssl_server -keypass -keyalg RSA -keysize 2048 -keystore -storepass -dname "" validity 365 keytool -certreq -v -alias bank_ssl_server -file BANK_SSL_SZERVER_TANUSITVANY.csr -keypass -keystore -storepass keytool -genkey -v -alias bank_signer -keypass -keyalg RSA -keysize 2048 -keystore -storepass -dname "" validity 365 keytool -certreq -v -alias bank_signer -file BANK_ALAIRO_TANUSITVANY.csr -keypass -keystore -storepass
A , és nevekre nincs megkötés, csak annyi, hogy az „O” mezzo értéke kötelezően “BANK-HU” legyen. Pl.: CN=X Bank Zrt. SSL Kliens Tanusitvany, OU=BANK-HU, O=X, C=HU CN=X Bank Zrt. SSL Szerver Tanusitvany, OU=BANK-HU, O=X, C=HU CN=X Bank Zrt. Alairo Tanusitvany, OU=BANK-HU, O=X, C=HU
A validity napokban van megadva, így minden tanúsítvány egy évig lesz érvényes aláírás után. Ez az érték módosítható az EFER-hez való csatlakozás szabályainak megfelelően. A lejárat után a tanúsítványokat újra kell készíteni. A fenti parancsok eredményeképpen az alábbi fájlok állnak elő, ezek a tényleges kérelmek, amit a MÁK részére kell eljuttatni: BANK_SSL_KLIENS_TANUSITVANY.csr BANK_SSL_SZERVER_TANUSITVANY.csr BANK_ALAIRO_TANUSITVANY.csr
4.3.2 Aláírt tanúsítványok beállítása A MÁK-tól a 4.3 pontban jelölt tanúsítványok mindegyikét meg kell kapni az igénylés eredményeképpen (a fájlok kiterjesztése nem fontos, csak a tartalmuk). A tanúsítványokra a scriptekben az alábbi módon hivatkozunk bank_ssl_kliens bank_ssl_szerver bank_alairo efer_ssl_kliens
11/40
efer_ssl_szerver efer_alairo
A tanúsítványokba tanúsítvány láncok lehetnek csomagolva. Ez azt jelenti, hogy nemcsak maga a tanúsítvány található meg a fájlban, hanem a CA tanúsítványa is, amivel őt kiállították, és a CA aláíró CA-jának tanúsítványa is, ha van ilyen. Ilyen esetekben a teljes tanúsítvány láncban szereplő tanúsítványokat egyesével importálni kell az adott kulcstárolóba. A tanúsítványlánc elemeinek önálló tanúsítványokra bontása a Windows beépített tanúsítvány nézegető programjával lehetséges. Ez a crt és cer kiterjesztésű fájlokat tudja tanúsítványként megnyitni, ha nem ilyen kiterjesztésűek a tanúsítvány fájlok, akkor át kell őket nevezni. Tegyük fel, hogy az alábbi tanúsítványok állnak rendelkezésre a CA tanúsítványok kibontása után (a kiállító CA-t tanúsítványa tabolással láthatók a tanúsítványok alatt): bank_ssl_kliens.cer MAK_Teszt_eszkoz_CA.cer MAK_Teszt_Root_CA.cer bank_ssl_szerver.cer MAK_Teszt_eszkoz_CA.cer MAK_Teszt_Root_CA.cer bank_alairo.cer MAK_Teszt_eszkoz_CA.cer MAK_Teszt_Root_CA.cer efer_ssl_kliens.cer Netlock_class_b.cer Netlock_class_gold.cer efer_ssl_szerver.cer Netlock_class_b.cer Netlock_class_gold.cer efer_alairo.cer MAK_Teszt_alairo_CA.cer MAK_Teszt_Root_CA.cer
A tanúsítványokat az alábbi scriptekkel kell a Glassfish kulcstárolójaiba betenni: keytool -importcert -v -noprompt -alias MAK_Teszt_Root_CA -file MAK_Teszt_Root_CA.cer -keystore -storepass keytool -importcert -v -noprompt -alias MAK_Teszt_eszkoz_CA -file MAK_Teszt_eszkoz_CA.cer -keystore -storepass keytool -importcert -v -noprompt -alias bank_ssl_kliens -file bank_ssl_kliens.cer -keystore -storepass keytool -importcert -v -noprompt -alias bank_ssl_szerver -file bank_ssl_szerver.cer -keystore -storepass keytool -importcert -v -noprompt -alias bank_alairo -file bank_alairo.cer keystore -storepass keytool -importcert -v -noprompt -alias Netlock_class_gold -file Netlock_class_gold.cer -keystore -storepass keytool -importcert -v -noprompt -alias MAK_Teszt_Root_CA -file MAK_Teszt_Root_CA.cer -keystore -storepass
12/40
keytool -importcert -v -noprompt -alias Netlock_class_b -file Netlock_class_b.cer -keystore -storepass keytool -importcert -v -noprompt -alias MAK_Teszt_alairo_CA -file MAK_Teszt_alairo_CA.cer -keystore -storepass keytool -importcert -v -noprompt -alias efer_ssl_kliens -file efer_ssl_kliens.cer -keystore -storepass keytool -importcert -v -noprompt -alias efer_ssl_szerver -file efer_ssl_szerver.cer -keystore -storepass keytool -importcert -v -noprompt -alias efer_alairo -file efer_alairo.cer keystore -storepass
4.3.3 SSL kliens tanúsítvány beállítása Amennyiben az SSL-t a Glassfish terminálja, be kell állítani a Glassfish számára, hogy a https-es címekre kimenő SOAP kéréseknél az előző pontokban létrehozott és beimportált SSL kliens tanúsítványt használja:
4.3.4 SSL szerver tanúsítvány beállítása Amennyiben az SSL-t a Glassfish terminálja, be kell állítani a Glassfish számára, hogy a https-es interfészén az előző pontokban létrehozott és beimportált SSL szerver tanúsítványt használja. Ki kell keresni a Glassfish admin felületén azt a http listenert, amelynél be van kapcsolva az SSL és az alábbi beállításokat kell elvégezni:
13/40
4.3.5 SSL kliens és szerver tanúsítvány beállítása Glassfish-en kívül Amennyiben nem a Glassfish terminálja az SSL-t, abban az esetben ezeket a tanúsítványokat az illető komponensen (pl. Apache 2 webszerver) kell beállítani a meglévő banki infrastruktúrában. Elképzelhető olyan architektúra, ahol a Glassfish előtt egy webszerver helyezkedik el, ő terminálja az SSL-t, a Glassfish pedig http forgalmat fogad és http kéréseket küld az Apache felé, azt http proxy-ként használva. Ebben az esetben a webszerveren be kell állítani, hogy az előzőekben aláírt banki SSL szerver tanúsítványt mutassa kifelé, ill. az EFER felé menő kérések esetén a banki SSL kliens tanúsítványt használja az SSL handshake során.
4.4 Telepítés Név
Jelentés
DOMAIN_HOME
A Glassfish alkalmazásszerver domain elérése .
GATEWAY_HOME
A Glassfish alkalmazásszerver IP címe.
14/40
-
Az export/efer.payment.gateway/EFERFMSZService.wsdl fájlt be kell másolni a ${DOMAIN_HOME} jegyzékbe.Az export/efer.payment.gateway/efer.gateway.properties fájlt be kell másolni a ${DOMAIN_HOME} jegyzékbe.
-
Az efer.gateway.client alkalmazást buildelni kell, az ind.efer.gateway.client/ build.xml Ant file segítségével. A szkript fájl “auto_deploy” alapértelmezett targetjét kell lefuttatni, miután az ugyanitt található build.properties konfigurációs állomány tartalma ellenőrzésre került, és a megfelelő útvonalak be lettek állítva.
-
Az export/efer.payment.gateway/efer_gateway.ear alkalmazást fel kell telepíteni Glassfish alá. Ezt a következő módon kell végrehajtani. 1. A Gateway-t futtató gép GlassFish adminisztrátori felületére lépjünk be adminisztrátor felhasználóval. Az adminisztrátori felület URL-je tipikusan: http://:4848/ 2. Az előkészületek után megkezdődhet a tényleges alkalmazás telepítése. Ehhez a jobboldali menüben navigáljunk az Applications:Enterprise Applications pontra, majd itt válasszuk ki a „Deploy...” pontot.
3. Tallózzuk be a telepítő csomagból az export/efer.payment.gateway/efer_gateway.ear EAR állományt a file választóval, majd nyomjuk meg a deploy gombot. 4. Rövid idő múlva a egy táblázatban láthatjuk az alkalmazás nevét, és az enabled oszlopban lévő „true” felirat tájékoztat arról, hogy fut is.
4.5 EFER Payment Gateway Client alkalmazás telepítése Név
Jelentés
DOMAIN_HOME
A Glassfish alkalmazásszerver domain elérése .
- Az export/efer.payment.gateway/fizeto.ugyfel.map fájlt be kell másolni a ${DOMAIN_HOME} mappába.
15/40
Ez tartalmazza a fizető űgyfél számlaszámát az alábbiak szerint: 101101001011010111111110=1
16/40
5 EFER GATEWAY CLIENT Az EFER GATEWAY CLIENT példaprogram remote EJB hívásokkal működő nyílt forráskódú alkalmazás, amit az eferhez csatlakozni kívánó FMSZ-ek megkapnak. Az EFER GATEWAY CLIENT az EFER GATEWAY programcsomag része. A CLIENT testreszabását az FMSZ végzi, az átadott forráskód és a dokumentáció csak irányt mutat, viszont az előre definiált üzenetek neveit, és az azok által használt adatköröket nem szabad megváltoztatni.
5.1 Implementált szolgáltatások GATEWAY szolgáltatásai FMSZ részére (FMSZ hívja GATEWAY-t) GWF01_FizetendoTetelekListaja GWF02_TetelReferencia GWF04_TetelStatusz GWF03_FizetesiIgerveny GWF20_ElutasitottFizetesiIgerveny FMSZ szolgáltatásai GATEWAY részére (GATEWAY hívja FMSZ-et) FMSZ01_EFERUgyfelValidalas FMSZ03_EFERRiasztas
EferTetelLista EferTetelReferencia EferTetelStatusz EferFizetesiIgerveny EferElutasitottFizetesiIgerveny
EferTetelListaValasz EferTetelReferenciaValasz EferTetelStatuszValasz EferFizetesiIgervenyValasz EferElutasitottFizetesiIgervenyValasz
EferUgyfelValidalas EferRiasztas
EferUgyfelValidalasValasz
17/40
5.1.1 Fizetendő tételek listája A szolgáltatás feladata, hogy egy banki csatorna lekérdezhesse az ügyfél EFER tételeit. - GATEWAY szolgáltatás neve: GWF01_FizetendoTetelekListaja - Kliens példaprogram: GWF01_TeteListaKliens
5.1.1.1 Példa program: import javax.ejb.EJB; import javax.naming.InitialContext; import javax.naming.NamingException; import com.efer.adatkor.EferTetelLista; import com.efer.adatkor.EferTetelListaValasz; import com.efer.adatkor.EferTetelStatusz; public class GWF01_TeteListaKliens { @EJB GWF01_FizetendoTetelekListajaRemote GWF01_FizetendoTetelekListaja; private void initEJBs(){ try{ if (null == GWF01_FizetendoTetelekListaja) { GWF01_FizetendoTetelekListaja = (GWF01_FizetendoTetelekListajaRemote) new InitialContext().lookup("GWF01_FizetendoTetelekListaja"); } }catch (NamingException e) { e.printStackTrace(); } } public EferTetelListaValasz getEferTetelListaValasz(){ initEJBs(); EferTetelLista eferTetelLista = new EferTetelLista(); eferTetelLista.setFmszUgyfAzon("1"); EferTetelListaValasz eferTetelListaValasz = new EferTetelListaValasz(); eferTetelListaValasz = GWF01_FizetendoTetelekListaja.process(eferTetelLista); return eferTetelListaValasz; } }
18/40
5.1.1.2 Kérés adatkör: import com.efer.model.FizetesStatusz; public class EferTetelLista { private String fmszUgyfAzon; private String fmszCsatornaId; private FizetesStatusz fizTetelStatusz; private String fizMegoldAzon; public String getFmszUgyfAzon() { return fmszUgyfAzon; } public void setFmszUgyfAzon(String fmszUgyfAzon) { this.fmszUgyfAzon = fmszUgyfAzon; } public String getFmszCsatornaId() { return fmszCsatornaId; } public void setFmszCsatornaId(String fmszCsatornaId) { this.fmszCsatornaId = fmszCsatornaId; } public FizetesStatusz getFizTetelStatusz() { return fizTetelStatusz; } public void setFizTetelStatusz(FizetesStatusz fizTetelStatusz) { this.fizTetelStatusz = fizTetelStatusz; } public String getFizMegoldAzon() { return fizMegoldAzon; } public void setFizMegoldAzon(String fizMegoldAzon) { this.fizMegoldAzon = fizMegoldAzon; } public String toString(){ StringBuffer sb = new StringBuffer(); sb.append("EferTetelLista\n"); sb.append("--------------\n"); sb.append("FMSZ csatorna id: "+getFmszCsatornaId()+"\n"); sb.append("FMSZ Ugyfel azon: "+getFmszUgyfAzon()+"\n"); sb.append("Fizetési tétel státusza : "+getFizTetelStatusz().toString()+"\n"); sb.append("Fizetési megoldás azonosítója : "+getFizMegoldAzon()+"\n"); return sb.toString(); } }
19/40
5.1.1.3 Válasz adatkör: public class EferTetelListaValasz { private List<EferTetelListaValaszElem> tetelLista = new Vector<EferTetelListaValaszElem>(); public List<EferTetelListaValaszElem> getTetelLista() { return tetelLista; } public void setTetelLista(List<EferTetelListaValaszElem> tetelLista) { this.tetelLista = tetelLista; } public String toString(){ StringBuffer sb = new StringBuffer(); sb.append("EferTetelListaValasz\n"); sb.append("--------------\n"); for (EferTetelListaValaszElem tetel : getTetelLista()) { sb.append(tetel.toString()); } return sb.toString(); } }
import java.math.BigDecimal; import java.util.Date; import java.util.List; import com.efer.model.FizetesStatusz; public class EferTetelListaValaszElem { private String kedvSzlaSzam; private String kedvNev; private BigDecimal fizOsszeg; private Date fizHatIdo; private String puAzon; private String specEFERTetel; private FizetesStatusz statusz; private String fizMegold; private String kozlemeny; private String igervenyTrAzon; private Date igervenyTrIdo; private String igervenyTrCsatornaId; private String utaloSzlaSzam; private List fmszCsatornaLista; public String getKedvSzlaSzam() { return kedvSzlaSzam; } public void setKedvSzlaSzam(String kedvSzlaSzam) { this.kedvSzlaSzam = kedvSzlaSzam; } public String getKedvNev() { return kedvNev; } public void setKedvNev(String kedvNev) { this.kedvNev = kedvNev; } public BigDecimal getFizOsszeg() { return fizOsszeg; } public void setFizOsszeg(BigDecimal fizOsszeg) { this.fizOsszeg = fizOsszeg; }
20/40
public Date getFizHatIdo() { return fizHatIdo; } public void setFizHatIdo(Date fizHatIdo) { this.fizHatIdo = fizHatIdo; } public String getPuAzon() { return puAzon; } public void setPuAzon(String puAzon) { this.puAzon = puAzon; } public String getSpecEFERTetel() { return specEFERTetel; } public void setSpecEFERTetel(String specEFERTetel) { this.specEFERTetel = specEFERTetel; } public FizetesStatusz getStatusz() { return statusz; } public void setStatusz(FizetesStatusz statusz) { this.statusz = statusz; } public String getFizMegold() { return fizMegold; } public void setFizMegold(String fizMegold) { this.fizMegold = fizMegold; } public String getKozlemeny() { return kozlemeny; } public void setKozlemeny(String kozlemeny) { this.kozlemeny = kozlemeny; } public String getIgervenyTrAzon() { return igervenyTrAzon; } public void setIgervenyTrAzon(String igervenyTrAzon) { this.igervenyTrAzon = igervenyTrAzon; } public Date getIgervenyTrIdo() { return igervenyTrIdo; } public void setIgervenyTrIdo(Date igervenyTrIdo) { this.igervenyTrIdo = igervenyTrIdo; } public String getIgervenyTrCsatornaId() { return igervenyTrCsatornaId; } public void setIgervenyTrCsatornaId(String igervenyTrCsatornaId) { this.igervenyTrCsatornaId = igervenyTrCsatornaId; } public String getUtaloSzlaSzam () { return utaloSzlaSzam; } public void setUtaloSzlaSzam (String utaloSzlaSzam) { this. utaloSzlaSzam = utaloSzlaSzam; } public List getFmszCsatornaLista() { return fmszCsatornaLista; } public void setFmszCsatornaLista(List fmszCsatornaLista) { this.fmszCsatornaLista = fmszCsatornaLista; } public String toString(){ StringBuffer sb = new StringBuffer(); sb.append("EferTetelListaValaszElem\n"); sb.append("--------------\n");
21/40
sb.append("kedvezményezett szlaszáma: "+getKedvSzlaSzam()+"\n"); sb.append("kedvezményezett neve: "+getKedvNev()+"\n"); sb.append("fizetendo összeg: "+getFizOsszeg()+"\n"); sb.append("fizetési határidó: "+getFizHatIdo()+"\n"); sb.append("pü. azonosító: "+getPuAzon()+"\n"); sb.append("specialis EFER tetel: "+getSpecEFERTetel()+"\n"); sb.append("statusz: "+getStatusz().toString()+"\n"); sb.append("fizmegold: "+getFizMegold()+"\n"); sb.append("kozlemeny: "+getKozlemeny()+"\n"); sb.append("igervenyTrAzon: "+getIgervenyTrAzon()+"\n"); sb.append("igervenyTrCsatornaId: "+getIgervenyTrCsatornaId()+"\n"); sb.append("igervenyTrIdo: "+getIgervenyTrIdo()+"\n"); sb.append("utalo szamla szama: "+getUtaloSzlaSzam()+"\n"); sb.append("fmszCsatornaLista: "+getFmszCsatornaLista()+"\n"); return sb.toString(); } private class FmszCsatorna { private String fmszCsatornaId; private String fmszCsatornaTetelReferencia; public String getFmszCsatornaId() { return fmszCsatornaId; } public void setFmszCsatornaId(String fmszCsatornaId) { this.fmszCsatornaId = fmszCsatornaId; } public String getFmszCsatornaTetelReferencia() { return fmszCsatornaTetelReferencia; } public void setFmszCsatornaTetelReferencia(String fmszCsatornaTetelReferencia) { this.fmszCsatornaTetelReferencia = fmszCsatornaTetelReferencia; } } }
22/40
5.1.2 EFER tétel Referencia és Státusz megadása A szolgáltatás feladata, hogy a bank referencia azonosítóval láthassa el a gatewayben tárolt tételt. A referencia adatok a FIZETES táblához kötve egy kapcsoló táblában 1:n viszonyban lesznek tárolva. Így minden csatorna, amely lehívta a tételt nyilván lesz tartva. Amennyiben az input paraméterek a státusz adatot is tartalmazzák, úgy a tétel státusza is módosul. - GATEWAY szolgáltatás neve: GWF02_TetelReferencia - Kliens példaprogram: GWF02_TetelReferenciaKliens
5.1.2.1 Példa program: import javax.ejb.EJB; import javax.naming.InitialContext; import javax.naming.NamingException; import com.efer.adatkor.EferTetelReferencia; public class GWF02_TetelReferenciaKliens { @EJB GWF02_TetelReferenciaRemote GWF02_TetelReferencia; private void initEJBs(){ try{ if (null == GWF02_TetelReferencia) { GWF02_TetelReferencia = (GWF02_TetelReferenciaRemote) new InitialContext().lookup("GWF02_TetelReferencia"); } }catch (NamingException e) { e.printStackTrace(); } } public void process(EferTetelReferencia eferTetelReferencia){ initEJBs(); GWF02_TetelReferencia.process(eferTetelReferencia); } }
23/40
5.1.2.2 Kérés adatkör: import com.efer.model.FizetesStatusz; public class EferTetelReferencia{ private String FMSZCsatornaAzonosito; //fmsz csatorna id private String puAzon; //pu. azonosíto private String FMSZCsatornaTetelRef; //fmsz csatorna tetel referencia private FizetesStatusz statusz; public String getFMSZCsatornaAzonosito() { return FMSZCsatornaAzonosito; } public void setFMSZCsatornaAzonosito(String fMSZCsatornaAzonosito) { FMSZCsatornaAzonosito = fMSZCsatornaAzonosito; } public String getPuAzon() { return puAzon; } public void setPuAzon(String puAzon) { this.puAzon = puAzon; } public String getFMSZCsatornaTetelRef() { return FMSZCsatornaTetelRef; } public void setFMSZCsatornaTetelRef(String csatornaTetelRef) { FMSZCsatornaTetelRef = csatornaTetelRef; } public FizetesStatusz getStatusz() { return statusz; } public void setStatusz(FizetesStatusz statusz) { this.statusz = statusz; } public String toString(){ StringBuffer sb = new StringBuffer(); sb.append("EferTetelReferencia\n"); sb.append("--------------\n"); sb.append("csatorna azonositoja: "+getFMSZCsatornaAzonosito()+"\n"); sb.append("penzugyi ugyazonosito: "+getPuAzon()+"\n"); sb.append("fmsz csatorna tetel referencia: "+getFMSZCsatornaTetelRef()+"\n"); sb.append("statusz: "+getStatusz().toString()+"\n"); return sb.toString(); } }
24/40
5.1.2.3 Válasz adatkör: import java.math.BigInteger; public class EferTetelReferenciaValasz{ private BigInteger hibaKod = BigInteger.ZERO; private String hibaSzoveg; public BigInteger getHibaKod() { return hibaKod; } public void setHibaKod(BigInteger hibaKod) { this.hibaKod = hibaKod; } public String getHibaSzoveg() { return hibaSzoveg; } public void setHibaSzoveg(String hibaSzoveg) { this.hibaSzoveg = hibaSzoveg; } public String toString(){ StringBuffer sb = new StringBuffer(); sb.append("EferTetelReferenciaValasz\n"); sb.append("--------------\n"); sb.append("hibakód: "+getHibaKod()+"\n"); sb.append("hibaszöveg: "+getHibaSzoveg()+"\n"); return sb.toString(); } }
25/40
5.1.3 Fizetési ígérvény fogadása az FMSZ-ek felől A szolgáltatás feladata, hogy fogadja a bank által küldött fizetési ígérvényt. - GATEWAY szolgáltatás neve: GWF03_FizetesiIgerveny - Kliens példaprogram: GWF03_FizetesiIgervenyKliens
5.1.3.1 Példa program: import java.util.Date; import javax.ejb.EJB; import javax.naming.InitialContext; import javax.naming.NamingException; import com.efer.adatkor.EferFizetesiIgerveny; import com.efer.adatkor.EferFizetesiIgervenyValasz; public class GWF03_FizetesiIgervenyKliens { @EJB GWF03_FizetesiIgervenyRemote GWF03_FizetesiIgerveny;
private void initEJBs(){ try{ if (null == GWF03_FizetesiIgerveny) { GWF03_FizetesiIgerveny = (GWF03_FizetesiIgervenyRemote) new InitialContext().lookup("GWF03_FizetesiIgerveny"); } }catch (NamingException e) { e.printStackTrace(); } }
public void process(String penzazon){ initEJBs(); EferFizetesiIgerveny igerveny = new EferFizetesiIgerveny(); igerveny.setIgervenyTrAzonosito(""+new Date().getTime()); igerveny.setIgervenyTrIdo(new Date()); igerveny.setPuAzon(penzazon); EferFizetesiIgervenyValasz eferFizetesiIgervenyValasz = new EferFizetesiIgervenyValasz(); eferFizetesiIgervenyValasz = GWF03_FizetesiIgerveny.process(igerveny); if (!eferFizetesiIgervenyValasz.getHibaKod().equals(BigInteger.ZERO)){ System.out.println("Hiba: "+ eferFizetesiIgervenyValasz.getHibaKod()+ " "+eferFizetesiIgervenyValasz.getHibaSzoveg()); } } }
26/40
5.1.3.2 Kérés adatkör: import java.util.Date; public class EferFizetesiIgerveny { private String csatornaAzonosito; private String referenciaID; private String igervenyTrAzonosito; private Date igervenyTrIdo; private String utaloSzlaSzam; public String getCsatornaAzonosito() { return csatornaAzonosito; } public void setCsatornaAzonosito(String csatornaAzonosito) { this.csatornaAzonosito = csatornaAzonosito; } public String getReferenciaID() { return referenciaID; } public void setReferenciaID(String referenciaID) { this.referenciaID = referenciaID; } public String getIgervenyTrAzonosito() { return igervenyTrAzonosito; } public void setIgervenyTrAzonosito(String igervenyTrAzonosito) { this.igervenyTrAzonosito = igervenyTrAzonosito; } public Date getIgervenyTrIdo() { return igervenyTrIdo; } public void setIgervenyTrIdo(Date igervenyTrIdo) { this.igervenyTrIdo = igervenyTrIdo; } public String getUtaloSzlaSzam(){ return utaloSzlaSzam; } public void setUtaloSzlaSzam(String utaloSzlaSzam){ this.utaloSzlaSzam = utaloSzlaSzam; } public String toString(){ StringBuffer sb = new StringBuffer(); sb.append("EferFizetesiIgerveny\n"); sb.append("--------------\n"); sb.append("csatorna azonosítója: "+getCsatornaAzonosito()+"\n"); sb.append("referenciaID: "+getReferenciaID()+"\n"); sb.append("igérveny tranzakció azonosító: "+getIgervenyTrAzonosito()+"\n"); sb.append("igérveny tranzakció dátum: "+getIgervenyTrIdo()+"\n"); sb.append("utaló számlaszám: "+getUtaloSzlaSzam()+"\n"); return sb.toString(); } }
27/40
5.1.3.3 Válasz adatkör: import java.math.BigInteger; public class EferFizetesiIgervenyValasz { private String fizmegold; private String fmszazon; private String fmsztrazon; private String penzazon; private BigInteger hibaKod = BigInteger.ZERO; private String hibaSzoveg; public String getFizmegold() { return fizmegold; } public void setFizmegold(String fizmegold) { this.fizmegold = fizmegold; } public String getFmszazon() { return fmszazon; } public void setFmszazon(String fmszazon) { this.fmszazon = fmszazon; } public String getFmsztrazon() { return fmsztrazon; } public void setFmsztrazon(String fmsztrazon) { this.fmsztrazon = fmsztrazon; } public String getPenzazon() { return penzazon; } public void setPenzazon(String penzazon) { this.penzazon = penzazon; } public BigInteger getHibaKod() { return hibaKod; } public void setHibaKod(BigInteger hibaKod) { this.hibaKod = hibaKod; } public String getHibaSzoveg() { return hibaSzoveg; } public void setHibaSzoveg(String hibaSzoveg) { this.hibaSzoveg = hibaSzoveg; } public String toString(){ StringBuffer sb = new StringBuffer(); sb.append("EferFizetesiIgervenyValasz\n"); sb.append("--------------\n"); sb.append("pénz azonosítója: "+getPenzazon()+"\n"); sb.append("fizetési megoldás: "+getFizmegold()+"\n"); sb.append("fmsz azonosító: "+getFmszazon()+"\n"); sb.append("fmsz tr azonosító: "+getFmsztrazon()+"\n"); sb.append("hibakód: "+getHibaKod()+"\n"); sb.append("hibaszöveg: "+getHibaSzoveg()+"\n"); return sb.toString(); } }
28/40
5.1.4 EFER tétel státuszának lekérdezése A szolgáltatás feladata, hogy a bank lekérdezhesse a gatewayben tárolt tétel státuszát.
- GATEWAY szolgáltatás neve: GWF04_TetelStatusz - Kliens példaprogram: GWF04_TetelStatuszKliens
5.1.4.1 Példa program: import javax.ejb.EJB; import javax.naming.InitialContext; import javax.naming.NamingException; import com.efer.adatkor.EferTetelStatusz; public class GWF04_TetelStatuszKliens { @EJB GWF04_TetelStatuszRemote GWF04_TetelStatusz; private void initEJBs(){ try{ if (null == GWF04_TetelStatusz) { GWF04_TetelStatusz = (GWF04_TetelStatuszRemote) new InitialContext().lookup("GWF04_TetelStatusz"); } }catch (NamingException e) { e.printStackTrace(); } } public void process(EferTetelStatusz eferTetelStatusz){ initEJBs(); GWF04_TetelStatusz.process(eferTetelStatusz); } }
29/40
5.1.4.2 Kérés adatkör: public class EferTetelStatusz { private String FMSZCsatornaAzonosito; private String puAzon; public String getFMSZCsatornaAzonosito() { return FMSZCsatornaAzonosito; } public void setFMSZCsatornaAzonosito(String fMSZCsatornaAzonosito) { FMSZCsatornaAzonosito = fMSZCsatornaAzonosito; } public String getPuAzon() { return puAzon; } public void setPuAzon(String puAzon) { this.puAzon = puAzon; } public String toString(){ StringBuffer sb = new StringBuffer(); sb.append("EferTetelStatusz\n"); sb.append("--------------\n"); sb.append("csatorna azonosítója: "+getFMSZCsatornaAzonosito()+"\n"); sb.append("pü. azonosító: "+getPuAzon()+"\n"); return sb.toString(); } }
5.1.4.3 Válasz adatkör: Az Hiba! A hivatkozási forrás nem található. EferTetelListaValaszElem fejezetben ismertetett adatkört használja a szolgáltatás .
30/40
5.1.5 Elutasított fizetési ígérvény fogadása az FMSZ-ek felől A szolgáltatás feladata, hogy fogadja a bank által küldött elutasított fizetési ígérvényt. - GATEWAY szolgáltatás neve: GWF20_ElutasitottFizetesiIgerveny - Kliens példaprogram: GWF20_ElutasitottFizetesiIgervenyKliens
5.1.5.1 Példa program: import javax.naming.InitialContext; import javax.naming.NamingException; import com.efer.adatkor.EferElutasitottFizetesiIgerveny; import com.efer.adatkor.EferElutasitottFizetesiIgervenyValasz; public class GWF20_ElutasitottFizetesiIgervenyKliens { GWF20_ElutasitottFizetesiIgervenyRemote GWF20_ElutasitottFizetesiIgerveny; private void initEJBs(){ try{ if (null == GWF20_ElutasitottFizetesiIgerveny) { GWF20_ElutasitottFizetesiIgerveny = (GWF20_ElutasitottFizetesiIgervenyRemote) new InitialContext().lookup("GWF20_ElutasitottFizetesiIgerveny"); } }catch (NamingException e) { e.printStackTrace(); } }
public void process(String penzazon){ initEJBs(); EferElutasitottFizetesiIgerveny elutasitottIgerveny = new EferElutasitottFizetesiIgerveny(); elutasitottIgerveny.setPuAzon(penzazon); elutasitottIgerveny.setHibakod(55); elutasitottIgerveny.setHibaszoveg("Általános elutasítás (az ügyfél megbízása alapján)"); EferElutasitottFizetesiIgervenyValasz eferElutasitottFizetesiIgervenyValasz = new EferElutasitottFizetesiIgervenyValasz(); eferElutasitottFizetesiIgervenyValasz = GWF20_ElutasitottFizetesiIgerveny.process(elutasitottIgerveny); if (!eferElutasitottFizetesiIgervenyValasz.getHibaKod().equals(BigInteger.ZERO)){ System.out.println("Hiba: "+ eferElutasitottFizetesiIgervenyValasz.getHibaKod()+ " "+eferElutasitottFizetesiIgervenyValasz.getHibaSzoveg()); } } }
31/40
5.1.5.2 Kérés adatkör: public class EferElutasitottFizetesiIgerveny { private String csatornaAzonosito; private String referenciaID; //fmszCsatornaId private Date elutasitasIdo; private int hibakod; private String hibaszoveg; public String getCsatornaAzonosito() { return csatornaAzonosito; } public void setCsatornaAzonosito(String csatornaAzonosito) { this.csatornaAzonosito = csatornaAzonosito; } public String getReferenciaID() { return referenciaID; } public void setReferenciaID(String referenciaID) { this.referenciaID = referenciaID; } public Date getElutasitasIdo(){ return elutasitasIdo; } public void setElutasitasIdo(Date elutasitasIdo) { this.elutasitasIdo = elutasitasIdo; } public int getHibakod() { return hibakod; } public void setHibakod(int hibakod) { this.hibakod = hibakod; } public String getHibaszoveg() { return hibaszoveg; } public void setHibaszoveg(String hibaszoveg) { this.hibaszoveg = hibaszoveg; } public String toString(){ StringBuffer sb = new StringBuffer(); sb.append("EferElutasitottFizetesiIgerveny\n"); sb.append("--------------\n"); sb.append("csatorna azonosítója: "+getCsatornaAzonosito()+"\n"); sb.append("referenciaID: "+getReferenciaID()+"\n"); sb.append("elutasitas ido: "+getElutasitasIdo ()+"\n"); sb.append("hibakód: "+getHibakod()+"\n"); sb.append("hibaszöveg: "+getHibaszoveg()+"\n"); return sb.toString(); } }
32/40
5.1.5.3 Válasz adatkör: import java.math.BigInteger; public class EferElutasitottFizetesiIgervenyValasz { private String penzazon; private String fizmegold; private String fmszazon; private String fmsztrazon; private BigInteger hibaKod = BigInteger.ZERO; private String hibaSzoveg;
public String getPenzazon() { return penzazon; } public void setPenzazon(String penzazon) { this.penzazon = penzazon; } public String getFizmegold() { return fizmegold; } public void setFizmegold(String fizmegold) { this.fizmegold = fizmegold; } public String getFmszazon() { return fmszazon; } public void setFmszazon(String fmszazon) { this.fmszazon = fmszazon; } public String getFmsztrazon() { return fmsztrazon; } public void setFmsztrazon(String fmsztrazon) { this.fmsztrazon = fmsztrazon; } public BigInteger getHibaKod() { return hibaKod; } public void setHibaKod(BigInteger hibaKod) { this.hibaKod = hibaKod; } public String getHibaSzoveg() { return hibaSzoveg; } public void setHibaSzoveg(String hibaSzoveg) { this.hibaSzoveg = hibaSzoveg; } public String toString(){ StringBuffer sb = new StringBuffer(); sb.append("EferElutasitottFizetesiIgervenyValasz\n"); sb.append("--------------\n"); sb.append("pénz azonosítója: "+getPenzazon()+"\n"); sb.append("fizetési megoldás: "+getFizmegold()+"\n"); sb.append("fmsz azonosító: "+getFmszazon()+"\n"); sb.append("fmsz tr azonosító: "+getFmsztrazon()+"\n"); sb.append("hibakód: "+getHibaKod()+"\n"); sb.append("hibaszöveg: "+getHibaSzoveg()+"\n"); return sb.toString(); } }
33/40
5.1.6 Fizető fél ellenőrzése Az EFER tétel befogadása előtt ellenőrizni kell, hogy a kérelemben megadott ügyfélazonosító adat valós banki ügyfélhez tartozik-e. Sikeres validálás esetén a gateway letárolja a válaszban átadott belső banki azonosítót, így az ügyfél gatewayban tárolt adatai felesleges megfeleltetések nélkül elérhetők a banki háttérrendszerek számára. A Gateway ezt a szolgáltatást remote EJB hívással éri el ezért a szolgáltatás nevét, a process metódus nevét, valamint a bemenő paramétereit szigorúan tilos megváltoztatni! A process metódusban megvalósított ügyfél ellenőrzés csak példa jellegű, az ellenőrzés végleges módját a Bank kell implementálja. - Banki szolgáltatás neve: FMSZ01_EFERUgyfelValidalas
5.1.6.1 Példa program: import java.io.File; import java.io.IOException; import java.math.BigInteger; import javax.ejb.Local; import javax.ejb.Remote; import javax.ejb.Stateless; import com.efer.adatkor.EferUgyfelValidalas; import com.efer.adatkor.EferUgyfelValidalasValasz; import com.efer.kozos.ToolsClient; @Local(FMSZ01_EFERUgyfelValidalasLocal.class) @Remote(FMSZ01_EFERUgyfelValidalasRemote.class) @Stateless(name = "FMSZ01_EFERUgyfelValidalas", mappedName = "FMSZ01_EFERUgyfelValidalas") public class FMSZ01_EFERUgyfelValidalas implements FMSZ01_EFERUgyfelValidalasLocal { private ToolsClient toolsClient= new ToolsClient(); public EferUgyfelValidalasValasz process(EferUgyfelValidalas request ) { EferUgyfelValidalasValasz eferUgyfelValidalasValasz = new EferUgyfelValidalasValasz(); String response = null; try { response = toolsClient.getPropertiesValue(new File(toolsClient.getPropertiesValue("fizeto.ugyfel.utvonal")),request.getFizSzlaSzam()); } catch (IOException e) { e.printStackTrace(); } if (response != null){ eferUgyfelValidalasValasz.setHibaKod(BigInteger.valueOf(0)); eferUgyfelValidalasValasz.setHibaSzoveg(""); }else { eferUgyfelValidalasValasz.setHibaKod(BigInteger.valueOf(50)); eferUgyfelValidalasValasz.setHibaSzoveg("Nem létező címzett/kedvezményezett számlaszám "); } eferUgyfelValidalasValasz.setFizetoBelsoAzon(response); return eferUgyfelValidalasValasz; } }
34/40
5.1.6.2 Kérés adatkör: public class EferUgyfelValidalas { private String fizSzlaSzam; private String fizUgyfAzon; private String fizMobil; public String getFizSzlaSzam() { return fizSzlaSzam; } public void setFizSzlaSzam(String fizSzlaSzam) { this.fizSzlaSzam = fizSzlaSzam; } public String getFizUgyfAzon() { return fizUgyfAzon; } public void setFizUgyfAzon(String fizUgyfAzon) { this.fizUgyfAzon = fizUgyfAzon; } public String getFizMobil() { return fizMobil; } public void setFizMobil(String fizMobil) { this.fizMobil = fizMobil; } public String toString(){ StringBuffer sb = new StringBuffer(); sb.append("EferUgyfelValidalas\n"); sb.append("--------------\n"); sb.append("fizeto szlaszám: "+getFizSzlaSzam()+"\n"); sb.append("fizeto ügyfazon: "+getFizUgyfAzon()+"\n"); sb.append("fizeto mobil: "+getFizMobil()+"\n"); return sb.toString(); } }
35/40
5.1.6.3 Válasz adatkör: import java.math.BigInteger; public class EferUgyfelValidalasValasz { private String fizetoBelsoAzon; private BigInteger hibaKod = BigInteger.ZERO; private String hibaSzoveg; public String getFizetoBelsoAzon() { return fizetoBelsoAzon; } public void setFizetoBelsoAzon(String fizetoBelsoAzon) { this.fizetoBelsoAzon = fizetoBelsoAzon; } public BigInteger getHibaKod() { return hibaKod; } public void setHibaKod(BigInteger hibaKod) { this.hibaKod = hibaKod; } public String getHibaSzoveg() { return hibaSzoveg; } public void setHibaSzoveg(String hibaSzoveg) { this.hibaSzoveg = hibaSzoveg; } public String toString(){ StringBuffer sb = new StringBuffer(); sb.append("EferUgyfelValidalasValasz\n"); sb.append("--------------\n"); sb.append("fizeto belso azonosító: "+getFizetoBelsoAzon()+"\n"); sb.append("hibakód: "+getHibaKod()+"\n"); sb.append("hibaszöveg: "+getHibaSzoveg()+"\n"); return sb.toString(); } }
36/40
5.1.7 Riasztás banki háttérrendszer felé A gateway működése során jelentkező, a működést befolyásoló eseményekről értesíti a banki háttérrendszert. A lent szemléltetett példaprogram lementi táblába a riasztás rekordot, de a funkcionalitás szabadon modosítható, kiegészíthető. A Gateway ezt a szolgáltatást remote EJB hívással éri el ezért a szolgáltatás nevét, a process metódus nevét, valamint a bemenő paramétereit szigorúan tilos megváltoztatni! - Banki szolgáltatás neve: FMSZ03_EFERRiasztas
5.1.7.1 Példa program: import java.util.Date; import javax.ejb.Local; import javax.ejb.Remote; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import com.efer.adatkor.EferRiasztas;
@Local(FMSZ03_EFERRiasztasLocal.class) @Remote(FMSZ03_EFERRiasztasRemote.class) @Stateless(name = "FMSZ03_EFERRiasztas", mappedName = "FMSZ03_EFERRiasztas") public class FMSZ03_EFERRiasztas implements FMSZ03_EFERRiasztasLocal{ @PersistenceContext(name = "efer.gateway.client-ejbPU") EntityManager em; public void process(EferRiasztas request ){ Riasztas riasztas = new Riasztas(); riasztas.setRiasztas_ideje(new Date()); riasztas.setHibaKod(request.getHibaKod().intValue()); riasztas.setHibaSzoveg(request.getHibaSzoveg()); riasztas.setTipus(request.getTipus()); try{ em.merge(riasztas); System.out.println("Sikeres mentes"); }catch (Exception e) { e.printStackTrace(); } } }
37/40
5.1.7.2 Kérés adatkör:
import java.math.BigInteger; public class EferRiasztas { private BigInteger hibaKod; private String hibaSzoveg; private String tipus; public BigInteger getHibaKod() { return hibaKod; } public void setHibaKod(BigInteger hibaKod) { this.hibaKod = hibaKod; } public String getHibaSzoveg() { return hibaSzoveg; } public void setHibaSzoveg(String hibaSzoveg) { this.hibaSzoveg = hibaSzoveg; } public String getTipus() { return tipus; } public void setTipus(String tipus) { this.tipus = tipus; } public String toString(){ StringBuffer sb = new StringBuffer(); sb.append("EferRiasztas\n"); sb.append("--------------\n"); sb.append("hibakód: "+getHibaKod()+"\n"); sb.append("hibaszöveg: "+getHibaSzoveg()+"\n"); sb.append("típus: "+getTipus()+"\n"); return sb.toString(); } }
5.1.8 Kapcsolodó adatkörök public enum FizetesStatusz { HIB, // HIBA BEF, // BEFOGADOTT MLK, // MEGTEKINTETT FAT, // FIZETESALATT ELU, // ELUTASITOTT ELK, // ELUTASITOTT_ELKULDVE FIZ, // FIZETVE FIE // FIZETVE_ELKULDVE }
38/40
6 PROJEKT STRUKTÚRA 6.1 ind.efer.gateway Alkalmazás két fő részből tevődik össze egy ejb modul és egy war modul. Buildelés után efer.gateway-ejb modulból elkészül az efer_gateway.jar és az efer.gateway-war modulból pedig a efer_gateway.war. Létrejött ear alkalmazás nem teljes egy FMSZ által implementált kliens nélkül.
6.1.1 efer.gateway-ejb Tartalmazza az adatbázis szolgáltatásokat, FMSZ által implementált interfaceket, adatköröket valamint az EFER kommunikációhoz használt eszközöket. 1. com.efer.adatkor Csomag tartalmazza az FMSZ kommunikációhoz használt adatköröket. 2. com.efer.exception Hibaosztályokat tartalmazó csomag 3. com.efer.kliens.fmsz FMSZ által implementálásra kötelezett interface osztályokat tartalmazza. 4. com.efer.kliens.kfm EFER implementációkat tartalmazza.
kommunikációt
megvalósító
interfaceket
és
5. com.efer.kozos Gateway által használt segédeszközöket tartalmazza valamint a naplózó osztályt. 6. com.efer.model Gateway adatbázis táblák leképzéseit tartalmazza. 7. com.efer.provider Gateway objektumok perzisztálásáért felelős osztályoknak ad helyet. 8. com.efer.szolg.fmsz GATEWAY fizetés szolgáltatásait tartalmazza FMSZ részére. 9. com.efer.szolg.kfm GATEWAY elszámolási szolgáltatásait tartalmazza EFER részére. 10. com.efer.utemezo Ütemezett feladatokat ellátó osztályokat tartalmazza. 11. com.ind.efer.szolg EFER kommunikációhoz szükséges adatköröket valamint a WebService kliens osztályokat tartalmazza. 12. com.ind.efer.web.ws EFER fele publikált WebService adatköröket tartalmazza.
6.1.2 efer.gateway-war 1. com.ind.efer.web.ws EFER fele publikált WebService implementációs osztályokat tartalmazza.
6.1.3 lib Könyvtár tartalmazza a third-party jar-okat
39/40
6.1.4 sql create.sql tartalmazza az Oracle adatbázis objektumok létrehozásához szükséges parancsokat.
6.2 ind.efer.gateway.client A projekt tartalmazza az FMSZ példa osztályokat. Buildelés után elkészült efer.gateway.client.jar behelyeződik az ind.efer.gateway buildelése során létrehozott EAR csomagba. A kliens alkalmazásban levő EJB osztályok mindenikét kötelező implementálni a fent leírt módon. 1. com.efer.kliens.fmsz tartalmazza az efer.gateway-ejb projekt com.efer.kliens.fmsz csomagban található interfacek implementációit. 2.
com.efer.kliens.utemezo csomag tartalmaz egy ütemezett szolgáltatást. Ebben lekövethetőek a fizetés folyamat fő lépései.
A projektben található többi csomagnak nincs semmi jelentősége az integráció szempontjából, kizárólag példa jellegűek.
7 MELLÉKLETEK Az alábbiakban felsorolt mellékletek jelen dokumentumon kívűl, önálló állományként állnak rendelkezésre, vagy a hivatkozott Internet címekről tölthetők le.
7.1 1. melléklet: Telepítőcsomag A KFM telepítőcsomag export jegyzékében található a lefordított és telepítésre előkészített EAR csomag, és az összes szükséges konfigurációs fájl.
7.2 2. melléklet: EFER KFM Üzemeltetési leírás EFER_UL_KFM_v0.2.8_20110426.doc
7.3 3. melléklet: EFER Telepítési utasítás EFER_TU_KFM_v0.4.11_20120612.doc
7.4 4. melléklet: Banki Gateway specifikáció EFER_GWfmsz_v1 3 0_20130131_rc.doc
40/40