Invio richiesta di Download massivo al servizio web

Ciao a tutti.
Abbiamo accreditato il canale SDICOOP, abbiamo anche ottenuto l’autorizzazione ad essere listati nell’elenco dei provider abilitati.
Tuttavia non riusciamo a inoltrare una richiesta di scarico massivo al servizio https://servizi.fatturapa.it/sm-scarico-file.

L’invio della richiesta avviene senza problemi, il servizio risponde correttamente con l’ID della richiesta creata.

Ma all’interrogazione “dell’esito richiesta” riceviamo sempre un ST02 (scartata), con un vago messaggio “File non conforme al tracciato .
In alcune prove, il messaggio di errore sembra più parlante: “File non conforme al tracciato , Cannot find the declaration of element 'ns1:InputMassivo”, da cui posso immaginare che ci siano problemi di validazione del file XML.

Il servizio come indicato in documentazione richiede di trasmettere un file XML in base64 contenente la richiesta stessa.

Questo l’XML della richiesta:

<?xml version="1.0" encoding="UTF-8"?>
<ns1:InputMassivo
xsi:schemaLocation="http://www.sogei.it/InputPubblico https://www.fatturapa.gov.it/export/documenti/ws/servizimassivi/InputMassivo_v1.4.xsd"
xmlns:ns1="http://www.sogei.it/InputPubblico"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
	<ns1:TipoRichiesta>
    	<ns1:Fatture>
        	<ns1:Richiesta>FATT</ns1:Richiesta>
            <ns1:ElencoPiva>
                <ns1:Piva>XXXXXXXXX</ns1:Piva>
            </ns1:ElencoPiva>

            <ns1:TipoRicerca>PUNTUALE</ns1:TipoRicerca>
            <ns1:FattureRicevute>
            	<ns1:DataEmissione>
                  <ns1:Da>2024-09-01</ns1:Da>
                 <ns1:A>2024-11-01</ns1:A>
               </ns1:DataEmissione>
            	<ns1:Flusso><ns1:Tutte>ALL</ns1:Tutte></ns1:Flusso>
            	<ns1:Ruolo>CESSIONARIO</ns1:Ruolo>
            </ns1:FattureRicevute>
        </ns1:Fatture>
    </ns1:TipoRichiesta>
</ns1:InputMassivo>

Il file è formalmente corretto (validato da un linter che controlla lo schema)

xmllint --noout --schema schema.xsd input.xml

lo schema è quello indicato nella documentazione.

L’XML così formato viene poi firmato digitalmente tramite

openssl smime -sign -in input.xml -out input.xml.p7s -signer certificato.pem -inkey key.pem -outform DER -nodetach

poi encodato in base64 e aggiunto al tag File assieme ai tags TipoRichiesta e NomeFile all’interno del tag FileRichiesta.

Per completezza di test, abbiamo provato anche a firmare il file usando l’app GoSign di infocert.
Qualcuno che si è imbattuto nello stesso problema saprebbe dirmi come risolverlo? O quantomeno dove questa procedura fallisce?

Sto procedendo cercando di analizzare gli errori e capire quale dei due è più “profondo” rispetto alla procedura.
Mi spiego.
Ho la sensazione che i controlli effettuati dal servizio AdE siano in quest’ordine:

  1. lettura dell’XML
    che nel caso non venga riconosciuto un XML ben formato restituisce un generico “File non conforme al tracciato .
  2. verifica dell’XML con lo schema
    che nel caso il file non passi il check di validità con lo schema, restituisce un più parlante “File non conforme al tracciato , Cannot find the declaration of element 'ns1:InputMassivo
  3. analisi della firma
    passaggio a cui non credo di essere mai arrivato con le richieste.

Spero di essere stato chiaro e di aver fornito tutte le informazioni necessarie a ricevere un aiuto.
Grazie anticipatamente a tutti.

Alla fine ne sono uscito.
Lascio qualche info per i malcapitati che dovessero inciampare in questo problema.

La maniera di costruire la richiesta è questa:

  • Prepare l’elemento input massivo (come da esempio sopra)
  • Encodarlo in base64
  • Includere questo base64 in questa struttura
<?xml version="1.0" encoding="UTF-8"?>
<ns1:FileRichiesta xmlns:ns1="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/ServiziMassivi/input/RichiestaServiziMassivi/v1.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/ServiziMassivi/input/RichiestaServiziMassivi/v1.0 RichiestaServiziMassivi_v1.0.xsd" versione="1.0" Id="_0">
	<TipoRichiesta>FATT</TipoRichiesta>
	<NomeFile>RichiestaMassiva.xml</NomeFile>
	<File>[...base64...]</File>
</ns1:FileRichiesta>
  • Firmare questa struttura XML
  • Encodare di nuovo l’elemento firmato in base64
  • Includere questo nuovo base64 in questa altra struttura
<?xml version="1.0" encoding="UTF-8"?>
<ns1:FileRichiesta xmlns:ns1="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/ServiziMassivi/input/RichiestaServiziMassivi/v1.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/ServiziMassivi/input/RichiestaServiziMassivi/v1.0 RichiestaServiziMassivi_v1.0.xsd" versione="1.0" Id="_0">
	<TipoRichiesta>FATT</TipoRichiesta>
        <!-- Nota bene il nome del file-->
	<NomeFile>RichiestaMassiva.xml.p7m</NomeFile>
	<File>[...base64...]</File>
</ns1:FileRichiesta>
  • Inviare la richiesta SOAP
    Nota: Questa la maniera di inviare la richiesta firmata con Cades. Nel caso si volesse usare Xades, il File non deve essere .p7m e deve essere presente il Tag subito dopo il Tag

Spero vivamente di aver aiutato qualcuno con queste info.

3 Mi Piace

Buongiorno @zulin scusi il disturbo,
sto provando ad effettuare le operazioni descritte ma a me la risposta è sempre un errore ER04, PARAMETRI DI INPUT NON VALIDI, quindi precedente alla generazione della richiesta.

Questi sono i passaggi eseguiti:

compilo questo template:

<?xml version="1.0" encoding="UTF-8"?>
<ns1:InputMassivo
xsi:schemaLocation="http://www.sogei.it/InputPubblico https://www.fatturapa.gov.it/export/documenti/ws/servizimassivi/InputMassivo_v1.4.xsd"
xmlns:ns1="http://www.sogei.it/InputPubblico"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
	<ns1:TipoRichiesta>
    	<ns1:Fatture>
        	<ns1:Richiesta>FATT</ns1:Richiesta>
            <ns1:ElencoPiva>
                <ns1:Piva>QUI_LA_PARTITA_IVA</ns1:Piva>
            </ns1:ElencoPiva>

            <ns1:TipoRicerca>PUNTUALE</ns1:TipoRicerca>
            <ns1:FattureRicevute>
            	<ns1:DataEmissione>
                  <ns1:Da>2025-01-01</ns1:Da>
                 <ns1:A>2025-01-31</ns1:A>
               </ns1:DataEmissione>
            	<ns1:Flusso><ns1:Tutte>ALL</ns1:Tutte></ns1:Flusso>
            	<ns1:Ruolo>CESSIONARIO</ns1:Ruolo>
            </ns1:FattureRicevute>
        </ns1:Fatture>
    </ns1:TipoRichiesta>
</ns1:InputMassivo>

verifico la sintassi con

xmllint --noout --schema InputMassivo_v1.4.xsd inputmassivo.xml

converto la richiesta xml in base64

inserisco il base64 generato in questo template

<?xml version="1.0" encoding="UTF-8"?>
<ns1:FileRichiesta xmlns:ns1="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/ServiziMassivi/input/RichiestaServiziMassivi/v1.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/ServiziMassivi/input/RichiestaServiziMassivi/v1.0 RichiestaServiziMassivi_v1.0.xsd" versione="1.0" Id="_0">
        <TipoRichiesta>FATT</TipoRichiesta>
        <NomeFile>RichiestaMassiva.xml</NomeFile>
        <File>QUI_IL_BASE64_GENERATO</File>
</ns1:FileRichiesta>

verifico la sintassi con

xmllint --noout --schema RichiestaServiziMassivi_v1.0.xsd dafirmare.xml

firmo la richiesta con questo comando

openssl smime -sign -in <FILE-DA-FIRMARE.xml> -out firmato.xml.p7s -signer /cert/SDI-XXXXXXXXXClient.cer -inkey /cert/client.key -outform DER -nodetach

converto in base64 la richiesta firmata

base64 firmato.xml.p7s > firmato.base64

inserisco il base64 firmato in questo template

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ="http://ivaservizi.agenziaentrate.gov.it/docs/wsdl/ServiziMassivi/v1.0/types">
   <soapenv:Header/>
   <soapenv:Body>
      <typ:InoltroRichiestaRequest>
         <ns1:FileRichiesta xmlns:ns1="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/ServiziMassivi/input/RichiestaServiziMassivi/v1.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/ServiziMassivi/input/RichiestaServiziMassivi/v1.0 RichiestaServiziMassivi_v1.0.xsd" versione="1.0" Id="_0">
	<ns1:NomeFile>RichiestaMassiva.xml.p7m</ns1:NomeFile>
	<ns1:File>QUI_IL_BASE64_DEL_FILE_FIRMATO</ns1:File>
</ns1:FileRichiesta>
      </typ:InoltroRichiestaRequest>
   </soapenv:Body>
</soapenv:Envelope>

invio la richiesta tramite soap

https://servizi.fatturapa.it/sm-scarico-file → inoltroRichiesta

ottenendo la seguente risposta:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <a:InoltroRichiestaResponse xmlns:a="http://ivaservizi.agenziaentrate.gov.it/docs/wsdl/ServiziMassivi/v1.0/types">
         <Errore>
            <Codice>ER04</Codice>
            <Descrizione>PARAMETRI DI INPUT NON VALIDI</Descrizione>
         </Errore>
      </a:InoltroRichiestaResponse>
   </soapenv:Body>
</soapenv:Envelope>

Provando ad effettuare una request a esitoRichiesta con un id generico, ottengo l’errore:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <a:EsitoRichiestaResponse xmlns:a="http://ivaservizi.agenziaentrate.gov.it/docs/wsdl/ServiziMassivi/v1.0/types">
         <Errore>
            <Codice>ER05</Codice>
            <Descrizione>DATO NON TROVATO</Descrizione>
         </Errore>
      </a:EsitoRichiestaResponse>
   </soapenv:Body>
</soapenv:Envelope>

quindi non penso ci siano problemi a livello di certificati peri l canale di trasmissione.

Risolto, scusa il disturbo.
Se servisse a qualcuno, nel body della envelope è necessario rimuovere il namespace davanti a FileRichiesta, quindi non:

<ns1:FileRichiesta xmlns:ns1="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/ServiziMassivi/input/RichiestaServiziMassivi/v1.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/ServiziMassivi/input/RichiestaServiziMassivi/v1.0 RichiestaServiziMassivi_v1.0.xsd" versione="1.0" Id="_0">
	<NomeFile>RichiestaMassiva.xml.p7m</NomeFile>
	<File>QUI_IL_BASE64_DEL_FILE_FIRMATO</File>
</ns1:FileRichiesta>

ma

<FileRichiesta xmlns:ns1="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/ServiziMassivi/input/RichiestaServiziMassivi/v1.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/ServiziMassivi/input/RichiestaServiziMassivi/v1.0 RichiestaServiziMassivi_v1.0.xsd" versione="1.0" Id="_0">
	<NomeFile>RichiestaMassiva.xml.p7m</NomeFile>
	<File>QUI_IL_BASE64_DEL_FILE_FIRMATO</File>
</FileRichiesta>

Salve, ho seguito le vostre indicazioni per le richieste di invio e fin lì tutto bene. Ma quanto tempo ci vuole per avere l’esito? Più o meno… Dalle nostre prove anche 6 ore… Che voi sappiate c’è un altro metodo per scaricare le fatture per i nostri clienti? Ci interessa un profondità iniziale di 90gg e poi sempre gli ultimi 15.

Grazie

@DevPGS
Ho implementato tutto, ma mi incastro sulla firma dell’XML.
SDI risponde con il messaggio: “Certification Authority non affidabile”.

Tu che certificati hai usato?
openssl smime -sign -in <FILE-DA-FIRMARE.xml> -out firmato.xml.p7s -signer /cert/SDI-XXXXXXXXXClient.cer -inkey /cert/client.key -outform DER -nodetach

SDI-XXXXXXXXXClient.cer è il certificato che ha generato SDI quando hai fatto i test di interoperabilità?
Perché io sto usando quello, ma non gli piace…

Grazie

I certificati che da’ SDI sono SOLO per la sessione TLS (HTTPS), se vuoi firmare gli XML (obbligatorio per le FPA, opzionale per le FPR) DEVI usare un certificato rilasciato da una CA riconosciuta da SDI.
Ma di fatto non c’è nessuno che ti rilascia un tale certificato, trovi solo servizi che ti firmano i files direttamente, senza darti accesso al certificato (es. Aruba, e molti altri)

Grazie per la risposta @aladema.
Ho capito lo scenario, e per essere più precisi i certificati di SDI vanno bene anche per firmare, ma la firma è accettata solo sugli endpoint di test, mentre quando si passa in produzione è richiesta una firma qualificata.

Potresti suggerirmi un provider che esponga delle API in modo da firmare con firma qualificata per via programmatica? Tu come hai risolto la questione della firma?

Grazie, e buon lavoro

Noi usiamo da anni Aruba ARSS, in pratica compri accesso ad un classico servizio web remoto al quale passare il file da firmare. Nel processo di acquisto e attivazione ti verificano e creano un certificato per te, pero’ gestito e conservato da loro.

Ok Grazie @aladema!!
Mi pare di capire però che sia un processo di firma che prevede l’uso di un OTP, quindi non un processo totalmente automatizzato…
Provo a cercare se esista un provider che fornisca un servizio di firma qualificata che non preveda un passaggio “umano”. Ma forse non esiste, perché sta proprio nelle specifiche di firma qualificata!!

Grazie ancora

Ma certo che è automatizzato :slight_smile:
E’ un servizio web pensato proprio per i casi di firme massive per documenti (non necessariamente file XML di fatture elettroniche, puoi scegliere es. se firmare CaDES , PAdES, XAdES).
Superata la configurazione iniziale post-acquisto il resto è totalmente automatizzato, invochi le loro API e hai indietro il file firmato.

Ah OK! Allora bene!
(Mi sa che devo leggere meglio…)

Grazie ancora e buona domenica

Si, se può essere utile noi abbiamo sviluppato e forniamo un tool che scarica fatture e notifiche dal portale Fatture&Corrispettivi, senza attese, usando solo le credenziali Fisconline (dell’utente o vostre se vi incarica o delega alla consultazione delle fatture), senza necessità di firma digitale.

1 Mi Piace

Si, scusa il ritardo, ho visto che hai già risolto. Nel caso servisse a qualcun altro, qui avevo scritto la stessa guida in modo più esaustivo, riportando l’indicazione del certificato valido per la produzione/gli esiti/le operazioni successive.

DevPGS/sdicoop-scarico-massive: Istruzioni per scarico fatture da sdi servizio massivo