SDICoop: configurazione PHP SoapClient / SoapServer (Apache) per invio e ricezione di test

Ho trovato il motivo.
Se confronto il mykey.key generato in ambiente di produzione, il suo md5 combacia con il file “Certificato Client” che ho scaricato da sdi.fatturapa.gov in Strumenti -> Certire il canale -> Test interoperabilità -> Downliad file per test.

Voi state state usando il .key generato dalla macchina di produzione… ?

Assolutamente si! :grinning: Probabilmente il tuo problema è quello.

Uhm… visto che la sezione sul sito si chiama “Download file per test” io stavo usando la parte “test”. Ora provo col file di produzione… tanto cambiando l’endpoint della chiamata dovrebbe andar bene… al massimo carico la prima fattura al mitico pippo in prod :unamused:

@arolando @cesco69 usando la chiave di prod sono riuscito ad andare avanti, adesso la chiamata viene effettuata ma mi risponde con Internal error

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
	<soapenv:Body>
		<soapenv:Fault xmlns:axis2ns1="http://schemas.xmlsoap.org/soap/envelope/">
			<faultcode>axis2ns1:Server</faultcode>
			<faultstring>Internal Error</faultstring>
			<detail/>
		</soapenv:Fault>
	</soapenv:Body>
</soapenv:Envelope>

Avete modo di passarmi un esempio di fattura xml? Nel KitDiTest.zip doveva esserci questo file, ma non c’era… quindi sono andato un pò a intuito… ma non è stato sufficiente…

grazie per l’aiuto e la pazienza!

prova questa https://github.com/italia/fatturapa-testsdi/blob/master/tests/samples/invoices/IT01234567890_FPR01.xml

1 Mi Piace

Grazie!!! con quel file funziona!
Senza questo forum, potevo starci 1000 anni…

2 Mi Piace

@cesco69 ah… ultima cosa… ma voi avete capito come funziona il flusso? Nel senso, io con questo RiceviFile mando loro la fattura… mi risponde con un IdentificativoSdi e poi… ?

Io ho fatto l’accredito per il flusso semplificato sia in trasmissione che in ricezione, ma poi non mi è molto chiaro che altre operazioni/endpoint si debbano chiamare…

Guardati questo, il flusso è spiegato bene:

Con RiceviFile invii la fattura ed ottiendi in risposta un IdentificativoSdi.
Dopo alcuni secondi/minuti il tuo server soap di trasmissione (TrasmissioneFatture), riceverà la notifica.

Grazie! mi studio l’esempio quel repository!

1 Mi Piace

Come sviluppatori di fatturapa-testsdi ci fa molto piacere se il nostro lavoro vi è utile come riferimento documentale o come fonte di code snippets !
Nello spirito dell’open source il modo migliore di restituire quello che il testsdi vi ha dato è darci dei feed-back costruttivi, es. issues e PR su github. Purtroppo in queste settimane non riusciamo a star dietro a tutto in tempo reale ma faremo del nostro meglio. Intanto grazie per tutti i contributi che avete già mandato !

1 Mi Piace

@simevo una curiosità.

Qual’è il ruolo del team digitale? non ho ben capito se siete un team legato a sogei o un entità a parte.

Ciao sul team digitale trovi tutto qui: https://teamdigitale.governo.it/ (è una struttura commissariale a supporto della Presidenza del Consiglio dei Ministri).

Noi (simevo) siamo una startup che oltre a partecipare qui sul forum da un bel po’, da giugno a ottobre 2018 abbiamo affiancato il teamdigitale su SPID e FattturaPA sviluppando moduli, pacchetti e altre cose.

@simevo sicuramente quello che manca sono istruzioni per la configurazione virtual host per apache, se vuoi apro una issue come feature request in github.

Dopo essere riuscito ieri ad inviare la fattura, ora sono impantanato nella ricezione della notifica di esito con errore: General SSLEngine problem

Oltretutto in fase di accreditamento io ho dato come endpoint questi due:
TEST
https://test.dominio.it/sdi/in
https://test.dominio.it/sdi/out

PROD
https://dominio.it/sdi/in
https://dominio.it/sdi/out

Purtroppo però il mio sottodominio ha già un certificato https (senza contare dominio.it che è l’attuale server di produzione, che ha anch’esso il certificato HTTPS)

Dovrei quindi (anche se non ho la più pallida idea se si possa / come fare :smiley: ) riuscire ad installare entrambi i certificati sul server ? (il mio più quello di SDI)

Tra l’altro, io uso nginx ( che già risponde a test.dominio.it) quindi ho dovuto fare un forward di sdi/in verso un server apache (dove volevo installare il certificato dell’SDI)

Voi come avete risolto ? Ho letto un pò di thread ma ho una confusione in testa assurda…

Ho provato poi a spegnere nginx e lasciare acceso solo apache e adesso mi da questo errore:
org.apache.axis2.AxisFault: HTTP ( 301 ) Moved Permanently address : https://26.2.162.231:80

Tra l’altro, non posso nemmeno vedere il wsdl perche sul mio dominio è attivo HSTS.
Quindi non riesco a capire se l’errore è su come ho configurato i certificati (ma li ho fatti come descritto poco sopra in questo thread) o nella classe php che ho scritto (che sono due righe):

<?php

class SdIRiceviNotificaHandler
{
    public function NotificaEsito($parametersIn)
    {
        $xmlString = base64_decode($parametersIn->File);

        return $xmlString;
    }
}

$wsdl = 'wsdl/SdIRiceviNotifica_v1.0.wsdl';

$soapServer = new \SoapServer($wsdl);
$soapServer->setClass('SdIRiceviNotificaHandler');
$soapServer->handle();

@Francesco_Biegi, NotificaEsito come da wsdl non deve ritornare nulla, quindi:

public function NotificaEsito($parametersIn)
{
    $xmlString = base64_decode($parametersIn->File);
}

per quanto riguarda la configurazione dei certificati sul server, se hai già dei certificati installati non puoi installarne altri. A meno di dinfigurazioni che ignoro, la regola è un solo certificato per host.

A questo punto credo ti convenga rifare l’accreditamento e cambiare gli endpoint.

@cesco69 si ho già fatto la richiesta ieri. Magari se avessero spiegato un pò meglio le cose avrei evitato di dare un dominio già esistente…

Comunque ora in test ho spento nginx e vado solo con apache, quindi carico solo il certificato dell’agenzia.

Comunque, anche modificando NotificaEsito senza il return ottengo ancora:
org.apache.axis2.AxisFault: HTTP ( 301 ) Moved Permanently address : https://26.2.162.231:80

Ho visto però che il file SdIRiceviNotifica_v1.0.wsdl ha in soapbind:address la url https://servizi.fatturapa.it/ricevi_notifica. Io sto facendo le prove in test, devo cambiarlo in https://testservizi.fatturapa.it/ricevi_notifica ?

Questo è il file di apache:

    <VirtualHost _default_:443>
    	
    	ServerAdmin webmaster@localhost
    	DocumentRoot /myroot


    	ErrorLog ${APACHE_LOG_DIR}/error.log
    	CustomLog ${APACHE_LOG_DIR}/access.log combined


    	<IfModule mod_proxy_fcgi.c>
        	<FilesMatch \.php$>
        		SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost/"
         	</FilesMatch>
    	</IfModule>

SSLEngine On

    # certificato firmato dall'Agenzia (fompato ASCII/PEM)
    SSLCertificateFile "certificates/SDI-xxxx-Server.pem"

    # chiave privata usata per generare la richiesta di certificato
    SSLCertificateKeyFile  "certificates/prod_mykey.key"

    # certificato dell’autorità di certificatione dell’agenzia
    SSLCertificateChainFile "certificates/caentrate.der"

    SSLCACertificateFile "certificates/CA_Agenzia_delle_Entrate_all.pem"

    SSLStrictSNIVHostCheck off

    </VirtualHost>

gli endpoint a cui riferirti sono definiti nel nell’accordo di servizio e sono:

Nome WSDL: SdIRiceviFile_v1.0.wsdl
Endpoint: https://servizi.fatturapa.it/ricevi_file
Endpoint di test: https://testservizi.fatturapa.it/ricevi_file

Nome WSDL: SdIRiceviNotifica_v1.0.wsdl
Endpoint: https://servizi.fatturapa.it/ricevi_notifica
Endpoint di test: https://testservizi.fatturapa.it/ricevi_notifica

Nome WSDL: SdITrasmissioneFile_v2.0.wsdl
Endpoint: https://servizi.fatturapa.it/dati-fattura
Endpoint di test: https://testservizi.fatturapa.it/dati-fattura

Si, quelli li ho. Quindi nel file SdiRiceviNotifica_v1.0.wsdl ho messo <soapbind:address location=“https://testservizi.fatturapa.it/ricevi_notifica” /> Ma continua a darmi quel maledetto 301 …

Per ricevere la notifica, devo modificare qualche altro file che tu sappia ? La configurazione di Apache ho provato a riguardarla ma mi pare uguale a come l’avevi descritta poco sopra…

Hai mai avuto quell’errore ? Non so piu dove sbattere la testa… e sono solo all’inizio (2° giorno)

ma non devi modificare i wdls, devi solo indicare la location nel SdiSoapClient, per il client e non fare null’altro per il SoapServer