menu di navigazione del network

[RISOLTO] Notifica di scarto: Content is not allowed in prolog


(Francesco Biegi) #1

Ciao a tutti,
dopo giorni e giorni di patimento sono finalmente riuscito a far invocare il server Soap dal servizio Sdi.

Ora, una volta inviata la fattura il servizio mi risponde con una notifica di scarto:

File non conforme al formato (nella descrizione del messaggio è riportata l?indicazione puntuale della non conformità) : Errore nella parse del file (idSdi 4229231 ): Content is not allowed in prolog.

Se provo a validare il file tramite Controllare la FatturaPA questo viene validato correttamente.

Io non faccio altro che generare il file .xml e inviarlo al metodo ricevi_file.

Ho provato a contattare l’assistenza dove mi è stato detto che l’errore è nel “prologo” -> eh??

A voi è capitato questo errore? Sapete cose significa e come poterlo risolvere ?

Grazie


(Paolo) #2

Ciao, è capitato a me, ieri pomeriggio.
Stavo testando un file XML tramite funzione dal sito ‘controlla la fattura’ e mi ha dato questo errore.
Ho verificato e scoperto che il mio file XML non era stato ‘chiuso’ correttamente, ovvero per un errore inatteso le ultime righe di chiusura tag non erano presenti.

Ti consiglio di controllare l’XML da qui
http://sdi.fatturapa.gov.it/SdI2FatturaPAWeb/AccediAlServizioAction.do?pagina=controlla_fattura

Ciao
Paolo


(Francesco Biegi) #3

Ciao,
testando il file da li mi dice che va tutto bene…

Guardando meglio mi ero dimenticato la dicitura xml in cima al file:

<?xml version="1.0" encoding="UTF-8"?>

Ora però i servizi sono offline quindi non ho modo di verificare quale altro errore mi darà


(Paolo) #4

Si, in generale mi sembra un errore riferito alla struttura XML del file.
Ok quando torneranno online tienici aggiornati, grazie.


(Francesco Biegi) #5

Usando Laravel ho dei problemi ad inserire quella dicitura, quindi l’ho inserita come php “secco”:

<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>

Ho volutamente inserito degli errori nel file, tipo codice destinatario piu corto del dovuto (proprio perche devo implementare la notifica di scarto)
Ora il test per la validità del file mi da errore (giustamente) ma l’xml è formalmente valido (validato con xml parser online).

Vediamo cosa ottengo appena il servizio torna su


(Francesco Biegi) #6

Ho riprovato in questo momento e ho ancora lo stesso errore.

E’ capitato ad altri ?

EDIT: Ho provato a validarlo online usando l’xml e l’xsd e ottengo lo stesso errore, ma non riesco a capire quale sia il problema


(Francesco Biegi) #7

In questi giorni ho avuto tantissimi problemi, uno dei quali abbastanza anomalo, “Content is not allowed in prolog” durante la fase di ricezione notifica da parte di Sdi.

Questo errore avviene quando all’inizio dell’XML che si invia è presente il BOM (ovvero il file è in formato UTF-8 with BOM).

Per risolvere questo ho modificato:

$fileSdIAccoglienza = new \stdClass();
$fileSdIAccoglienza->NomeFile = basename($fattura);
$fileSdIAccoglienza->File = base64_encode(file_get_contents($fattura));

in

$fileSdIAccoglienza = new \stdClass();
$fileSdIAccoglienza->NomeFile = $filename;
$str = file_get_contents($filePath);
$str = str_replace("\xEF\xBB\xBF",'',$str);
$fileSdIAccoglienza->File = $str;

Sul server ho PHP 7.0 (anche con PHP 7.2 dava lo stesso problema).

Se qualcuno con PHP dovesse avere lo stesso problema, questo potrebbe aiutare.


(Giacomo Santamaria) #8

Ciao Francesco, cosa hai usato con laravel per creare i servizi SOAP per la ricezione delle fatture ? Perchè era mia intenzione sviluppare con Laravel che conosco abbastanza bene ma non ho capito ancora che libreria usare.
Grazie.


(Francesco Biegi) #9

Ciao Giacomo,
in fase di accreditamento ho dato un dominio “fittizio”, non il mio dominio principale.

Farò una cosa abbastanza contorta: creo su una macchina un application server che risponde al dominio dato in fase di accreditamento per gestire la comunicazione SOAP. In fase di ricezione notifiche le intercetto recuperando l’xml. Questo verrà trasferito su un server e con un job laravel vado a recuperare i file e li elaboro.

In breve, laravel non ha gli endpoint dell’sdi.


(Giacomo Santamaria) #10

Ok grazie. L’unica libreria che ho trovato degna di note è zoap. Attualmente ho in funzione il server SOAP che riceve le risposte (jetty 9 + Axis) ma mi interessava farlo completamente con laravel.


(Marco Pagnoni) #11

A me succedeva perché (stupidamente) mandavo su la fattura firmata con un nome file che non terminava in .xml.p7m ma solo in .xml; evidentemente il parsing del messaggio si basa sull’estensione del nome file (e non sul mime type dell’attachment MTOM per dire). Sistemato il nome file tutto ok