LICOMP srl Alba Iulia

Tutorial e-Factura ANAF web API token JWT

by Vasile Borza 

Sursa informațiilor privind e-Factura se află aici.

Întregul tutorial se rulează în browserul client. Nu se transmite nimic spre server.

Aplicația Curl poate fi downloadă și instalată de aici: curl for Windows

Documentație privind Curl: curl - The Art Of Scripting HTTP Requests Using Curl

Pentru testarea cu acest simulator a funcționalităților web API ANAF (standardul oauth2) utilizând aplicația sigură și gratuită Curl, se va proceda în felul următor: 

  • se va crea un shortcut pe Desktop pentru cmd.exe

  • se va configura pentru shortcutul creat locația: Start in (directorul de lansare)  la adresa in C:\.....\Curl\curl-8.5.0_4-win64-mingw\bin (adresa unde  a fost dezarhivat Curl)

Aplicația înrolată la ANAF: Efactura-XYZ

client_id Client id obținut la înrolarea aplicației:   

client_secret Client secret obținut la înrolarea aplicației:  

redirect_uri Adresa de Callback a aplicației (adresa web declarată poate fi orice adresa a unui site web funcțional declarată la înregistrarea la  ANAF)

anaf_uri_auhorization Adresa pentru obținere cod intermediar care expira: apelare GET 

response_type_code Comandă pentru obținere cod tranzactie:  

token_content_type Parametru obținere cod jwt autorizare:  

Ramura('code_jwt') (click pe buton) Doar în acest moment (și pentru o scurtă durată de timp), este solicitată și necesară prezentarea certificatului digital.

Propunere pentru echipa tehnică ANAF

Update 17.02.2025

Vin aici cu detalii mai precise in completarea propunerii de a restricționa accesul la tokenul Acces: 

  • Tokenul Acces să rămână nemodificat (nu contine parametrul family), pentru a nu altera timpul de validare al tokenului;
  • Tokenul Refresh sa nu poata fi utilizat în locul tokenului Acces;
  • Tokenul Refresh sa conțină parametrul Family si acesta să fie validat (comparat cel înregistrat la ANAF cu cel memorat în interiorul tokenului Refresh) la fiecare utilizare a tokenului Refresh și dacă totul este în regulă, opțional parametrul Family să poată fi modificat. Această situație apare la reinițializarea tokenului Acces (la 90 zile). Daca parametrul Family conținut în interiorul tokenului Refresh diferă de cel memorat la ANAF, reînoirea tokenului Acces este refuzată;
  • La expirarea tokenului Refresh (la 365 zile) sau la orice regenerare a perechii Token Acces- Token Refresh (cand se utilizeza certificatul digital) sa se preia obligatoriu parametrul Family care poate fi diferit de cel anterior;
  • În absența unui de sistem de blocare al accesului la informațiile conținute în e-factura care să poată fi activat în orice moment, o firma privată poate fi falimentată de concurența care are acces fraudulos la perechea Token Acces- Token Refresh a firmei atacate.

 

code Cod tranzacție obținut în linia de adresă din browser și care expiră 

grant_type Comandă pentru obținere Nivel de autorizare:  

Anaf_uri_token Adresa ANAF pentru obținere Token sau Token refresh apelare POST 

Ramura('token_jwt_new') (click pe buton)

Răspuns primit la cerere de nou token JWT de la ANAF

token_jwt_upload Valoare token JWT Acces obținută mai sus, cu valabilitate 90 zile.

token_jwt_refresh Valoare token JWT Refresh obținută mai sus, cu valabilitate 365 zile. După expirare (după 365 de zile), ANAF întoarce mesajul: "Refresh Token status is expired" și întreaga procedură trebuie reluată luată de la început (de aici)

anaf_uri_hello Adresa ANAF pentru a interoga funcționare token apelare GET

Ramura('hello_curl_jwt') (click pe buton)

grant_type_refresh Comanda pentru obținere refresh token:

Ramura('token_jwt_refresh') (click pe buton)

 

token_jwt_data_expira Informație accesibila (vezi mai jos) dupa decodificare token JWT (Json Web Token)  ca format base64. Este o valoare exprimată în secunde față de reperul absolut 01.01.1970 și  exprimă o durată de 90 zile.

{
  "alg":"RS512",
  "kid":"anaf_2023_2024"
}{
  "token_type":"Bearer",
  "scope":"clientappid issuer role serial",
  "scope_data":[
    {
        "id":"clientappid",
        "value":"08a3f.............................3ee71d0c429e65"
    },
    {
        "id":"issuer",
        "value":"DigiSign"
    },
    {
        "id":"role",
        "value":"HELLO,EFACTURA,ETRANSPORT,SRV_EFACTURA"
    },
    {
        "id":"serial",
        "value":"20:0...................................49:64:0f"
    }
  ],
  "iss":"https://logincert.anaf.ro",
  "clientappid":"08a3fb.....................................................................29e65",
  "efactura":"EFACTURA@SRV_EFACTURA",
  "etransport":"ETRANSPORT",
  "hello":"HELLO",
  "issuer":"DigiSign",
  "roles":"HELLO@EFACTURA@ETRANSPORT@SRV_EFACTURA",
  "serial":"20:0.....................................:64:0f",
  "sub":"200.........................640f",
  "jti":"5ca6..................................................e98023432d",
  "iat":1706875254,
  "exp":1714651254,
  "nbf":1706874954

Data expirare= 01.01.1970+1714651254/3600/24 (secunde convertite in nr. zile)=02.05.2024

 

Selectează aici factura in format .xml

Calea absolută pentru fișierul uploadat pentru comanda upload in Curl

anaf_uri_upload Adresa ANAF pentru a face un upload de fișier apelare POST

cif  Cif pentru care se face upload

Ramura('curl_jwt_upload') (click pe buton)

Răspuns dupa upload cu succes a fișierui .xml (a facturii)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<header xmlns="mfp:anaf:dgti:spv:respUploadFisier:v1" dateResponse="202401132008" ExecutionStatus="0" index_incarcare="5006096656"/>

mesaj_index_incarcare Indexul de încărcare al facturii din raspunsul anterior

anaf_uri_stare Adresa ANAF pentru a constata validarea unui fișier uploadat anterior apelare GET

Ramura('curl_jwt_stare_mesaj_trimis')

Raspuns dupa interogare 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><header xmlns="mfp:anaf:dgti:efactura:stareMesajFactura:v1" stare="ok" id_descarcare="3008662942"/>

anaf_uri_descarcare Adresa ANAF pentru a descarca factura incarcata anterior apelare GET

mesaj_index_descarcare Indexul de descarcare al facturii din raspunsul de mai sus 

Ramura('curl_jwt_descarca_mesaj')

anaf_uri_listare Adresa ANAF pentru a lista mesaje facturi incarcate anterior apelare GET

nr_zile Numarul de zile pentru care se solicita listarea mesajelor incarcate 

Ramura('curl_jwt_lista_mesaje')

Raspuns in fisier text dupa interogare

{"mesaje":[{"data_creare":"202401132004","cif":"17...15","id_solicitare":"5006096454","detalii":"Factura cu id_incarcare=5006096454 emisa de cif_emitent=17...15 pentru cif_beneficiar=5696206","tip":"FACTURA TRIMISA","id":"3008615564"},{"data_creare":"202401132002","cif":"17...15","id_solicitare":"5006096058","detalii":"Factura cu id_incarcare=5006096058 emisa de cif_emitent=17...15 pentru cif_beneficiar=5696206","tip":"FACTURA TRIMISA","id":"3008614996"},{"data_creare":"202401132010","cif":"17...15","id_solicitare":"5006096656","detalii":"Factura cu id_incarcare=5006096656 emisa de cif_emitent=17...15 pentru cif_beneficiar=5696206","tip":"FACTURA TRIMISA","id":"3008662942"}],"serial":"2005062450017e670dd00688a649640f","cui":"47031925,36999340,48952138,2590720011128,42904069,4562834,16436678,17...15,48253474,46334238,48702247,29556145","titlu":"Lista Mesaje disponibile din ultimele 3 zile"}

Categorii de mesaje:  (aici doar cu rol informativ)

Ramura('curl_jwt_lista_mesaje_primite)

{"mesaje":[{"data_creare":"202402212336","cif":"17...15","id_solicitare":"4180409567","detalii":"Factura cu id_incarcare=4180409567 emisa de cif_emitent=22043010 pentru cif_beneficiar=17...15","tip":"FACTURA PRIMITA","id":"3263960843"},{"data_creare":"202402231920","cif":"17...15","id_solicitare":"4177851976","detalii":"Factura cu id_incarcare=4177851976 emisa de cif_emitent=427320 pentru cif_beneficiar=17...15","tip":"FACTURA PRIMITA","id":"3259028370"}],"serial":"2005062450017e670dd00688a649640f","cui":"17...15,4562834,16436678,29556145,36999340,42904069,46334238,47031925,48253474,48702247,48952138,2590720011128","titlu":"Lista Mesaje disponibile din ultimele 5 zile"}

index_descarcare_mesaj_furnizor Indexul de descarcare al facturii furnizorului obtinut din lista de mai sus: 

Ramura('curl_jwt_descarca_factura_primita')

 

anaf_uri_xml_to_pdf Adresa ANAF pentru generarea din fisier xml in forma .pdf, apelare POST 

Ramura('curl_jwt_xml_to_pdf') (fișierul xml se va selecta mai sus și se va completa corect și câmpul care conține calea spre fișier).

 

 Dupa Creare fisier (butonul alaturat) downloadeaza fisierul si copiaza continutul in memorie iar fisierul va trebui sters din downloadari 

Dacă dorești să ne transmiți un mesaj, poți să o faci pe aici!

Adresa E-Mail
Nume
Mesaj
Anti Bot Image   
  

Prezentare servicii web pentru Sistemul national privind factura electronica RO e-Factura

Detalii tehnice ANAF