Italian Registratore Telematico (XON-XOFF) Fattura e Scontrino elettronico

Xfood

Expert
Licensed User
Al momento credo che serva questo:
  • Informazioni sull'esistenza del protocollo (se c'è) e eventualmente una descrizione di tale protocollo
  • Capire se è possibile porre domande all'AE (visto che qui pare abbia risposto a un interrogazione su realizzare un SH qui)
  • Qualcuno che conosca C# per esanimare questo sorgente (qui). Io un pò ne mastico ma non cosi tanto
  • Fare un analisi del SW. Io ho scelto un modo per creare il JSON con delle classi (ammesso che dovremmo continuare per questa strada). E' giusta c'è un idea migliore?
  • Qualcuno che usa i corrispettivi (registratori di cassa) e che abbia le credenziali per fare delle prove sulla WebApp (tanto ho visto si possono annullare le operazioni e comunque verrebbero sommate a quelle dell RT). Magari sniffare la connessione SSL e permetterci di capire cosa succede
  • Uno che porta i caffè e granite la mattina (io voglio la brioche con lo jummo)
per il momento mi sembra tutto
per i caffe e granite sono pronto, per sniffare i dati che un registratore rt invia all'ade, attualmente invia solo i corrispettivi, e le transazioni con il codice lotteria
 

Star-Dust

Expert
Licensed User
Longtime User
la normativa sembra chiara:
Si certo, perchè non facendo memorizzazione, lìoperazione in WebApp dev'essere fatta sul momento con connessione altrimenti niente.
Il RT invece memorizza e invia anche dopo.
 

Star-Dust

Expert
Licensed User
Longtime User
per i caffe e granite sono pronto, per sniffare i dati che un registratore rt invia all'ade, attualmente invia solo i corrispettivi, e le transazioni con il codice lotteria
I dati di un RT ce li ho, ho tutto il protocollo. C'è una documentazione dettagliata. Anzi se ti interessa potrei fare un App che finge di essere un RT
Ho anche tutto il protocollo per la lotteria, purtroppo non c'è il protocollo per vincere.
 

amorosik

Expert
Licensed User
Ho visto che sei iscritto su 1000 forum di sviluppatori e hai fatto diversi interventi in merito, possibile che non hai tirato fuori nulla?

Ehmm, se ho chiesto molte volte, e probbabbole che non sapessi come fare
Oppure se gli interventi sono stati propositivi, potrebbe essere stato un mio anonimo
Inzomma, qualcunque roba abbia fatto, non sono stato io
 

amorosik

Expert
Licensed User
Al momento credo che serva questo:
  • Informazioni sull'esistenza del protocollo (se c'è) e eventualmente una descrizione di tale protocollo
  • Capire se è possibile porre domande all'AE (visto che qui pare abbia risposto a un interrogazione su realizzare un SH qui)
  • Qualcuno che conosca C# per esanimare questo sorgente (qui). Io un pò ne mastico ma non cosi tanto
  • Fare un analisi del SW. Io ho scelto un modo per creare il JSON con delle classi (ammesso che dovremmo continuare per questa strada). E' giusta c'è un idea migliore?
  • Qualcuno che usa i corrispettivi (registratori di cassa) e che abbia le credenziali per fare delle prove sulla WebApp (tanto ho visto si possono annullare le operazioni e comunque verrebbero sommate a quelle dell RT). Magari sniffare la connessione SSL e permetterci di capire cosa succede
  • Uno che porta i caffè e granite la mattina (io voglio la brioche con lo jummo)
per il momento mi sembra tutto

1 - per Lello
2 - per Lello
3 - per Me
4 - per Star Dust
5 - forse per me, devo sentire qualche cliente Giannimaione (tenere conto che mi ero offerto)
6 - Xfood questa e' tua
 

Star-Dust

Expert
Licensed User
Longtime User
Ehmm, se ho chiesto molte volte, e probbabbole che non sapessi come fare
Oppure se gli interventi sono stati propositivi, potrebbe essere stato un mio anonimo
Inzomma, qualcunque roba abbia fatto, non sono stato io
Allora ti hanno rubato nick e immagine
 

Star-Dust

Expert
Licensed User
Longtime User
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
Porkkkkk....
Anche il logo, noooooo.... mi hanno rubato anche il logo
Conosci C#? Riesci ad aprire quel sorgente' Mi pare si di VisualStudio.
Questa è la procedura per accedere con le credenziali di Fisco....Servirebeb sniffare per capire come si accredita con lo SPID

C#:
using Newtonsoft.Json;
using RestSharp;
using System;
using System.Collections.Generic;
using System.Net;

namespace DocumentoCommerciale
{
    public class Send
    {
        public List<Esiti.Esito> SendDC(List<DC.RootObject> dc, string usr, string pwd, string pin, string piva, string tipoincarico)
        {
                List<Esiti.Esito> esiti = new List<Esiti.Esito> { };
                Esiti.Esito emptyesito = new Esiti.Esito { esito = false, idtrx = null, progressivo = null, errori = null };

                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
                ServicePointManager.Expect100Continue = false;

                CookieContainer cookieJar = new CookieContainer();
                RestClient client = new RestClient(@"https://ivaservizi.agenziaentrate.gov.it/portale/web/guest")
                {
                    CookieContainer = cookieJar
                };
                RestRequest req = new RestRequest(Method.GET);
                IRestResponse res = client.Execute(req);

                int StatusCode = (int)res.StatusCode;
                if (StatusCode != 200)
                {
                    Esiti.Errore errore = new Esiti.Errore { codice = StatusCode.ToString(), descrizione = "Fase 1" };
                    emptyesito.errori = new List<Esiti.Errore>();
                    emptyesito.errori.Add(errore);
                    foreach (DC.RootObject dctemp in dc) {
                        esiti.Add(emptyesito);
                    }
                    return esiti;
                }

                client = new RestClient(@"https://ivaservizi.agenziaentrate.gov.it/portale/home?p_p_id=58&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&p_p_col_id=column-1&p_p_col_pos=3&p_p_col_count=4&_58_struts_action=%2Flogin%2Flogin")
                {
                    CookieContainer = cookieJar
                };
                req = new RestRequest(Method.POST);
                req.AddParameter("_58_login", usr);
                req.AddParameter("_58_pin", pin);
                req.AddParameter("_58_password", pwd);

                res = client.Execute(req);

                StatusCode = (int)res.StatusCode;
                if (StatusCode != 200)
                {
                    Esiti.Errore errore = new Esiti.Errore { codice = StatusCode.ToString(), descrizione = "Fase 2" };
                    emptyesito.errori = new List<Esiti.Errore>();
                    emptyesito.errori.Add(errore);
                    foreach (DC.RootObject dctemp in dc)
                    {
                        esiti.Add(emptyesito);
                    }
                return esiti;
                }

                string p_auth = getBetween(res.Content, "Liferay.authToken = '", "';");

                client = new RestClient(@"https://ivaservizi.agenziaentrate.gov.it/dp/api?v=" + unixTime())
                {
                    CookieContainer = cookieJar
                };
                req = new RestRequest(Method.GET);
                res = client.Execute(req);

                StatusCode = (int)res.StatusCode;
                if (StatusCode != 200)
                {
                    Esiti.Errore errore = new Esiti.Errore { codice = StatusCode.ToString(), descrizione = "Fase 3" };
                    emptyesito.errori = new List<Esiti.Errore>();
                    emptyesito.errori.Add(errore);
                    foreach (DC.RootObject dctemp in dc)
                    {
                        esiti.Add(emptyesito);
                    }
                return esiti;
                }

                client = new RestClient(@"https://ivaservizi.agenziaentrate.gov.it/portale/scelta-utenza-lavoro?p_auth=" + p_auth + "&p_p_id=SceltaUtenzaLavoro_WAR_SceltaUtenzaLavoroportlet&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&p_p_col_id=column-1&p_p_col_count=1&_SceltaUtenzaLavoro_WAR_SceltaUtenzaLavoroportlet_javax.portlet.action=incarichiAction")
                                                                                                                               
                {
                    CookieContainer = cookieJar
                };
                req = new RestRequest(Method.POST);
                req.AddParameter("sceltaincarico", piva);
                req.AddParameter("tipoincaricante", tipoincarico);
                res = client.Execute(req);

                StatusCode = (int)res.StatusCode;
                if (StatusCode != 200)
                {
                    Esiti.Errore errore = new Esiti.Errore { codice = StatusCode.ToString(), descrizione = "Fase 4" };
                    emptyesito.errori = new List<Esiti.Errore>();
                    emptyesito.errori.Add(errore);
                    foreach (DC.RootObject dctemp in dc)
                    {
                        esiti.Add(emptyesito);
                    }
                return esiti;
                }

                client = new RestClient(@"https://ivaservizi.agenziaentrate.gov.it/ser/api/fatture/v1/ul/me/adesione/stato/")
                {
                    CookieContainer = cookieJar
                };
                req = new RestRequest(Method.GET);
                res = client.Execute(req);

                StatusCode = (int)res.StatusCode;
                if (StatusCode != 200)
                {
                    Esiti.Errore errore = new Esiti.Errore { codice = StatusCode.ToString(), descrizione = "Fase 5" };
                    emptyesito.errori = new List<Esiti.Errore>();
                    emptyesito.errori.Add(errore);
                    foreach (DC.RootObject dctemp in dc)
                    {
                        esiti.Add(emptyesito);
                    }
                return esiti;
                }

                foreach (DC.RootObject item in dc) {
                    client = new RestClient(@"https://ivaservizi.agenziaentrate.gov.it/ser/api/documenti/v1/doc/documenti/?v=" + unixTime())
                    {
                        CookieContainer = cookieJar
                    };

                    var settings = new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.Indented };
                    var json = JsonConvert.SerializeObject(item, settings);
                    //Console.WriteLine(json);
                    req = new RestRequest(Method.POST);
                    req.AddHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36");
                    req.AddHeader("x-xss-protection", "1; mode = block");
                    req.AddHeader("strict-transport-security", "max-age=16070400; includeSubDomains");
                    req.AddHeader("x-content-type-options", "nosniff");
                    req.AddHeader("x-frame-options", "deny");
                    req.AddHeader("content-type", "application/json");
                    req.AddParameter("application/octet-stream", json, ParameterType.RequestBody);
                    //req.AddJsonBody(item);
                    res = client.Execute(req);

                    StatusCode = (int)res.StatusCode;
                    if (StatusCode != 200)
                    {
                        Esiti.Errore errore = new Esiti.Errore { codice = StatusCode.ToString(), descrizione = "Fase 6 POST JSON" };
                        emptyesito.errori = new List<Esiti.Errore>();
                        emptyesito.errori.Add(errore);
                        esiti.Add(emptyesito);
                    } else
                    {
                        esiti.Add(JsonConvert.DeserializeObject<Esiti.Esito>(res.Content));
                    }
                }
                return esiti;
        }

        static string unixTime()
        {
            DateTime foo = DateTime.UtcNow;
            long unixTime = ((DateTimeOffset)foo).ToUnixTimeMilliseconds();
            return unixTime.ToString();
        }

        static string getBetween(string strSource, string strStart, string strEnd)
        {
            int Start, End;
            if (strSource.Contains(strStart) && strSource.Contains(strEnd))
            {
                Start = strSource.IndexOf(strStart, 0) + strStart.Length;
                End = strSource.IndexOf(strEnd, Start);
                return strSource.Substring(Start, End - Start);
            }
            else
            {
                return "";
            }
        }

    }
}
 

amorosik

Expert
Licensed User
Conosci C#? Riesci ad aprire quel sorgente' Mi pare si di VisualStudio.
Questa è la procedura per accedere con le credenziali di Fisco....Servirebeb sniffare per capire come si accredita con lo SPID

C#:
using Newtonsoft.Json;
using RestSharp;
using System;
using System.Collections.Generic;
using System.Net;

namespace DocumentoCommerciale
{
    public class Send
    {
        public List<Esiti.Esito> SendDC(List<DC.RootObject> dc, string usr, string pwd, string pin, string piva, string tipoincarico)
        {
                List<Esiti.Esito> esiti = new List<Esiti.Esito> { };
                Esiti.Esito emptyesito = new Esiti.Esito { esito = false, idtrx = null, progressivo = null, errori = null };

                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
                ServicePointManager.Expect100Continue = false;

                CookieContainer cookieJar = new CookieContainer();
                RestClient client = new RestClient(@"https://ivaservizi.agenziaentrate.gov.it/portale/web/guest")
                {
                    CookieContainer = cookieJar
                };
                RestRequest req = new RestRequest(Method.GET);
                IRestResponse res = client.Execute(req);

                int StatusCode = (int)res.StatusCode;
                if (StatusCode != 200)
                {
                    Esiti.Errore errore = new Esiti.Errore { codice = StatusCode.ToString(), descrizione = "Fase 1" };
                    emptyesito.errori = new List<Esiti.Errore>();
                    emptyesito.errori.Add(errore);
                    foreach (DC.RootObject dctemp in dc) {
                        esiti.Add(emptyesito);
                    }
                    return esiti;
                }

                client = new RestClient(@"https://ivaservizi.agenziaentrate.gov.it/portale/home?p_p_id=58&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&p_p_col_id=column-1&p_p_col_pos=3&p_p_col_count=4&_58_struts_action=%2Flogin%2Flogin")
                {
                    CookieContainer = cookieJar
                };
                req = new RestRequest(Method.POST);
                req.AddParameter("_58_login", usr);
                req.AddParameter("_58_pin", pin);
                req.AddParameter("_58_password", pwd);

                res = client.Execute(req);

                StatusCode = (int)res.StatusCode;
                if (StatusCode != 200)
                {
                    Esiti.Errore errore = new Esiti.Errore { codice = StatusCode.ToString(), descrizione = "Fase 2" };
                    emptyesito.errori = new List<Esiti.Errore>();
                    emptyesito.errori.Add(errore);
                    foreach (DC.RootObject dctemp in dc)
                    {
                        esiti.Add(emptyesito);
                    }
                return esiti;
                }

                string p_auth = getBetween(res.Content, "Liferay.authToken = '", "';");

                client = new RestClient(@"https://ivaservizi.agenziaentrate.gov.it/dp/api?v=" + unixTime())
                {
                    CookieContainer = cookieJar
                };
                req = new RestRequest(Method.GET);
                res = client.Execute(req);

                StatusCode = (int)res.StatusCode;
                if (StatusCode != 200)
                {
                    Esiti.Errore errore = new Esiti.Errore { codice = StatusCode.ToString(), descrizione = "Fase 3" };
                    emptyesito.errori = new List<Esiti.Errore>();
                    emptyesito.errori.Add(errore);
                    foreach (DC.RootObject dctemp in dc)
                    {
                        esiti.Add(emptyesito);
                    }
                return esiti;
                }

                client = new RestClient(@"https://ivaservizi.agenziaentrate.gov.it/portale/scelta-utenza-lavoro?p_auth=" + p_auth + "&p_p_id=SceltaUtenzaLavoro_WAR_SceltaUtenzaLavoroportlet&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&p_p_col_id=column-1&p_p_col_count=1&_SceltaUtenzaLavoro_WAR_SceltaUtenzaLavoroportlet_javax.portlet.action=incarichiAction")
                                                                                                                             
                {
                    CookieContainer = cookieJar
                };
                req = new RestRequest(Method.POST);
                req.AddParameter("sceltaincarico", piva);
                req.AddParameter("tipoincaricante", tipoincarico);
                res = client.Execute(req);

                StatusCode = (int)res.StatusCode;
                if (StatusCode != 200)
                {
                    Esiti.Errore errore = new Esiti.Errore { codice = StatusCode.ToString(), descrizione = "Fase 4" };
                    emptyesito.errori = new List<Esiti.Errore>();
                    emptyesito.errori.Add(errore);
                    foreach (DC.RootObject dctemp in dc)
                    {
                        esiti.Add(emptyesito);
                    }
                return esiti;
                }

                client = new RestClient(@"https://ivaservizi.agenziaentrate.gov.it/ser/api/fatture/v1/ul/me/adesione/stato/")
                {
                    CookieContainer = cookieJar
                };
                req = new RestRequest(Method.GET);
                res = client.Execute(req);

                StatusCode = (int)res.StatusCode;
                if (StatusCode != 200)
                {
                    Esiti.Errore errore = new Esiti.Errore { codice = StatusCode.ToString(), descrizione = "Fase 5" };
                    emptyesito.errori = new List<Esiti.Errore>();
                    emptyesito.errori.Add(errore);
                    foreach (DC.RootObject dctemp in dc)
                    {
                        esiti.Add(emptyesito);
                    }
                return esiti;
                }

                foreach (DC.RootObject item in dc) {
                    client = new RestClient(@"https://ivaservizi.agenziaentrate.gov.it/ser/api/documenti/v1/doc/documenti/?v=" + unixTime())
                    {
                        CookieContainer = cookieJar
                    };

                    var settings = new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.Indented };
                    var json = JsonConvert.SerializeObject(item, settings);
                    //Console.WriteLine(json);
                    req = new RestRequest(Method.POST);
                    req.AddHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36");
                    req.AddHeader("x-xss-protection", "1; mode = block");
                    req.AddHeader("strict-transport-security", "max-age=16070400; includeSubDomains");
                    req.AddHeader("x-content-type-options", "nosniff");
                    req.AddHeader("x-frame-options", "deny");
                    req.AddHeader("content-type", "application/json");
                    req.AddParameter("application/octet-stream", json, ParameterType.RequestBody);
                    //req.AddJsonBody(item);
                    res = client.Execute(req);

                    StatusCode = (int)res.StatusCode;
                    if (StatusCode != 200)
                    {
                        Esiti.Errore errore = new Esiti.Errore { codice = StatusCode.ToString(), descrizione = "Fase 6 POST JSON" };
                        emptyesito.errori = new List<Esiti.Errore>();
                        emptyesito.errori.Add(errore);
                        esiti.Add(emptyesito);
                    } else
                    {
                        esiti.Add(JsonConvert.DeserializeObject<Esiti.Esito>(res.Content));
                    }
                }
                return esiti;
        }

        static string unixTime()
        {
            DateTime foo = DateTime.UtcNow;
            long unixTime = ((DateTimeOffset)foo).ToUnixTimeMilliseconds();
            return unixTime.ToString();
        }

        static string getBetween(string strSource, string strStart, string strEnd)
        {
            int Start, End;
            if (strSource.Contains(strStart) && strSource.Contains(strEnd))
            {
                Start = strSource.IndexOf(strStart, 0) + strStart.Length;
                End = strSource.IndexOf(strEnd, Start);
                return strSource.Substring(Start, End - Start);
            }
            else
            {
                return "";
            }
        }

    }
}



Aprire lo apre
Non mi compila perche' non trova dei pezzi
Perche' sniffare? se va quella usiamo quella

B4X:
Gravità    Codice    Descrizione    Progetto    File    Riga    Stato eliminazione    Stato eliminazione

Errore    CS0234    Il tipo o il nome dello spazio dei nomi 'Extensions' non esiste nello spazio dei nomi 'Microsoft'. Probabilmente manca un riferimento all'assembly.    DocumentoCommerciale    D:\SORGENTI\CS\DOCUMENTO_COMMERCIALE_NET\DocumentoCommerciale.NET-master\obj\Release\netstandard2.0\DocumentoCommerciale.AssemblyInfo.cs    14        Attivo
 

Star-Dust

Expert
Licensed User
Longtime User
Aprire lo apre
Non mi compila perche' non trova dei pezzi

B4X:
Gravità    Codice    Descrizione    Progetto    File    Riga    Stato eliminazione    Stato eliminazione

Errore    CS0234    Il tipo o il nome dello spazio dei nomi 'Extensions' non esiste nello spazio dei nomi 'Microsoft'. Probabilmente manca un riferimento all'assembly.    DocumentoCommerciale    D:\SORGENTI\CS\DOCUMENTO_COMMERCIALE_NET\DocumentoCommerciale.NET-master\obj\Release\netstandard2.0\DocumentoCommerciale.AssemblyInfo.cs    14        Attivo
Riesci a identificare cosa manca?

Comunque riusciresti a tradurre in B4X? Perchè gia molto si capisce, poi quello che manca lo possiamo costruire... ma ci interessa capire il protocollo
 

amorosik

Expert
Licensed User
Riesci a identificare cosa manca?

Comunque riusciresti a tradurre in B4X? Perchè gia molto si capisce, poi quello che manca lo possiamo costruire... ma ci interessa capire il protocollo

Esso vedo
Intanto bisognerebbe compilare questa, e vedere funziona come ci serve, anzi come ci server
Poi vediamo se riusciamo a tradurre
 

Star-Dust

Expert
Licensed User
Longtime User
Esso vedo
Intanto bisognerebbe compilare questa, e vedere funziona come ci serve, anzi come ci server
Poi vediamo se riusciamo a tradurre
Anche se non compila non è importante. Io ho aperto con Visual Code e si capisce meglio... è di facile traduzione, si può passare quasi quasi a Java con poche modifiche. Ma lascio la gioia a te
 

Star-Dust

Expert
Licensed User
Longtime User
c'è un aprima chiamata per ottenere il TOKEN e una seconda per inviare lo scontrino con metodo POST
 

giannimaione

Well-Known Member
Licensed User
Longtime User
qualche anno fa Angelo Messina da Catania era alle prese con i corrispettivi?
 

Star-Dust

Expert
Licensed User
Longtime User
qualche anno fa Angelo Messina da Catania era alle prese con i corrispettivi?
Quella esistono istruzioni sul sito. Lui cercava per la fattura elettronica.
 

Star-Dust

Expert
Licensed User
Longtime User
Esso vedo
Intanto bisognerebbe compilare questa, e vedere funziona come ci serve, anzi come ci server
Poi vediamo se riusciamo a tradurre
Gia ho iniziato a tradurmela, comunque serve a trasformare il JSON prodotto in XML adatto per l'AE. C'è tutto il protocollo di connessione.
Sembra che questo sorgente C# suddivida i dati JSON in classi come sto facendo io. Certo in C# sembra sia più conciso il codice.

Mi pare che al momento abbiamo tutto il necessario per la connessione con le credenziali di FiscoOnline.
Dobbiamo solo sperarare che funzioni ancora qusto metodo, altrimenti non abbiamo niente in mano
 
Last edited:
Mi risulta che le soluzioni legalmente riconosciute per inviare telematicamente i corrispettivi siano 2: 1) RT 2) Web App Ade e che non siano state rilasciate Api per emulare la WA. I RT sono censiti con un identificativo, infatti i corrispettivi inviati e reperibili nella sezione Fatture e Corrispettivi fanno riferimento a tale ID per ogni invio. Pertanto "fingere" di essere un RT inviando i corrispettivi usando il relativo protocollo non è possibile, a meno che non si possieda realmente un RT e si utilizzi il suo ID; in questo modo, però, non si adempie all'obbligo di memorizzazione immediatamente su un dispositivo a norma. Le soluzioni di cui sopra, probabilmente, emulano la Web App di AdE
 
Sto cercando di inviare comandi xon-xoff ad un RT presente sulla LAN tramite l'interfaccia di rete da un'applicazione scritta in MS Visual Fox Pro. Ho difficoltà esclusivamente nell'aspetto apertura socket/invio dati. Qualcuno mi può aiutare? Grazie.
 
Top