Newsgroup: it.comp.lang.delphi
Titolo: Connessione ed interazione con webserver

Ho la necessità di connettermi ed interagire con i webservices del 
sistema tessera sanitaria per trasmettere un solo file di dati.
 
Questi webservices dialogano con il protocollo soap e non si possono 
importare.
 
Tra i componenti di delphi2010 trovo, nella palette webservices, il 
componente TSoapConnection.
 
L'help in linea di delphi non mi è d'aiuto e non ho capito con quali 
altri componenti gestisco poi la connessione ed il dialogo con il 
webservice.
 
Online trovo parecchia roba ma, essendo proprio digiuno di queste cose, 
mi perdo facilmente.
 
Qualcuno potrebbe darmi un spunto?
 
Grazie.

 importare.
 
 
Cioè, non è possibile generare la classe proxy con il wsdlimporter?
Hai provato? Ti da errori o che altro?
 
 
A.

Aggiungo: se hai un link magari qualcuno riesce a fare una prova veloce...
 
A.

 
Credo ti riferisca alla trasmissione dei dati relativi al 730 da parte di strutture sanitarie (farmacie, laboratori di analisi, ...)
 
In questo caso, se hai fatto richiesta del Kit di integrazione (o se te lo ha fatto pervenire il tuo cliente finale) trovi all'interno molte informazioni su come fare la procedura per il trasferimento dei dati.
 
Io ho mandato una mail direttamente a gestionets @ 
sogei.it
 che mi ha fatto pervenire il kit di integrazione
 
Nella mail, oltre al kit (una serie di file di documentazione e di esempio), era presente anche un link alla documentazione online:
http://sistemats1.sanita.finanze.it/wps/portal/portalets/sistematsinforma/730%20-%20Spese%20sanitarie
 
 
Ho realizzato questa integrazione ancora alla fine del 2015 e credo di aver utilizzato la versione XE7 di Delphi, nella quale ho effettuato l'import del wsdl come suggerito anche da Alberto Salvati


 
ho importato il wsdl presente nel kit tessera sanitaria.
 
Delphi mi ha creato due classi: TRicevutaInvio e TProprietario
 
una interfaccia definita come segue:
 
InvioTelematicoSS730pMtom = interface(IInvokable)
['{1F58756D-A2E0-C47D-0817-8E685DCE51B1}']
   function inviaFileMtom(const nomeFileAllegato:
                          tipoNomeFileAllegato;
                          const pincodeInvianteCifrato: string;
                          const datiProprietario: TProprietario;
                          const opzionale1: string;
                          const opzionale2: string;
                          const opzionale3: string;
                          const documento: TByteDynArray):
   TRicevutaInvio; stdcall;
end;
 
e la function che segue:
 
function GetInvioTelematicoSS730pMtom(UseWSDL: Boolean=System.False; 
Addr: string=''; HTTPRIO: THTTPRIO = nil): InvioTelematicoSS730pMtom;
 
 
Come faccio a passare i parametri alla function dell'interfaccia?
 
il seguente codice sembra funzionare ma non capisco come prelevo i dati 
della ricevuta:
 
procedure TfrmGestioneSistemaTesseraSanitaria.btnInvioClick(Sender: 
TObject);
const
   fnfile = 'Veterinario.zip';
   sPinCode = 'e4XbRBmI';
var
   Proprietario: TProprietario;
   Documento: TByteDynArray;
   Ricevuta: TRicevutaInvio;
   Invio: InvioTelematicoSS730pMtom;
begin
   Proprietario := TProprietario.Create;
   Proprietario.cfProprietario := sPinCode;
   Documento := FileToByteArray(fnFile);
   invio := GetInvioTelematicoSS730pMtom();
 
// Fin qui ci arriva ma come leggo la ricevuta restituita?
 
   CodiceEsito := Ricevuta.CodiceEsito ??????
end;
 
Grazie.

Devi avere una classe che implementa InvioTelematicoSS730pMtom.
Ne crei una istanza e poi: 
 
var
  x: TQualcosaCheImplementaInvioTelematicoSS730pMtom;
  ricevuta: TRicevuta;
 
begin
  ricevuta := x.inviaFileMtom(...);
 

 end;
 
ciao
Giacomo


 
Grazie, così sembra funzionare ma, il webservice (credo sia lui che va 
in eccezione) mi restituisce un errore come se il file xml fosse guasto: 
"Per il documento XML è necessario specificare un elemento di primo 
livello." Line: 0
 
Il file, formalmente è corretto.
 
Suggerimenti?
 
Grazie.
 

> Il file, formalmente è corretto.
 
..cioè...? Con cosa lo hai aperto?
 
 
A.


 
Sia con il blocco note per guardarlo al lumicino :) che con IE 
(applicazione di default).
 
Ciao
 

 (applicazione di default).
 
Buttali via.
Prova ad aprirlo da un browser diverso o da un programma delphi
 
Ancora, prendi un xml formattato in modo diverso, mandalo su e vedi che errori ti da.
 
Essendo un software della PA è stato sciuramente scritto da persone che hanno 25 lauree, 48 master e molto altro, ma poi scrivono programmi cinofallici che in caso di errori sputano fuori messaggi "penali", il tutto basato su direttive di burocrati che spesso sono staccati dalla realtà.
 
 
A.

Mi autoquoto:
 
ricordo come fosse ieri un sito della PA sul quale, durante la registrazione, se scrivevi una password non adatta ti rispondeva con un messaggio "la pw non è conforme al decreto/legge etc etc".
Io feci la parte dell'indiano e scrissi al supporto chiedendo cosa volesse dire.
Devo dirlo: mi risposero entro la mattina dopo.
E mi spiegarono le solite cose: deve essere lunga almeno tot, deve contenere almeno un carattere maiuscolo etc.
 
Sempre facendo l'indiano, chiesi come mai, invece del messaggo scritto in burocratichese. non avessero riportato le 2 righe dell mail.
A questa richiesta non hanno mai risposto.
 
Per non parlare del SIETA...
 
A.

In effetti, in uno dei files che compongono il kit c'è un documento con 
i dati da utilizzare per le prove.
 
In questo file c'è lo username e la password da utilizzare, per i quali, 
però, *non* ho trovato i corrispondenti campi.
 
Ci sono anche altri due dati: "PinCode" e "PinCode cifrato", 
utilizzandoli, durante l'elaborazione dell'istruzione:
Ricevuta := invio.inviaFileMtom(fnfile, sPinCode, Proprietario, '', '', 
'', Documento);
Mi viene presentata una dialog (titolo: "Sicurezza di windows") per 
scegliere il certificato da selezionare (I certificati che mi vengono 
presentati, però, corrispondono a due persone che sono passate nel mio 
PC solo perché hanno firmato digitalmente dei documenti con la card per 
la firma digitale con l'applicazione "dike") e, non sapendo se questi 
certificati vengono trasmessi al webservice e, non volendo coinvolgere 
questi certificati, ho premuto il pulsante "Annulla" ricevendo un nuovo 
errore:
"cvc-particle 3.1: in element inviaFileMtom of type inviaFileMtom, found 
<nomeFileAllegato>, but next item should be nomeFileAllegato."
 
Se cambio l'url da "https://..." a "http://..." ricevo nuovamente 
l'errore precedente che segnalava il file xml guasto!
 
Come posso utilizzare un altro certificato (il mio)?
 
Grazie
 

 Come posso utilizzare un altro certificato (il mio)?
 
Google?
 
 
A.


Anche utilizzando il mio certificato viene fuori lo stesso errore :(

> Anche utilizzando il mio certificato viene fuori lo stesso errore :(
 
cioe', xml non valido?
Hai provato ad aprirlo da Firefox/Chrome?
Hai provato a inviare un xml con struttura diversa rispetto a quella che il web service si aspetta di ricevere?
Aggiungo: non è che oltre XML è previsto l'invio anche in qualche formato testo?
 
A.
 
 


Le specifiche sono di passare:
 
- NomeFileAllegato = nome dos del file;
- PincodeCifrato = un codice cifrato;
- Documento = il file NomeFileAllegato zippato;
- CFProprietario = codice fiscale;
 
Grazie.
 
Ciao.

 Hai provato a inviare un xml con struttura diversa rispetto a quella che il web service si aspetta di ricevere?
 
Provato con il file .dpr del progetto di delphi ed è lo stesso errore. 
E' chiaro, quindi, che il file *non* arriva!
Nel prototipo della funzione il file da allegare è definito come segue:
const documento: TByteDynArray.
 
Poiché in Delphi non c'è una apposita funzione ho utilizzato questa 
reperita in rete (per inciso non ho capito bene perché senza assegnare 
Result la funzione restituisce comunque un risultato):
 
function FIleToByteArray( const FileName : string ) : TByteDynArray;
const
   BLOCK_SIZE=1024;
var
   BytesRead, BytesToWrite, Count : integer;
   F : FIle of Byte;
   pTemp : Pointer;
begin
   AssignFile( F, FileName );
   Reset(F);
   try
     Count := FileSize( F );
     SetLength(Result, Count );
     pTemp := @Result[0];
     BytesRead := BLOCK_SIZE;
     while (BytesRead = BLOCK_SIZE ) do
     begin
       BytesToWrite := Min(Count, BLOCK_SIZE);
       BlockRead(F, pTemp^, BytesToWrite , BytesRead );
       pTemp := Pointer(LongInt(pTemp) + BLOCK_SIZE);
       Count := Count-BytesRead;
     end;
   finally
     CloseFile( F );
   end;
end;
 
ma anche con quest'altra è lo stesso:
 
function ByteStreamToByteArray(const FileName: TFileName): TByteDynArray;
var
   bs: TBytesStream;
begin
   bs := TBytesStream.Create;
   bs.LoadFromFile(FileName);
   Result := TByteDyNArray(bs.bytes);
   bs.Free;
end;
 
Che dipenda da unicode?
 
Grazie.
 
Ciao.

 Suggerimenti?
Se c'e' un link di prova sfruttalo.
A mio tempo non c'era, ma oggi dovrebbe esserci.
Se c'e', manda li il tuo file e analizza gli errori restituiti e, nel caso 
del file xml, controlla bene gli inio-fine di ogni blocco e la gerarchia.
 
Non e' cosi' facile (almeno, per me non lo e' stato!!)
 
Ciao
 
Daniele 
 


 
sono l'username e la password per l'autenticazione
cerca delphi Basic Authentication
eventualmente specifiche per THTTPRIO
 
ciao
 


se conosci dotnet qui c'è un esempio funzionante
www.visual-basic.it/Forum/tabid/151/aft/42746/Default.aspx#.WJBeIPnhBhF
 
 
ciao

 Se c'e' un link di prova sfruttalo.
 
E' proprio quello che sto cercando di fare :)
 
 
Grazie.
 
Ciao

 
 
Ho visto una serie di problemi segnalati, prova a vedere se per alcuni di questi le informazioni qui sotto ti possono aiutare:
 
a) per il certificato da utilizzare, il kit contiene il file SanitelCF.rar nel quale è presente il certificato da utilizzare SaniterCF.cer
 
b) per l'autenticazione da passare, ho trovato un metodo da ridefinire in HTTPRIO che consente di gestire l'autenticazione (ti riporto anche i riferimenti di dove ho trovato gli spunti); FUserName e FPassword sono due variabili del form dove ho gestito la procedura
 
....
 { --- Supporto per Collegamento --- }
  HTTPRIO := THTTPRIO.Create(Self);
 
 { --- Consente anche utilizzo di Certificati non verificati --- }
  HTTPRIO.HTTPWebNode.InvokeOptions := [soPickFirstClientCertificate,soIgnoreInvalidCerts];
 
 { --- Metodo per passare le credenziali di accesso --- }
  HTTPRIO.HTTPWebNode.OnBeforePost := DoHTTPRIOHTTPWebNodeBeforePost;
 
...
 
 
{}
{ --- Gestione Autenticazione --- }
  // See more at: 
http://codeverge.com/embarcadero.delphi.webservices/how-do-i-use-basic-authenticat/1078800#sthash.Umf0FsWD.dpuf
 
{}
procedure TFrmStgHubSysTs.DoHTTPRIOHTTPWebNodeBeforePost( const HTTPReqResp: THTTPReqResp; Data: Pointer);
var S: string;
begin
 { --- Compone testo per Credenziali --- }
  S := 'Authorization: Basic ' + EncodeString( FUserName + ':' + FPassword );
 
 { --- Inserisce Credenziali --- }
  HttpAddRequestHeaders( Data, PChar(S), Length(S), HTTP_ADDREQ_FLAG_ADD );
end;
 
 
c) per quanto riguarda i dati da criptare erano il PinCode dell'inviante, il Codice Fiscale del proprietario e quello del cittadino; io ho utilizzato vari metodi ha poi alla fine ho optato per una chiamata indiretta a openssl tramite file di appoggio; per l'utilizzo diretto (che inizialmente mi funzionava) ho avuto una serie di problemi legati alle varie versioni di Delphi e delle librerie Libeay32 e ssleay32
 
 
d) per il file da inviare è necessario il caricamento del file zip in un array di byte/caratteri per consentire l'invio; io ho utilizzato la lettura tramite stream:
 
function TFrmStgHubSysTs.ReadFileToSend( FileZip: String ): string;
var StringStream: TStringStream;
    FileStream : TFileStream;
    Bytes: TBytes;
    FileData: string;
begin
 { --- Apertura Stream su File --- }
  FileStream:= TFileStream.Create( FileZip,fmOpenRead );
 
 { --- Stream Stringa di Destinazione --- }
  StringStream := TStringStream.Create( '' );
 
  try
   { --- Copia Stream --- }
    StringStream.CopyFrom( FileStream,FileStream.Size );
 
   { --- Lettura file su Stringa --- }
    FileData := StringStream.DataString;
  finally
    StringStream.Free;
    FileStream.Free;
  end;
 
 { --- Risultato --- }
  Result := FileData;
end;

 io non sono riuscito a trovarlo. ;(
Partendo dal link che ha lasciato alessandrob ho trovato quest'altro link
 
http://sistemats1.sanita.finanze.it/wps/wcm/connect/0f7a758c-9638-4e74-95b7-bde0bfab29a5/kit730P_ver_20161223.zip?MOD=AJPERES&CACHEID=0f7a758c-9638-4e74-95b7-bde0bfab29a5
 
 
che praticamente contiene tutto quello che hai bisogno.
Ci sono anche i link per fare i test ovvero, per i veterinari
 
AMBIENTE DI TEST:
--------------------------------------------------------------------------------------------------------------------
https://invioSS730pTest.sanita.finanze.it/InvioTelematicoSS730pMtomWeb/InvioTelematicoSS730pMtomPort
 
https://invioSS730pTest.sanita.finanze.it/Ricevute730ServiceWeb/ricevutePdf
 
https://invioSS730pTest.sanita.finanze.it/EsitoStatoInviiWEB/DettaglioErrori730Service
 
https://invioSS730pTest.sanita.finanze.it/EsitoStatoInviiWEB/EsitoInvioDatiSpesa730Service
 
https://invioSS730pTest.sanita.finanze.it/DocumentoSpesa730pWeb/DocumentoSpesa730pPort
 
https://invioSS730pTest.sanita.finanze.it/ReportMensile730Web/ReportMensilePort
 
https://invioSS730pTest.sanita.finanze.it/InterrogazionePuntuale730Web/InterrogazionePuntuale730Port
 
 
poi ci sono i vari esempi dei file xml che qui non posso allegare perche' 
l'editor non li gradisce.
 
Come ti dicevo nell'altro messaggio il file xml dev'essere uguale a quello 
che trovi dentro il file zippato.
Ci sono davvero tanti esempi, tra cui l'autenticazione.
Non posso aiutarti per tutto cio' che riguarda i certificati perche' non li 
ho mai utilizzati.
 
Il primo test che DEVI superare e' il test del login.
Quando il sistema della sogei ti da ok come risultato, allora ti dedichi al 
file da inviare che, vista la struttura, se hai una griglia e' davvero una 
stupidaggine crearlo.
Ovviamente il login lo devi fare con le credenziali corrette, ovvero con 
l'utente accreditato per l'invio, nel sito di test.
 
Il login lo fai con gli oggetti creati da delphi nella conversione del file 
wsdl.
Nell'oggetto di delphi c'e' gia' tutto, al massimo devi preoccuparti di 
cryptare username e password secondo le direttive del sito a cui ti 
colleghi.
Anche il THTTPRIO lo devi usare con le pinze, io mi ricordo che
 
WSDLLocation e' il drive + path + nomefile.wsdl
Port e Service dovrebbe metterli gia' delphi.
 
Inoltre devi anche saper gestire i vari wsdl  convertiti.
Di solito trovi un wsdl per il login, uno per le richieste, ecc....
 
Ho anche visto che esistono versioni di wsdl con piu' servizi incorporati, 
ma non so come si fa a gestirli.
 
Non e' facile, anzi tutt'altro.
Io (non programmatore ma solo utodidatta che si arrangia per le proprie 
necessita') ho impiegato 1 mese per capire e far funzionare i servizi web di 
cui avevo bisono (login, invio, richieste, letture, listini ecc.. dei 
documenti )
tu dovresti impiegare meno di me !!!, metti in conto tatnte, tante cozzate 
contro il muro.
 
Buon divertimento !!!!
 
Ciao
 
Daniele
 


 
Grazie.
 
Ciao.

Il giorno martedì 31 gennaio 2017 19:52:33 UTC+1, Luigi Siciliano ha scritto:
 
Ti posto un po' di codice che utilizzo per eseguire l'invio sperando che ti possa aiutare.
 
Io utilizzo la tecnica di predisporre il file da inviare, zipparlo e predisporre un file di appoggio con i parametri per l'invio.
Successivamente richiamo la procedura che esegue l'invio vero e proprio
 
Il file di appoggio da cui leggere i dati per l'invio, viene letto con una mia estensione di TIniFile per non memorizzare le password in chiaro nel file di appoggio
 
Anche la risposta (che nel primo invio è sostanzialmente il protocollo) la ri-memorizzo nel file di appoggio, così poi ritorna al processo principale
 
Tra i parametri di passaggio ricevo l'informazione se utilizzare l'area di test o quella di produzione
 
 
procedure TFrmStgHubSysTs.SendToSistemaTs( FileIni: string; TargetTest: boolean );
 
var Ini: TTecnoSysIniFile;
    FileToSend, DataToSend: string;
 
   // Strumenti di Connessione
    HTTPRIO: THTTPRIO;
    F730: InvioTelematicoSS730pMtom;
 
   // dati specifici
    datiProprietario: proprietario;
    nomefileallegato: tipoNomeFileAllegato;
    pincodeInvianteCifrato: string;
    opzionale1: string;
    opzionale2: string;
    opzionale3: string;
    documento: TByteDynArray;
    ricevuta: ricevutaInvio;
begin
 { --- Dati Proprietario --- }
  datiProprietario := proprietario.Create;
 
 { --- Lettura File di Collegamento --- }
  Ini := TTecnoSysIniFile.Create( FileIni );
 
 { --- File da Inviare --- }
  FileToSend := Ini.ReadString( _SysTs_Sec_I,'Zip','' );
 
 { --- Dati Proprietario --- }
  datiProprietario.codiceRegione  := Ini.ReadString( _SysTs_Sec_I,'Reg','' );
  datiProprietario.codiceAsl      := Ini.ReadString( _SysTs_Sec_I,'Asl','' );
  datiProprietario.codiceSSA      := Ini.ReadString( _SysTs_Sec_I,'Pre','' );
  datiProprietario.cfProprietario := Ini.ReadString( _SysTs_Sec_I,'Cfp','' );
 
 { --- PinCode Cifrato --- }
  pincodeInvianteCifrato := Ini.ReadString( _SysTs_Sec_I,'Pin','' );
 
 { --- Credenziali --- }
  FUserName := Ini.ReadPassword( _SysTs_Sec_I,'Usr','' );
  FPassword := Ini.ReadPassword( _SysTs_Sec_I,'Pwd','' );
 
 { --- Libera --- }
  Ini.Free;
 
 
 
 { --- Caricamento file nel buffer di trasmissione --- }
  DataToSend := ReadFileToSend(FileToSend);
 
 { --- Trasferimento nel Buffer --- }
  documento := StrToByteDynArray( DataToSend );
 
 { --- Nome Allegato --- }
  nomefileallegato := ExtractFileName( FileToSend );
 
 { --- Dati Opzionali --- }
  opzionale1 := '';
  opzionale2 := '';
  opzionale3 := '';
 
 
 
 
 { --- Supporto per Collegamento --- }
  HTTPRIO := THTTPRIO.Create(Self);
 
 { --- Consente anche utilizzo di Certificati non verificati --- }
  HTTPRIO.HTTPWebNode.InvokeOptions := [soPickFirstClientCertificate,soIgnoreInvalidCerts];
 
 { --- Metodo per passare le credenziali di accesso --- }
  HTTPRIO.HTTPWebNode.OnBeforePost := DoHTTPRIOHTTPWebNodeBeforePost;
 
 { --- Collegamento Area Test / Produzione --- }
  if TargetTest
    then F730 := GetInvioTelematicoSS730pMtom( False,_Deb_SistemaTs_Send,HTTPRIO )
    else F730 := GetInvioTelematicoSS730pMtom( False,_Prd_SistemaTs_Send,HTTPRIO );
 
 { --- Esegue Invio --- }
  ricevuta := F730.inviaFileMtom( nomefileallegato,pincodeInvianteCifrato,datiproprietario,
                                  opzionale1,opzionale2,opzionale3,documento );
 
 
 
 { --- Scrittura File di Collegamento --- }
  Ini := TTecnoSysIniFile.Create( FileIni );
 
 { --- Dump Risposta --- }
  Ini.WriteString( _SysTs_Sec_O,'Protocollo',Ricevuta.protocollo );
  Ini.WriteString( _SysTs_Sec_O,'dataAccoglienza',Ricevuta.dataAccoglienza );
  Ini.WriteString( _SysTs_Sec_O,'nomeFileAllegato',Ricevuta.nomeFileAllegato );
  Ini.WriteString( _SysTs_Sec_O,'dimensioneFileAllegato',Ricevuta.dimensioneFileAllegato );
  Ini.WriteString( _SysTs_Sec_O,'codiceEsito',Ricevuta.codiceEsito );
  Ini.WriteString( _SysTs_Sec_O,'descrizioneEsito',Ricevuta.descrizioneEsito );
  Ini.WriteString( _SysTs_Sec_O,'idErrore',Ricevuta.idErrore );
 
 { --- Libera --- }
  Ini.Free;
 
end;

Posso chiederti quale versione di delphi utilizzi?
 
Io utilizzo Delphi2010 ed anche con il tuo codice non riesco ugualmente 
a connettermi :( ottengo lo stesso errore.
 
Grazie.
 
Ciao.


Io ho un sistema un po' ibrido...
La procedura che genera il file (quindi la parte gestionale) è scritta ancora con il vecchio Delphi5
 
La procedura che ho utilizzato per la connessione con il webservice è stata scritta verso la fine del 2015 e a suo tempo avevo utilizzato Delphi XE7
 
Ora sto lavorando con Delphi RX1 (10.1 Berlin, non ho ancora installato la versione 10.2), ma non ho provato a ricompilare la procedura di connessione al webservice
 
Sto anche provando la beta della nuova versione Godzilla
 
Ecco anche spiegato il motivo dei file di appoggio...
 
Ciao


Allora potrebbe essere la versione di Delphi che utilizzo (Delphi2010) 
che potrebbe essere troppo vecchia.
 
Grazie.
 
Ciao.
 

 connettermi :( ottengo lo stesso errore.
Scusami, non puoi utilizzare paro paro il codice di alessandrob per fare i 
tuoi test perche'
- il codice non e' completo
- e' riferito alle sue esigenze.
 
Quello fornito e' un punto di partenza.
La parte interessante di quel codice, e che sono curioso come pochi di 
sapere com'e', e' la
 
DoHTTPRIOHTTPWebNodeBeforePost
 
che pero' credo sia molto close (eheheheh).
 
Per il resto e' tutto ben spiegato.
 
Per riassumere, tieni presente da una scala da 0-10 il mio livello 
e' -qualcosa, devi trovare da qualche parte in delphi2010 l'importatore 
wsdl.
Il file da importare e' InvioTelematicoSpeseSanitarie730p.wsdl.
Una volta importato (fa tutto delphi) hai esposto (in ordine di 
presentazione del file .pas)
- RicevutaInvio
- Proprietario
e
  InvioTelematicoSS730pMtom = interface(IInvokable)
  ['{1F58756D-A2E0-C47D-0817-8E685DCE51B1}']
    function  inviaFileMtom(const nomeFileAllegato: tipoNomeFileAllegato; 
const pincodeInvianteCifrato: string; const datiProprietario: proprietario; 
const opzionale1: string; const opzionale2: string; const opzionale3: 
string;
                            const documento: TByteDynArray): ricevutaInvio; 
stdcall;
  end;
function GetInvioTelematicoSS730pMtom(UseWSDL: Boolean=System.False; Addr: 
string=''; HTTPRIO: THTTPRIO = nil): InvioTelematicoSS730pMtom;
 
Nel codice di alessandrob hai
 
  if TargetTest
    then F730 := GetInvioTelematicoSS730pMtom( 
False,_Deb_SistemaTs_Send,HTTPRIO )
    else F730 := GetInvioTelematicoSS730pMtom( 
False,_Prd_SistemaTs_Send,HTTPRIO );
 
Come vedi se e' un test usa il link test altrimenti quello vero della sogei.
 
Infine, hai a disposizione il file
 
InvioTelematicoSpeseSanitarie730p_schema1.xsd
 
che ti permette di capire come dev'eesere fatto il file da inviare.
 
Scusami per la lungaggine.
 
Ciao
 
Daniele 
 

Ciao alessandro,
    in passato ho dovuto usare dei webservice, pero' in quei casi c'era 
sempre un wsdl per accettare il login.
Se andava male, restituiva gli errori del caso.
 
Invece, in questo caso, il login come viene fatto ?
Ho visionato i vari file xml (anche i wsdl) ma non riesco a capire (o meglio 
non trovo la parte dedicata al login).
 
Puoi dare qualche delucidazione?
 
Grazie
 
Ciao
 
Daniele
 
 

 
Nulla di nascosto, non avevo incluso il pezzo di codice perché già fatto in un precedente post. Comunque te lo riporto qui sotto, anche con il riferimento di dove e come ho trovato la soluzione:


 riferimento di dove e come ho trovato la soluzione:
URKA, mi era scappato .....
Terza eta' incombe .....
 
Grazie e alla prossima ...
 
Ciao
 
Daniele
 
 
 


 
Durante l'esecuzione di questa riga mi viene richiesto di inserire nel 
lettore una card CNS. Credo perché non ho indicato alcun certificato di 
autenticazione.
 
E' corretto?
 
Il certificato SanitelCF.cer presente nel kit dovrebbe servire soltanto 
per cifrare il codice fiscale del proprietario e del paziente. o no?
 
Dopo ad aver installato il certificato e lo certo con certmgr.msc lo 
ritrovo nel nodo "Altri utenti".
 
Grazie.
 
Ciao.


 
Non sei tu a doverti scusare (mi stai solo aiutando) ma io perché 
continuo a non comprendere dove sto sbagliando.
 
Grazie.
 
Ciao.

 per cifrare il codice fiscale del proprietario e del paziente. o no?
 
Ciao,
il certificato ti serve solo per cifrare il codice fiscale del mittente e dell'intestatario della fattura/scontrino e del pin code.
 
In non l'ho neppure installato sul mio sistema.
 
Per il login servono nome utente e password da passare al momento della chiamata nell'oggetto HTTPRIO (vedi la richiesta fatta da Daniele)


 
Si, ho provato ad interrogarne l'esito modificando il codice come segue:
if not HttpAddRequestHeaders(Data, PChar(S), Length(S), 
HTTP_ADDREQ_FLAG_ADD) then
     ShowMessage('HttpAddRequestHeaders' + SysErrorMessage(GetLastError()));
 
e non mi viene segnalato nulla :(
 
Grazie.
 
Ciao.

 il webservice è stata scritta verso la fine del 2015 e a suo tempo avevo utilizzato Delphi XE7
 
Ok, ho scaricato la versione di prova di Delphi 10.1 Berlin ed ha 
funzionato al primo colpo :) evidentemente delphi2010 ha qualche 
problema con i webservice :(
 
Adesso, però, mi rifiuta il file allegato con il codice 102 "L'ALLEGATO 
NON E' UN FILE DI TIPO ZIP VALIDO: IL FILE NON E' STATO ACCOLTO"
 
???
 
Ho provato a creare il file .zip con 7zip e non va bene.
Ho provato a creare il file .zip con TotalCommander e non va bene.
 
Suggerimenti?
 
Grazie.
 
Ciao
 
 
 

 Ho provato a creare il file .zip con TotalCommander e non va bene.
 
..ehm..winzip?
Ancora, verifica bene QUALE ALGORITMO HAI USATO.
 
A.

 Suggerimenti?
Posso confermarti che anche io utilizzo 7zip per la compressione (con parametri compressione ultra e formato zip)
 
Credo che il problema sia invece nel caricamento del file zip nella struttura dati per l'invio.
 
Per evitare problemi con unicode, io utilizzo una ansistring per il caricamento del file che successivamente va convertito in TByteDynArray che altro non è che un array di byte.
 
Ciao


 
Inviato, era colpa dell'algoritmo (cioè mia) :(
 
Adesso passo alla verifica della ricevuta.
 
Grazie.
 
Ciao

 Adesso passo alla verifica della ricevuta.
 
Su, che ce la fai! 
 
A.


 
Infatti, il problema era proprio questa conversione.
 
Grazie.
 
Ciao.


Bene!
Ormai ci sei!

 
ma mi da errore nella lettura del file SanitelCF.cer e non va avanti.
 
Ho provato a cifrare il pincode da riga di comando:
openssl rsautl -encrypt -in cf.txt -out cf.enc -inkey SanitelCF.cer 
-certin -pkcs
ma mi viene fuori una cosa con caratteri che sembrano ideogrammi cinesi!?!
 
Naturalmente il pincode cifrato da me non coincide con il pincode 
cifrato di esempio presente nel kit730.
 
Dove sto sbagliando?
 
Grazie.
 
Ciao.
 

 cifrato di esempio presente nel kit730.
La cifratura la faccio esattamente nello stesso modo.
Il risultato sono ideogrammi "cinesi": sono in realtà la codifica del pin o del codice fiscale in byte, ognuno poi visualizzato in base al suo codice ascii
 
Tieni presente che se la fai più volte ottieni sempre un risultato diverso...
L'unico modo per verificare se è corretto sarebbe quello di avere la chiave privata ed eseguire la decodifica, cosa che ovviamente non puoi fare.
 
Esistono riferimenti su internet su come crearsi una propria coppia di chiavi pubbliche e private e con queste eseguire sia la codifica e la decodifica; in questo caso non puoi sicuramente utilizzare il certificato fornito
 
Di sicuro il pincode cifrato disponibile nell'esempio non potrà essere uguale al tuo

 Tieni presente che se la fai più volte ottieni sempre un risultato diverso...
 
Se provo a fare un invio di prova, durante la chiamata InviaFileMtom 
viene fuori un errore "Carattere non valido nel contenuto di testo".
 
Ciao.
 


 
Ho notato che nei files di prova ed anche nel file che dovrei 
trasmettere i codici fiscali cifrati finiscono sempre con il carattere 
"=" mentre nel pincifrato che ottengo questo non si verifica mai e c'è 
sempre un qualche carattere non valido nel testo.
 
Credo che sto codificando con un set di caratteri differente ma, come 
faccio a verificarlo e/o impostarlo da riga di comando?
 
Grazie.
 
Ciao.
 

Salve a tutto il gruppo,
avrei la necessità di realizzare con Delphi XE l'invio telematico dei 730 per un gestionale di un amico Odontoiatra. 
Fino ad ora lo faceva il Commercialista ma essendo cambiatala normativa da Gennaio 2021 ed essendo gli invii con cadenza mensile e non più annuale, il commercialista non glielo fa più, per cui mi ha chiesto di includerlo nel gestionale.
Ho ricevuto dalla Sogei il kit "kit730P_ver_20201218" con tutti i tracciati e gli endpoint, ma chiedevo se c'è qualcuno che ha già risolto e se è disposto a condividere il codice.
Grazie 1000 a tutti

sono qui, se vuoi parliamone

 sono qui, se vuoi parliamone
 
Hai realizzato l'invio del file XML ? Hai del codice da condividere o spiegarmi come l'hai fatto?
Te ne sarei grato.
 
Ciao

 sono qui, se vuoi parliamone
Ciao,
 
@Paolo di Biase
 
avrei la stessa necessità di @oibaf.
Potresti darmi una grossa mano condividendo il tuo codice?
 
Grazie Mille

@oibaf. 
 
Hai risolto?
Sono bloccato e sto cercando qualcuno che possa darmi una mano anche con del codice funzionante.
Disponibile anche a collaborazioni retribuite
 
Grazie a chi volesse darmi una mano
 

 Sono bloccato e sto cercando qualcuno che possa darmi una mano anche con del codice funzionante.
 
Hai importato i webservices in Delphi?
 
Quali problemi riscontri?
 
Ciao.


Non mi sono mai intefacciato con i webservices e poichè ho urgenza di rivolvere
cercavo qualcosa di funzionante da utilizzare.
 
Non avendo molta dimestichezza con l'argomento ho paura di metterci una vita
a risolvere; anche perchè è da qualche anno che non tocco il delphi.
 
Credo di aver risolto la creazione del file XLM da inviare, ma mi manca 
proprio il codice per la comunicazione col sistema TS.
 
Disposto anche a pagare.

 
Io invio un file per un veterinario che una volta l'anno mi passa il 
file che gli genera la sua procedura ed io glielo invio.
 
Che versione di Delphi usi?
 
Ciao.


XE7 e qualche volta il buon vecchio Delphi 7

 Giacomo
 
Ciao Giacomo,
 
nella funzione
 
function inviaFileMtom(const nomeFileAllegato:tipoNomeFileAllegato;
             const pincodeInvianteCifrato: string;
             const datiProprietario: TProprietario;
             const opzionale1: string;
             const opzionale2: string;
             const opzionale3: string;
             const documento: TByteDynArray):
             TRicevutaInvio; stdcall;
    end;
 
come definisco i seguenti Tipi?
 
tipoNomeFileAllegato
TProprietario
TRicevutaInvio
 
Potresti postarmi un codice più completo di esempio?
 
Grazie Mille

 
 
Questi tipi sono definiti nel file 
"InvioTelematicoSpeseSanitarie730p.pas" che ti genera Delphi stesso con 
l'importazione del WDSL.
Ogni versione di Delphi te ne genererà uno diverso. Anche perché legato 
ai percorsi di installazione e di posizione del file WDSL scaricato da 
Tessera Sanitaria.
 
Io ho Delphi2010 Professional che genera un file che poi non funziona :(
 
Con Delphi 10.1 Trial il WDSl importato funzionava ma lo stesso codice 
con Delphi 10.3 Rio Community non funziona :(
 
Con Delphi 10.3 Rio Community, reimportando il WDSL, e cambiando la 
parte di codice con cui si passa la username e la password, rifunziona.
 
E' necessario che sia tu ad importare il WDSL con la tua installazione 
di Delphi.
 
Ciao.


Mi stai dicendo che devo cercare un file "InvioTelematicoSpeseSanitarie730p.wsdl"
compatibile con la mia versione di Delphi?
 
Mi confermi che con  Delphi 10.1 Berlin i tre tipi
 
- tipoNomeFileAllegato 
- TProprietario 
- TRicevutaInvio
 
vengono definiti?
 
 

 
Si, vengono definiti *durante* l'importazione dei file .WDSL che ti ho 
detto sopra e che metterai tra le uses del tuo progetto.
 
Ciao.


Eccomi ancora a disturbare,
 
Ho provato ad importare tutti i file WSDL
 
- EsitoInvioDatiSpesa730Service.wsdl
- DettaglioErrori730Service.wsdl
- DettaglioSegnalazione730Service.wsdl
- EsitoInvioDatiSpesa730Service.wsdl
- InterrogazionePuntuale730Service.wsdl
- ReportMensile730Service.wsdl
- ReportSegnalazioni730Service.wsdl
- RicevutaPdf730Service.wsdl
 
Ma nei file .pas che vengono creati i vari tipi
 - tipoNomeFileAllegato 
 - TProprietario 
 - TRicevutaInvio 
 
Non vengono definiti.
Dove sbaglio ?
 
Grazie Mille

 
 
Mi accorgo adesso che stai seguendo un vecchio thread del 2017, in 
questo thread troverai del codice funzionante che stai cercando e che 
postò "Alessandro B." e che è stato di formidabile aiuto per definire le 
nostre trasmissioni :)
 
Ciao.


Purtroppo in nessuno dei file importati vengono definiti.
Leggerò con crupolosità quanto scritto da  "Alessandro B."
sperando di trovare spunti per sbloccare la situazione.
 
Una domanda ancora:
E' possibile che ci siano versioni più aggiornate del file InvioTelematicoSpeseSanitarie730p.wsdl da importare?
 
Grazie ancora per la tua disponibilità
 
Ciao

 
La versione più recente che mi risulta è nel file: 
kit730P_ver_20201218.zip ma anche nelle versioni precedenti i tipi che 
tu non trovi erano già tutti presenti.
 
Ciao.


Ciao Luigis, 
 
con la versione  kit730P_ver_20201218.zip tutte le classi e i tipi sono definiti perfettamente :)
con la versione kit730P_ver_20180918.zip che stavo utilizzando mancava praticamente tutto il codice delle classi e tipi 
o per lo meno durante l'importazione in delphi non veniva creato il relativo codice.
 
Ora non mi resta che smanettare un pò con le varie porzioni di codice su questo thread 
 
Grazie Mille


Ciao,
io uso Delphi XE7 e sono arrivato a buon punto con la soluzione, grazie alla collaborazione con @Paolo di Biase. Se hai bisogno di qualcosa chiedi pure.
Saluti

Ciao,
ci sono anche io se avete qualche domanda
 
Alessandro


Eccola subito pronta,
con Delphi XE7 ho realizzato l'invio delle fatture e la lettura del file PDF di risposta e tutto funziona. Ho il problema di leggere il file CSV di risposta usando la unit "DettaglioErrori730Service", in particolare la funzione "DettaglioErrori(_ParametriRichiesta).esitiPositivi.dettagliEsito.csv" che ritorna un tipo TByteDynArray ma con XE7 non riesco a gestirlo, la funzione "TEncoding.ANSI.GetString", per convertire il file ricevuto in String, accetta come parametro un tipo Bytes.
Te come l'hai risolto. 
Grazie
Fabio


Trovata la soluzione,
modificata la property "csv" della classe "dettaglioEsitoPositivo" da TByteDynArray a TArray<System.Byte>


Ottimo,
 
appena avrò un pò di tempo mi cimenterò e sicuramente dovrò disturbarvi tutti :-P
Siete fantastici e gentilissimi.
 
Grazie per la vostra disponibilità
A Presto / Prestissimo

 end;
 
Ciao Alessandro,
 
leggo con interesse il tuo codice.
potresti indicarmi dove vengono definiti i seguenti tipi?
 
 // dati specifici
  datiProprietario: proprietario;
  nomefileallegato: tipoNomeFileAllegato;
  ricevuta: ricevutaInvio;
 
 
Grazie Mille


perdona la mia insistenza.
Ho dovuto reimportare tutti i file wsdl e sembra andare meglio se non fosse
per il tipo 
 
// dati specifici
documento: TByteDynArray;
 
Non riesco proprio a definire il tipo TByteDynArray;  
 
potresti illuminarmi?
 
Grazie Mille
Leo

 
 
Con Delphi 10.3 Rio prova a mettere nelle uses il file "Types".
 
Ciao.


Perfetto, mancava proprio quella specifica nelle uses
 
Grazie Mille 


Ciao, sto prendendo spunto dal tuo codice,
ma non riesco a capire dov'è definita la procedura
 
"ReadFileToSend(FileToSend)"
 
quando scrivi: 
{ --- Caricamento file nel buffer di trasmissione --- }
DataToSend := ReadFileToSend(FileToSend);
 
inoltre in quale unit trovo la procedura "StrToByteDynArray"
 
{ --- Trasferimento nel Buffer --- }
documento := StrToByteDynArray( DataToSend );
 
Grazie Mille per il tuo aiuto
 
Ciao

 "ReadFileToSend(FileToSend)" 
 
E' una procedura che ho scritto io... serve a leggere un file e a memorizzarlo in una stringa
(io utilizzo in questo caso uno stream)
La definizione di TTecnoString è 
  TTecnoString = AnsiString;
 
{}
{ --- }
{}
function ReadFileToSend( FileZip: TTecnoString ): TTecnoString;
var StringStream: TStringStream;
    FileStream : TFileStream;
    Bytes: TBytes;
    FileData: TTecnoString;
begin
 { --- Apertura Stream su File --- }
  FileStream:= TFileStream.Create( FileZip,fmOpenRead );
 
 { --- Stream Stringa di Destinazione --- }
  StringStream := TStringStream.Create( '' );
 
  try
   { --- Copia Stream --- }
    StringStream.CopyFrom( FileStream,FileStream.Size );
 
   { --- Lettura file su Stringa --- }
    FileData := StringStream.DataString;
  finally
    StringStream.Free;
    FileStream.Free;
  end;
 
 { --- Risultato --- }
  Result := FileData;
end;


 documento := StrToByteDynArray( DataToSend );
 
Anche questa una mia procedura di conversione:
N.B. TTecnoString è una AnsiString
 
{}
{ --- Conversione a Array di Byte (dinamico) --- }
{}
function  StrToByteDynArray( S: TTecnoString ): TByteDynArray;
var A: TByteDynArray;
    i: integer;
begin
 { --- Assegna Dimensione --- }
  SetLength( A,StrLength(S) );
 
 { --- Ricopia singolo carattere / byte --- }
  for i := 1 to Length(S) do
    A[I-1] := Ord( StrSubChr( S,i ) );
 
 { --- Risultato --- }
  Result := A;
end;


Grazie Infinite,
sei davvero gentilissimo
 
approfitto per chiederti nelle due procedure
 
GetInvioTelematicoSS730pMtom( False,_Deb_SistemaTs_Send,HTTPRIO )
GetInvioTelematicoSS730pMtom( False,_Prd_SistemaTs_Send,HTTPRIO );
 
le due stringhe
_Deb_SistemaTs_Send  e 
_Prd_SistemaTs_Send
 
Cosa devono contenere?
 
Grazie ancora
 

 Cosa devono contenere? 
 
Le utilizzo per indirizzare l'area test e l'area produzione
 
resourcestring
  _Deb_SistemaTs_Send = '
https://invioss730ptest.sanita.finanze.it/InvioTelematicoSS730pMtomWeb/InvioTelematicoSS730pMtomPort
';
  _Prd_SistemaTs_Send = '
https://invioss730p.sanita.finanze.it/InvioTelematicoSS730pMtomWeb/InvioTelematicoSS730pMtomPort
';
 


Grazie Infinite
 
 
 


Ciao Alessandro,  
ho messo su una piccola form per l'invio al sistema TS secondo i tuoi suggerimenti.
Quando provo a mandare il file.zip con  la tua procedura "SendToSistemaTs (FileIni: string; TargetTest: boolean )" mi compare il seguente errore:
 
Exception class ESOAPHTTPException with message 'Richiesto certificato per completare l'autenticazione del client - URL:
https://invioss730ptest.sanita.finanze.it/InvioTelematicoSS730pMtomWeb/InvioTelematicoSS730pMtomPort
 - SOAPAction:""'
 
Nonostante io abbia installato il file "SanitelCF.cer"
 
Dove sbaglio?
Se non fosse così di disturbo potrei inviarti il progetto magari gli dai un'occhiata?
 
Grazie Mille
Leo


Ciao @Alessandro B.
 
nella tua porzione di codice 
 
{ --- Dati Proprietario --- }
datiProprietario.codiceRegione := Ini.ReadString( _SysTs_Sec_I,'Reg','' );
datiProprietario.codiceAsl := Ini.ReadString( _SysTs_Sec_I,'Asl','' );
datiProprietario.codiceSSA := Ini.ReadString( _SysTs_Sec_I,'Pre','' );
datiProprietario.cfProprietario := Ini.ReadString( _SysTs_Sec_I,'Cfp','' );
 
sto riscontrando alcuni problemi.
"datiProprietario.codiceRegione" 
"datiProprietario.codiceAsl "
 
sono di tipo "varChar3Type" quindi risco a passarli semplicemente scrivendo
 
datiProprietario.codiceRegione := varChar3Type (Ini.ReadString( _SysTs_Sec_I,'Reg','' ));
datiProprietario.codiceAsl := varChar3Type (Ini.ReadString( _SysTs_Sec_I,'Asl','' ));
 
"datiProprietario.codiceSSA" è di tipo codSsaType 
e la conversione codSsaType (Ini.ReadString( _SysTs_Sec_I,'Pre','' ));
non va
 
datiProprietario.cfProprietario è di tipo cfType
e la conversione cfType (Ini.ReadString( _SysTs_Sec_I,'Cfp','' ));
non va
 
L'eseguibile riesco a compilarlo tranquillamente ma se provo ad effettuare l'invio
mi copaiono i seguenti errori
 
cvc-simple-type 1: element codiceSSA value '456' in snot a valid instance of type
analogamente per cfProprietario
 
Potresti darmi delle dritte per bypassare il problema?
 
Grazie Mille


Ciao Alessandro,
 
nel tuo codice:
 
datiProprietario.codiceSSA := Ini.ReadString( _SysTs_Sec_I,'Pre','' );
datiProprietario.cfProprietario := Ini.ReadString( _SysTs_Sec_I,'Cfp','' );
 
ricevo un errore poichè "codiceSSA" è di tipo "codSsaType" mentre Ini.ReadString( _SysTs_Sec_I,'Pre','' ) restituisce una stringa
mi compare il seguente errore:
 
Exception class ERemotableException with message
 'cvc-simple-type 1: element codiceSSA value '456' is not a valid instance of type {
http://ejb.invioTelematicoSS730p.sanita.finanze.it/}codSsaType
'
 
Come posso risolvere?
Grazie Mille
Leo

 sono qui, se vuoi parliamone
 
Ciao,
 
posso contattarti in privato?


Ciao,
mi dispiace ma in questi tempi ho una serie di progetti che stanno partendo e non riesco a trovare il tempo neppure di leggere i messaggi e la posta.


Questa la sezione di codice delle dichiarazioni nel file InvioTelematicoSpeseSanitarie730p.pas
 
  varChar3Type    =  type string;      { "
http://ejb.invioTelematicoSS730p.sanita.finanze.it/
"[GblSmpl] }
  cfType          =  type string;      { "
http://ejb.invioTelematicoSS730p.sanita.finanze.it/
"[GblSmpl] }
  codSsaType      =  type string;      { "
http://ejb.invioTelematicoSS730p.sanita.finanze.it/
"[GblSmpl] }
 


N.B. il file che utilizzo io è stato generato per importazione del wsdl nel dicembre 2015.
Al momento il codice compilato continua a funzionare correttamente presso i ns. clienti.
 
Ammetto di non aver provato a ricompilare, non avendone la necessità


Ho avuto anch'io una serie di problemi con i certificati all'inizio, risolti poi utilizzando una versione aggiornata delle librerie libeay32 e libssl32


Ciao,
 
Saresti così gentile da postarmi le porzione di codice con cui ottieni il file csv?
Non ci sto riuscendo nonostante io abbia cambiato la property "csv" della classe "dettaglioEsitoPositivo" da TByteDynArray a TArray<System.Byte>
 
te ne sarei molto grato
Grazie Mille


Ciao , hai notato che il servizio 
https://invioSS730p.sanita.finanze.it/ReportMensile730Web/ReportMensilePort
 risponde 
con un messaggio di errore: WS95 SERVIZIO RICHIESTO NON EROGABILE NELLA FASCIA ORARIA DELLA RICHIESTA.
Hai avuto modo di utilizzare questo servizio ?
 
Grazie 


Ciao, 
 
C'è qualcono nel gruppo disposto a darmi una mano sulla procedura di cifratura del CF Proprietario e del PINCode?
In ambiente Test funziona tutto correttamente, ma se provo in ambiente di produzione il sistema mi ritorna il seguente un errore:
 
"dati proprietario formalmente errati"
 
Voglio precisare che il codice fiscale in chiaro è corretto poichè è lo stesso che utilizzo per accedere al portale TS
E' probabilmente è la chiamata OpenSSL a dare problemi?
 
uso come suggerito da altri amici nel gruppo un file .bat
che contiene le seguenti istruzioni
 
"openssl rsautl -encrypt -in CF.txt -out CF.enc -inkey SanitelCF.cer -certin -pkcs
openssl enc -base64 -A -in CF.enc -out CF64.enc"
 
il file CF.txt viene cryptato nel file CF.enc quindi poi lo codifico in base64 e lo inserisco nel file xml da inviare.
al momento dell'invio, però, mi compare il messaggio di cui sopra, ossia
 
"dati proprietario formalmente errati"
 
Potreste darmi una mano a capire dove sbaglio? :-(
 
Grazie a tutti
Leo