>E-factura tutorial
Tutorial e-Factura ANAF web API token JWT
by Vasile Borza
Î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
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 29.08.2024
Vin aici cu detalii mai precise in completarea propunerii de mai jos:
- Tokenul Upload să rămână nemodificat (nu contine parametrul family), pentru a nu altera timpul de validare al tokenului;
- Tokenul Refresh sa nu mai fie inițializat odata cu refreșul tokenului Upload, cum pare ca stau lucrurile în prezent;
- Tokenul Refresh sa nu poata fi utilizat în locul tokenului Upload;
- Tokenul Refresh sa conțină parametrul Family si acesta să fie verificat la fiecare utilizare a tokenului Refresh pentru initțializare a tokenului Upload (la 3 luni);
- La expirarea tokenului Refresh (la 3 ani) sau la orice regenerare a perechii Token Upload- Token Refresh (cand se utilizeza certificatul digital) sa se preia 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 Upload - Token Refresh a firmei atacate.
16.03.2024
Propun introducerea unui parametru suplimentar la obținerea codului de autorizare &family=X (un caracter) în vederea obținerii tokenului JWT. Acest parametru să fie legat din punct de vedere informatic, de certificatul digital pe baza caruia se generează codul de autorizare destinat obținerii tokenului JWT. Toate Tokenurile virtuale generate ulterior (pentru upload sau refresh), să conțina în interior acest parametru. Tokenurile virtuale să fie validate la utilizare și din acest punct de vedere, adică să aparțină familiei actuale specificată la obținerea ultimului cod de autorizare pe certificatul respectiv (codul optional family). O solicitare de nou token cu o altă valoare a parametrului &family=Y făcută de titularul certificatului digital, să conducă automat la invalidarea accesului întregii familii de tokenuri virtuale existente anterior care contin în interor parametrul family=X.
code Cod tranzacție obținut în linia de comandă 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 obținută mai sus
token_jwt_refresh Valoare token refresh JWT obținută mai sus
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.
{
"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!