eFiskalizacija.cloud

Brzi start

Integrišite eFiskalizacija API u vaš web šop za nekoliko minuta. Ovaj vodič pokriva sve korake od dobijanja kredencijala do prvog fiskalnog računa.

Napomena: eFiskalizacija.cloud je namenjen isključivo za web šopove i daljinsku prodaju (e-commerce). Nije predviđen za maloprodajne objekte sa fizičkim POS terminalima.

1Dobijte API kredencijale

Pošaljite email na info@efiskalizacija.cloud sa sledećim podacima:

Nakon obrade zahteva dobijate:

Upozorenje: API Secret se prikazuje samo jednom prilikom generisanja. Sačuvajte ga odmah na bezbedno mesto. Ako ga izgubite, potrebno je regenerisati nove kredencijale.

2Pošaljite PEM sertifikat

Elektronski sertifikat u PEM formatu koji ste dobili od Poreske uprave Republike Srbije pošaljite na siguran način:

Uz sertifikat pošaljite i lozinku za otključavanje (odvojenim kanalom komunikacije).

Napomena: Sertifikat je neophodan za digitalno potpisivanje fiskalnih računa prema zahtevima Poreske uprave. Bez njega fiskalizacija nije moguća. PURS dostavlja sertifikat u PEM formatu — koristite fajl *_nochain.CERiKEY.pem.

3Testirajte integraciju

Koristite sledeći cURL primer za slanje prvog test zahteva sa HMAC autentifikacijom:

#!/bin/bash

# Vaši kredencijali
API_KEY="your-api-key"
API_SECRET="your-api-secret"

# Priprema zahteva
TIMESTAMP=$(date +%s)
BODY='{"stavke":[{"naziv":"Test proizvod","kolicina":1,"jedinicna_cena":100,"pdv_stopa":20}],"nacin_placanja":"gotovina","tip_racuna":"prodaja"}'
# NAPOMENA: jedinicna_cena je cena BEZ PDV-a (osnovica). PDV se obračunava na vrhu.
# pdv_stopa: 20 za produkciju (https://efiskalizacija.cloud), 19 za sandbox/test (https://staging.efiskalizacija.cloud)

# HMAC potpis
BODY_HASH=$(echo -n "$BODY" | sha256sum | cut -d' ' -f1)
STRING_TO_SIGN="${TIMESTAMP}POST/api/multitenant.php/fiskalizacija${BODY_HASH}"
SIGNATURE=$(echo -n "$STRING_TO_SIGN" | openssl dgst -sha256 -hmac "$API_SECRET" -binary | base64)

# Slanje zahteva
curl -X POST https://efiskalizacija.cloud/api/multitenant.php/fiskalizacija \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $API_KEY" \
  -H "X-Timestamp: $TIMESTAMP" \
  -H "X-Signature: $SIGNATURE" \
  -d "$BODY"

Uspešan odgovor ima sledeću strukturu:

{
  "success": true,
  "data": {
    "tenant": "Naziv firme d.o.o.",
    "rezultat": {
      "success": true,
      "racun_id": 123,
      "broj_racuna": "1",
      "ukupan_iznos": 120.00,
      "pfr_broj": "XXXXXXXX-XXXXXXXX-12345",
      "pfr_datum_vreme": "2026-01-05T10:30:00+01:00",
      "qr_kod": "data:image/png;base64,...",
      "status": "success",
      "message": "Fiskalizacija uspešno izvršena"
    }
  },
  "timestamp": "2026-01-05T10:30:00+01:00"
}
Napomena: Polje qr_kod sadrži QR kôd kao base64-enkodiranu PNG sliku. Nema polje qr_url. PFR broj se čita iz data.rezultat.pfr_broj.

4PHP primer

Kompletna PHP funkcija sa HMAC potpisivanjem koju možete direktno koristiti u vašem projektu:

<?php
declare(strict_types=1);

function fiskalizuj(array $stavke, string $nacinPlacanja, string $tipRacuna = 'prodaja'): array
{
    $apiKey = getenv('EFISK_API_KEY');
    $apiSecret = getenv('EFISK_API_SECRET');
    $baseUrl = 'https://efiskalizacija.cloud';
    $endpoint = '/api/multitenant.php/fiskalizacija';

    // Priprema tela zahteva
    $body = json_encode([
        'stavke' => $stavke,
        'nacin_placanja' => $nacinPlacanja,
        'tip_racuna' => $tipRacuna,
    ], JSON_UNESCAPED_UNICODE);

    // HMAC potpis
    $timestamp = (string) time();
    $bodyHash = hash('sha256', $body);
    $stringToSign = $timestamp . 'POST' . $endpoint . $bodyHash;
    $signature = base64_encode(
        hash_hmac('sha256', $stringToSign, $apiSecret, true)
    );

    // Slanje zahteva
    $ch = curl_init($baseUrl . $endpoint);
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => $body,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => [
            'Content-Type: application/json',
            'X-API-Key: ' . $apiKey,
            'X-Timestamp: ' . $timestamp,
            'X-Signature: ' . $signature,
        ],
        CURLOPT_TIMEOUT => 30,
    ]);

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($httpCode !== 200) {
        throw new RuntimeException("Greška pri fiskalizaciji: HTTP $httpCode - $response");
    }

    return json_decode($response, true);
}

// Primer korišćenja:
$rezultat = fiskalizuj(
    stavke: [
        [
            'naziv' => 'Laptop ASUS VivoBook',
            'kolicina' => 1,
            'jedinicna_cena' => 89990,
            'pdv_stopa' => 20,
        ],
    ],
    nacinPlacanja: 'kartica'
);

echo "PFR broj: " . $rezultat['data']['rezultat']['pfr_broj'];
jedinicna_cena je cena BEZ PDV-a (osnovica). PDV se automatski obračunava i dodaje na vrh. Na primer, za artikal od 1.000 RSD bez PDV-a sa stopom 20%, ukupan iznos računa biće 1.200 RSD.
Sandbox vs. produkcija: Za testiranje koristite URL https://staging.efiskalizacija.cloud i pdv_stopa: 19. Za pravu fiskalizaciju koristite https://efiskalizacija.cloud i pdv_stopa: 20. PDV stope se razlikuju jer sandbox koristi VSDC testni sistem Poreske uprave koji radi sa stopom od 19%.
Preporuka: API kredencijale čuvajte u environment varijablama (.env fajl), nikada ih ne upisujte direktno u izvorni kod.

5Najčešći slučajevi korišćenja

Web šop - fizički proizvod

Klasičan primer za online prodavnicu koja prodaje fizičke proizvode sa dostavom:

{
  "stavke": [
    {
      "naziv": "Bežične slušalice Sony WH-1000XM5",
      "kolicina": 1,
      "jedinicna_cena": 54990,
      "pdv_stopa": 20
    },
    {
      "naziv": "Zaštitna futrola",
      "kolicina": 1,
      "jedinicna_cena": 2490,
      "pdv_stopa": 20,
      "rabat_procenat": 10
    }
  ],
  "nacin_placanja": "kartica",
  "tip_racuna": "prodaja",
  "kupac": {
    "pib": "107026577",
    "ime": "Primer d.o.o.",
    "adresa": "Bulevar Mihajla Pupina 10, Beograd"
  }
}

Digitalni proizvod

Prodaja softvera, licenci ili digitalnog sadržaja:

{
  "stavke": [
    {
      "naziv": "Premium licenca - godišnja pretplata",
      "kolicina": 1,
      "jedinicna_cena": 11880,
      "pdv_stopa": 20
    }
  ],
  "nacin_placanja": "kartica",
  "tip_racuna": "prodaja"
}

E-commerce usluge

Pružanje online usluga (konsalting, dizajn, hosting):

{
  "stavke": [
    {
      "naziv": "Web hosting - mesečni paket",
      "kolicina": 12,
      "jedinicna_cena": 990,
      "pdv_stopa": 20
    },
    {
      "naziv": "SSL sertifikat",
      "kolicina": 1,
      "jedinicna_cena": 4990,
      "pdv_stopa": 20
    }
  ],
  "nacin_placanja": "virman",
  "tip_racuna": "prodaja",
  "kupac": {
    "pib": "123456789",
    "ime": "Klijent d.o.o.",
    "adresa": "Knez Mihailova 5, Beograd"
  }
}
Napomena o polju kupac: Za standardnu prodaju (tip_racuna: prodaja) polje kupac je opciono — izostavite ga za anonimnu kupovinu. Navedite ga samo kada kupac zahteva račun na firmu (PIB) ili fizičko lice (JMBG/broj pasoša). Za avansne račune (tip_racuna: avans), polje kupac je obavezno — mora sadržati barem jedno od: pib, jmbg ili identifikator.

6Često postavljana pitanja (FAQ)

Koliko traje obrada zahteva?

Prosečno vreme odgovora je 1-3 sekunde. VSDC (Virtual Sales Data Controller — virtuelni procesor fiskalnih računa Poreske uprave) obrađuje zahtev i vraća verifikacioni kod. Preporučujemo timeout od 30 sekundi za sigurnost.

Koji su podržani načini plaćanja?

Vrednost Opis
gotovinaGotovina
karticaPlatna kartica
virmanVirmansko plaćanje
vaucerVaučer / poklon kartica
instantInstant plaćanje (IPS QR)
drugoDrugo bezgotovinsko plaćanje

Šta ako VSDC nije dostupan?

U slučaju nedostupnosti VSDC servisa, API vraća odgovarajuću grešku. Preporučujemo implementaciju retry mehanizma sa eksponencijalnim back-off-om — npr. ponovni pokušaji nakon 1s, 2s, 4s (maksimalno 3 pokušaja).

Kako da testiram bez stvarne fiskalizacije?

Koristite tip računa "tip_racuna": "obuka" (Training režim, interni kod T, VSDC InvoiceType: 3). Ovi računi se šalju VSDC-u i dobijaju PFR broj, ali su eksplicitno označeni kao nevažeći — na računu piše "OVO NIJE FISKALNI RAČUN". Korisni za testiranje integracije bez trošenja kvote pravih računa.

Da li mogu poslati više stavki u jednom računu?

Da, niz stavke može sadržati neograničen broj artikala. Svaka stavka mora imati naziv, kolicina, jedinicna_cena i pdv_stopa. Opciono možete dodati popust (fiksni iznos u RSD) ili rabat_procenat (0-100%) - ali ne oba istovremeno na istoj stavci. Sistem automatski izračunava ukupne iznose i PDV.

7Kontakt i podrška

Za sva pitanja, tehničku podršku ili prijavu problema:

Dodatni resursi: