Fiskalizacija u PHP-u

U ovom članku biti će opisane detaljne upute kako napraviti fiskalizaciju u PHP-u. Ovo napraviti treba uzeti s rezervom jer ovdje govorimo samo o djelu kreiranja XML zahtjeva i digitalnog potpisivanja XML istog te komuniciranju sa CIS-om (Centralni informacijski sustav Ministarstva financija, Porezne uprave). Kompletna implementacija unutar vašeg PHP sustava je na vama da ju odradite.

Preuzmi Inchoo_Fiskalizacija Magento ekstenziju.

Prvo što trebamo napraviti je da sa stranice Porezne uprave skinemo dokument koji se zove Tehnička specifikacija za korisnike. S današnjim datumom, (02.01.2012 važeći je dokument Tehnička specifikacija za korisnike 1.2 (pdf)). Dokument sadrži nešto više od 50-ak stranica. Uzmite si određeno vrijeme pa ga prvo detaljno pročitajte cijelog, ako treba i dva puta.

Nakon što ste pročitali dokument, ubrzo će vam biti jasno kako vam je potreban digitalni certifikat kako biste mogli krenuti u daljnju tehnički implementaciju:

“… Nakon toga priprema XML poruku zahtjeva i elektronički ju potpisuje s privatnim ključem aplikativnog certifikata koji je izdan obvezniku u svrhu fiskalizacije (u testnoj okolini koristi se DEMO aplikativni certifikat) …”

Digitalni certifikat se dobiva od strane FINA-e, a upute kako ga točno dobiti možete pronaći ovdje http://www.fina.hr/fiskalizacija. Ovaj članak neče ulaziti u detalje oko dobivanja certifikata jer je to u potpunosti pokriveno sa uputamana FINA-inim web stranicama. Važno je napomenuti kako se ovdje radi o APLIKATIVNOM certifikatu (postoje dva izdanja tog certifikata: DEMO APLIKATIVNI i PRODUKCIJSKI APLIKATIVNI).

Ukoliko ste tvrtka (developer) koji izrađuje tehničko rješenje za fiskalizaciju tada vam od FINA-e treba DEMO APLIKATIVNI certifikat.

Nakon što u FINA-i predate svu potrebnu dokumentaciju, certifikat će vam biti isporučen vjerojatno putem emaila ili ako ste već naveli nekakvu drugu metodu. U suštini ne dobivate direktno certifikat već dobivate nešto što se zove Reference number i Authorization code, dva podatka uz pomoć kojih zatim downloadate certifikat. Uz te informacije trebali biste dobiti i PDF upute u kojima se među ostalom nalaze i upute za preuzimanje certifikata. Upute možete skinuti i ovdje, zovu se Procedura izdavanja DEMO aplikativnog certifikata za fiskalizaciju.pdf.

VAŽNO je napomenuti kako je samo skidanje certifikata potrebno obaviti po uputama unutar Procedura izdavanja DEMO aplikativnog certifikata za fiskalizaciju.pdf dokumenta, dakle putem MS Windows operacijskog sustava i Internet Explorer web preglednika. Skidanje certifikata preko OSX ili linux OS-a neće raditi jer se radi o MS .Net tehnologijama koji specifično zahtjevaju MS okružje. S obzirom da je Reference number i Authorization code moguće iskoristiti samo jednom, ako to pokušate putem OSX/linux storja onda ćete “ispucati” kodove i kasnije ih nećete moći iskoristi niti sa Windows stroja. Nakon što uspješno dohvatite certifikat, slijedite daljnje upute za export certifikata. Cilj nam je dakle exportati certifikat u .pfx format koji ćemo kasnije koristiti u PHP-u.

Osim aplikativnog certifikata, potrebno je skinuti i Verifikacijski/root (samopotpisani) certifikat za Demo CA certifikat sa https://demo-pki.fina.hr stranice. Ovaj certifikat se downloada u .cer formatu.

Do ovog trenutka trebali biste imati dva certifikata na računalu:

  • Demo aplikativni certifikat (.pfx),
  • Verifikacijski/root (samopotpisani) certifikat za Demo CA (.cer).

Bitno je napomenuti kako je kompletna skripta napravljena da radi sa dva navedena formata, dakle nisu potrebne nikakve konverzije formata certifikata zasebno od PHP-a.

Prije nego krenemo na sam PHP kod, pokazati ću vam zgodan trik kako “skužiti” sastaviti XML zahtjev, odnosno koji XML elementi trebaju ići u zahtjev (a bez da gubite nepotrebno vrijeme na “ručno” pregledavanje .xsd-a i WSDL-a). Savjetovao bih vam da si instalirate eclipse-jee (ja sam konkretno koristio eclipse-jee-juno-SR1) te uz pomoć eclipse i FiskalizacijaSchema.xsd datoteke automatski izgenerate kompletan XML za RacunZahtjev upit.

Kasnije taj XML koristite kao predložak u PHP-u. Datoteku FiskalizacijaSchema.xsd možete pronaći unutar WSDL x.y (zip) arhive koju možete skinuti ovdje.

image05

FiskalizacijaSchema.xsd datoteku otvorite unutar Eclipse, kao što je prikazano na slikama dolje.

image06

Zatim napravite desni klik na FiskalizacijaSchema.xsd datoeku i kliknite na Generate > XML File kao što je prikazano na slikama dolje.

image02

image03

image00

Sada kada imamo kompletan primjer FiskalizacijaSchema.xml možemo krenuti sa PHP kodom. Imajte pored sebe otvoren Tehnička specifikacija za korisnike x.y (pdf) dokument kako biste znali koja polja su obavezna a koja nisu u zahtjevu te ih prilagodili svojim potrebama.

Postoji više načina na koji u PHP-u možemo sastaviti XML (čista string-a, DOMDocument, XMLWriter, SimpleXMLElement, …). Dobar članak (prezentaciju) o razlikama pojedinih PHP library-a možete pronaći ovdje http://ebookbrowse.com/advanced-xml-pdf-d44476445. Ja sam u svom primjeru koristio XMLWriter za generiranje zahtjeva te DOMDocument za dodavanje potpisa na zahtjev u XML-u.

U nastavku slijedi kompletan primjer koda od čitanja certifikata, generiranje zahtjeva, potpisivanja do poziva prema CIS-u. Kako bi vam navedeni primjer radio, preduvjet je da vaš PHP na serveru ima uključene curl i openssl ekstenzije.

Prvo krećemo sa kodom za čitanje .pfx certifikata.

U tom prvom koraku izvlačimo certifikat i privatni ključ certifikata. Nakon što smo to rješili, prelazimo na konverziju downloadanog .cer certifikata u .pem certifikat/format. Ovo radimo zbog toga što nam kasnija CURL konekcija koristi .pem format certifikata za komunikaciju.

Zatim idemo prirediti dio koda koji će nam generirati Zaštitni Kod prilikom slanja RacunZahtjev-a.

U ovom trenutku malo skačemo sa djelovima koda, odnosno na kraju ćete vidjeti da ovo nije nužan redosljed kojim trebate ići. Kasnije si samo presložite kod kako vama odgovara.

Sada idemo prirediti dio koda za generiranje UUID-a, koji ćemo također koristiti prilikom izrade RacunZahtjev-a XML-a.

Jednom kada imamo zaštitni kod i UUID, tada možemo pristupiti slaganju RacunZahtjev-a ili PoslovniProstorZahtjev-a

Zatim pristupamo potpisivanju zahtjeva putem certifikata.

Kompletan radni primjer možete pronaći na https://gist.github.com/4594489. Imajte samo u vidu kako će u vašem slučaju RacunZahtjev i PoslovniProstorZahtjev izgledati možda znatno drugačije ovisno o vašim podacima. Dodatno, kompletan primjer dat na https://gist.github.com/4594489 potrebno je prilagoditi vašim parametrima.

Cheers.

Preuzmi Inchoo_Fiskalizacija Magento ekstenziju.