Api per emettere lo Scontrino ELettronico dal gestionale?

Lo genera il JS dopo il post a ../telematico

proprio per questo motivo ho dovuto usare playwright, con node non riuscivo a replicare, magari ero solo stanco ma avevo bisogno di una soluzione tampone

Sì, ho verificato: per la precisione x-appl viene restituito come header dalla response della chiamata a https://ivaservizi.agenziaentrate.gov.it/instr/instradamento-fatture-rest/rs/initLight

riuscite a superare https://ivaservizi.agenziaentrate.gov.it/instr/instradamento-fatture-rest/rs/setUserChoice ??

No, nemmeno io riesco. Passo tutti i cookie e anche l’header x-appl (recuperato dalla request come nel mio post precedente), ma ricevo come errore 406 Not Acceptable.

Le sto provando tutte ma niente. Qualche altra idea?

Non riesco a reperire il Cookie JSESSIONID. Qualcuno mi può dare una mano?

io “409 Conflict” e non mi genera il cookie B2BCookie :frowning:

Io il 409 Conflict l’ho risolto passando l’header x-appl (ovviamente dev’essere corretto, quello fornito dal server). Per quale endpoint ti dà errore 409 Conflict?

Il 409 è su SetUserChoice

x-appl lo passo, oltretutto controllo e eventuali cambiamenti di valore (che non ci sono) tra una richiesta e l’altra

Riusciamo a fare un elenco completo ed ordinato di URL, metodi, headers, cookies, Origin e Referer ?

Buongiorno a tutti, sono riuscito a creare correttamente il documento commerciale, vi lascio i passaggi di seguito**

STEP 1 — Pagina di login**

GET https://iampe.agenziaentrate.gov.it/sam/UI/Login?realm=/agenziaentrate&goto=https%3A%2F%2Fportale.agenziaentrate.gov.it%3A443%2FPortaleWeb%2Fhome%3Fto%3DFATBTB

  • Carica la pagina di login e inizializza i cookie SIAMPE

STEP 2 — Login telematico

POST https://iampe.agenziaentrate.gov.it/api/login/telematico

  • Headers: Content-Type: application/json;charset=utf-8, Referer: .../sam/UI/Login, Origin: https://iampe.agenziaentrate.gov.it

  • Body JSON: {"username": "<CF>", "pin": "<PIN>", "password": "<PASSWORD>"}

  • Risposta: {"success": true} — imposta i cookie LtpaToken2, cookieutentee0194, portaleCookie

STEP 3 — Accesso al portale

GET https://portale.agenziaentrate.gov.it/PortaleWeb/home?to=FATBTB

STEP 4 — Init portale

GET https://portale.agenziaentrate.gov.it/portale-rest/rs/initPortale?v=<timestamp>&to=FATBTB

  • Può tornare 501, non è bloccante

STEP 5 — Instradamento home

GET https://ivaservizi.agenziaentrate.gov.it/instr/InstradamentofcWeb/home

STEP 6 — initLight (cattura x-appl)

GET https://ivaservizi.agenziaentrate.gov.it/instr/instradamento-fatture-rest/rs/initLight?v=<timestamp>&to=FATBTB

  • Headers: Accept: application/json, text/plain, */*, Referer: .../InstradamentofcWeb/home

  • Importante: dalla response header si cattura x-appl (token di sessione instradamento)

STEP 7 — Wizard

GET https://ivaservizi.agenziaentrate.gov.it/instr/InstradamentofcWeb/wizard

STEP 7b — wizardTemplate

GET https://ivaservizi.agenziaentrate.gov.it/instr/instradamento-fatture-rest/rs/wizardTemplate?v=<timestamp>

  • Headers: x-appl: <valore catturato>

  • Risposta JSON con soloPerMe (boolean) e PIva (array di P.IVA)

STEP 8 — setUserChoice

Se soloPerMe=true e c’è una sola P.IVA, si salta procediWizard e si va direttamente a:

POST https://ivaservizi.agenziaentrate.gov.it/instr/instradamento-fatture-rest/rs/setUserChoice?v=<timestamp>

Altrimenti prima POST procediWizard con {"tipoutenza": "meStesso", "cf": "<CF>"}, poi setUserChoice.

STEP 9b — Ritorno alla home instradamento

GET https://ivaservizi.agenziaentrate.gov.it/instr/InstradamentofcWeb/home

STEP 9c — fullTemplate

GET https://ivaservizi.agenziaentrate.gov.it/instr/instradamento-fatture-rest/rs/fullTemplate?v=<timestamp>

  • Headers: x-appl: <valore>, Referer: .../InstradamentofcWeb/home

STEP 9d — /dp/PI2FC (FONDAMENTALE)

GET https://ivaservizi.agenziaentrate.gov.it/dp/PI2FC

  • Headers: Referer: https://ivaservizi.agenziaentrate.gov.it/instr/InstradamentofcWeb/home

  • Questo è il passaggio chiave: la response imposta il cookie FATSC (domain .agenziaentrate.gov.it), che è il token di autenticazione per tutte le chiamate /ser/api/. Senza questo cookie, tutte le API tornano 401.

STEP 10 — Pagina documenti commerciali

GET https://ivaservizi.agenziaentrate.gov.it/ser/documenticommercialionline/

STEP 10c/10d/10e — Bootstrap API (init sessione)

Da qui in poi NON si usa più x-appl. Gli headers sono quelli del AjaxService AngularJS:

  • GET .../common/testata/v1/info/me

  • GET .../ser/api/documenti/v1/doc/documenti/dati/fiscali

  • GET .../ser/api/documenti/v1/doc/documenti/ultimo/

Queste inizializzano la sessione servlet (JSESSIONID).

STEP 11 — Invio documento

POST https://ivaservizi.agenziaentrate.gov.it/ser/api/documenti/v1/doc/documenti/

  • Stessi headers API di sopra

  • Body JSON: il payload del documento commerciale (stesso formato di prima)

Saluti

1 Mi Piace

Ottimo grazie. Provero subito

Mitico! Faccio le dovute modifiche nel mio programma

Ho problemi nella selezione come incaricato.

Anche io ho il flow da incaricato. Sto provando la soluzione proposta da @publidok nel post precedente e sembra funzionare perfettamente, ma per l’incaricato bisogna fare due modifiche e aggiungere dei passaggi.

Modifiche per il flusso “Incaricato”

Step 7b – wizardTemplate

GET https://ivaservizi.agenziaentrate.gov.it/instr/instradamento-fatture-rest/rs/wizardTemplate?v=<timestamp>

  • Headers: x-appl: <valore catturato>

La richiesta è uguale, ma la response JSON è diversa ed è strutturata così:

{
  "cfUidUltimo": "<codice fiscale personale>",
  "enabledEsercizioOpzioni": false,
  "enabledQrCode": false,
  "enabledVerificaPivaCf": false,
  "hasDelega": false,
  "intermediario": false,
  "richiestaIncarichi": {
    "incarichi": [
      {
        "deleghe": false,
        "incaricante": {
          "cf": "<codice fiscale azienda>",
          "sede": "FOL",
          "tipo": "INCARICO"
        },
        "intermediario": false,
        "tutore": false
      }
    ]
  },
  "serpico": false,
  "soloPerMe": false,
  "tutore": false,
  "tutore_AT": false
}

Step 7c – procediWizard (passaggio aggiuntivo)

POST https://ivaservizi.agenziaentrate.gov.it/instr/instradamento-fatture-rest/rs/procediWizard?v=<timestamp>

  • Headers: x-appl: <valore catturato>
  • Body JSON: {"tipoutenza": "incaricato"}

Step 7d – procediWizard (passaggio aggiuntivo)

POST https://ivaservizi.agenziaentrate.gov.it/instr/instradamento-fatture-rest/rs/procediWizard?v=<timestamp>

  • Headers: x-appl: <valore catturato>
  • Body JSON (attenzione al JSON embeddato dentro al JSON):
{
  "tipoutenza": "incaricato",
  "incaricante": "{\"deleghe\":false,\"incaricante\":{\"cf\":\"<codice fiscale azienda>\",\"sede\":\"FOL\",\"tipo\":\"INCARICO\"},\"intermediario\":false,\"tutore\":false}",
  "tipoincaricante": "incaricoDiretto",
  "pIva": null
}

Step 8 – setUserChoice

POST https://ivaservizi.agenziaentrate.gov.it/instr/instradamento-fatture-rest/rs/setUserChoice?v=<timestamp>

  • Headers: Content-Type: application/json, x-appl: <valore>

Anche qui bisogna modificare il payload JSON (anche qui attenzione al JSON embeddato nel JSON):

{
  "tipoutenza": "incaricato",
  "incaricante": "{\"deleghe\":false,\"incaricante\":{\"cf\":\"<codice fiscale azienda>\",\"sede\":\"FOL\",\"tipo\":\"INCARICO\"},\"intermediario\":false,\"tutore\":false}",
  "tipoincaricante": "incaricoDiretto",
  "cf": "<codice fiscale azienda>"
}

@pubpub grazie mille, in poco tempo ho tolto playwright e ricosturito tutto in node

se a qualcuno serve il codice per node mi scriva lo giro volentieri

Ho seguito i passaggi di Guido ma sono bloccato qui:

=== URL: ivaservizi.agenziaentrate.gov.it/instr/instradamento-fatture-rest/rs/setUserChoice?v=1774364157245 ===
Codice restituito: HTTP/1.1 409 Conflict (409)
11 cookies:
SIAMPELB=02
SIAMPE_TAI=[…]
SIAMPE=[…]
SIAMPLB=[…]
d1826a18ffe5ae8cb10ab7a343423ffb=[…]
COOKIE_SUPPORT=true
GUEST_LANGUAGE_ID=it_IT
LtpaToken2=[…]
cookieutentee0194=[…]
AE=ALREADYSET
portaleCookie=[…]
=== ===

A voi risultano altri cookies ?

Aggiornamento: ho riscritto gli headers e ora funziona e finalmente restituisce il cookie B2BCookie :sweat_smile:

I miei cookie dopo il login sono i seguenti, non corrispondono esattamente:

  0 => "SIAMPELB"
  1 => "SIAMPE_TAI"
  2 => "SIAMPE"
  3 => "SIAMPLB"
  4 => "d1826a18ffe5ae8cb10ab7a343423ffb"
  5 => "LtpaToken2"
  6 => "cookieutentee0194"
  7 => "AE"
  8 => "portaleCookie"
  9 => "B2BCookie"
  10 => "FATSC"

Risolto grazie, ho riscritto gli headers

Signori buonasera.
Stiamo cercando di implementare queste modifiche ma si sbatte il naso sull’errore 409 del setUserChoice.
I cookie ci sono, il x-appl pure.
Due cose non mi sono chiare. Il timestamp usate lo stesso per tutte le chiamate? In setUserChoice si lasciano proprio vuoti cf e pIva nel json?
Saltando questa fase si arriva anche ad avere il cookie FATSC ma senza B2BCookie poi sono tutti errori 400.
Chi ha scritto di aver risoldo quali headers inserisce?

Puff alla fine abbiamo risolto!
Da babbei andavamo a cancellare alcuni header dopo averli inseriti.
cf e pIva ci vogliono in setUserChoice.

Grazie ancora per la lista degli step perchè non ci saremmo mai arrivati.