Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Colaboración Paypal con ClubDelphi

Tema Cerrado
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-09-2024
jlmoli_67 jlmoli_67 is offline
Miembro
 
Registrado: feb 2024
Posts: 132
Poder: 3
jlmoli_67 Va por buen camino
Envio sin errores

Buenas,

Solo comentaros que el servicio funciona perfectamente. Ya consegui enviar sin errores. La direccion es la del post que viene mas arriba de sglorka ( https://prewww1.aeat.es/wlpl/TIKE-CO.../VerifactuSOAP). La peticion soap la he firmado con mi certificado personal.


Me he tranquilizado muchisimo despues de ver mi primer "OK" ( lo estaba pasando realmente mal )



Gracias a todos. Os estoy muy agradecido. No podria haber hecho sin vuestra ayuda!!
  #2  
Antiguo 27-09-2024
xevi xevi is offline
Miembro
 
Registrado: feb 2024
Posts: 69
Poder: 3
xevi Va por buen camino
Cita:
Empezado por jlmoli_67 Ver Mensaje
Buenas,

Solo comentaros que el servicio funciona perfectamente. Ya consegui enviar sin errores. La direccion es la del post que viene mas arriba de sglorka ( https://prewww1.aeat.es/wlpl/TIKE-CO.../VerifactuSOAP). La peticion soap la he firmado con mi certificado personal.


Me he tranquilizado muchisimo despues de ver mi primer "OK" ( lo estaba pasando realmente mal )



Gracias a todos. Os estoy muy agradecido. No podria haber hecho sin vuestra ayuda!!
El envio del primer registro, sin huella anterior, ¿como és el nodo <encadenamiento>???
Código:
<sum1:Encadenamiento>
<sum1:RegistroAnterior>
<sum1:IDEmisorFactura>AAAA</sum1:IDEmisorFactura>
<sum1:NumSerieFactura>44</sum1:NumSerieFactura>
<sum1:FechaExpedicionFactura>13-09-2024</sum1:FechaExpedicionFactura>
<sum1:Huella>HuellaRegistroAnterior</sum1:Huella>
</sum1:RegistroAnterior>
</sum1:Encadenamiento>
Ya que consigo enviar registros, pero me devuelve siempre que el calculo de la huella no es correcto.

Gracias.
  #3  
Antiguo 27-09-2024
Avatar de bmfranky
bmfranky bmfranky is offline
Miembro
 
Registrado: may 2024
Ubicación: Gandia, Valencia
Posts: 870
Poder: 3
bmfranky Va por buen camino
Cita:
Empezado por xevi Ver Mensaje
El envio del primer registro, sin huella anterior, ¿como és el nodo <encadenamiento>???
Código:
<sum1:Encadenamiento>
<sum1:RegistroAnterior>
<sum1:IDEmisorFactura>AAAA</sum1:IDEmisorFactura>
<sum1:NumSerieFactura>44</sum1:NumSerieFactura>
<sum1:FechaExpedicionFactura>13-09-2024</sum1:FechaExpedicionFactura>
<sum1:Huella>HuellaRegistroAnterior</sum1:Huella>
</sum1:RegistroAnterior>
</sum1:Encadenamiento>
Ya que consigo enviar registros, pero me devuelve siempre que el calculo de la huella no es correcto.

Gracias.
Segun el manual deve dejarse en blanco.
  #4  
Antiguo 27-09-2024
xevi xevi is offline
Miembro
 
Registrado: feb 2024
Posts: 69
Poder: 3
xevi Va por buen camino
Cita:
Empezado por bmfranky Ver Mensaje
Segun el manual deve dejarse en blanco.
¿Sin el nodo <Encadenamiento> ???
¿Con el nodo encadenamiento y sin nodo <RegistroAnterior>???
Con el nodo <Encadenamiento> y <RegistroAnterior>

Código:
El XML no cumple el esquema. Falta informar campo obligatorio.: PrimerRegistro</faultstring><detail><callstack>El XML no cumple el esquema. Falta informar campo obligatorio.: PrimerRegistro
WSExcepcion
Echo, añadido PrimerRegistro S

Ahora por lo visto no me cuadra el cálculo de la huella. A ver que más me sale!!!

Última edición por xevi fecha: 27-09-2024 a las 10:10:22.
  #5  
Antiguo 27-09-2024
Avatar de bmfranky
bmfranky bmfranky is offline
Miembro
 
Registrado: may 2024
Ubicación: Gandia, Valencia
Posts: 870
Poder: 3
bmfranky Va por buen camino
Cita:
Empezado por xevi Ver Mensaje
¿Sin el nodo <Encadenamiento> ???
¿Con el nodo encadenamiento y sin nodo <RegistroAnterior>???
Con el nodo <Encadenamiento> y <RegistroAnterior>

Código:
El XML no cumple el esquema. Falta informar campo obligatorio.: PrimerRegistro</faultstring><detail><callstack>El XML no cumple el esquema. Falta informar campo obligatorio.: PrimerRegistro
WSExcepcion
Hola, perdona si no me explique, se tiene que crear con todos los datos de la factura, pero en el lugar donde se asigna la anterior cadena, en blanco.
Código:
6.1. Caso 1: primer registro de facturación –en este caso, de
alta– en un Sistema Informático de Facturación (SIF)
Se parte de los siguientes datos de entrada en el XML:
1. IDEmisorFactura: 89890001K
2. NumSerieFactura: 12345678/G33
3. FechaExpedicionFactura: 01-01-2024
4. TipoFactura: F1
5. CuotaTotal: 12.35
6. ImporteTotal: 123.45
7. Huella (*):
8. FechaHoraHusoGenRegistro: 2024-01-01T19:20:30+01:00
(*) Sin contenido, al tratarse del primer registro de ese SIF y, por tanto, no haber
registro de facturación anterior.
  #6  
Antiguo 27-09-2024
xevi xevi is offline
Miembro
 
Registrado: feb 2024
Posts: 69
Poder: 3
xevi Va por buen camino
Esto es para el cálculo del hash/firma, pero para el xml a enviar a VERIFACTU, se debe de informar
Código:
               <sum1:Encadenamiento>
                  <sum1:PrimerRegistro>S</sum1:PrimerRegistro>
               </sum1:Encadenamiento>
Creo tener así entendido. Lo he probado y parece que traga, ahora a ver lo del cálculo de la huella
  #7  
Antiguo 27-09-2024
jlmoli_67 jlmoli_67 is offline
Miembro
 
Registrado: feb 2024
Posts: 132
Poder: 3
jlmoli_67 Va por buen camino
buenas

Correcto. Perdona entendi mal la pregunta

un saludo
  #8  
Antiguo 27-09-2024
jlmoli_67 jlmoli_67 is offline
Miembro
 
Registrado: feb 2024
Posts: 132
Poder: 3
jlmoli_67 Va por buen camino
hash primer registro

buenas, lee el siguiente enlace, viene bien explicado:



https://www.agenciatributaria.es/sta..._registros.pdf



Caso 1: primer registro de facturación –en este caso, de
alta– en un Sistema Informático de Facturación (SIF)
Se parte de los siguientes datos de entrada en el XML:
1. IDEmisorFactura: 89890001K
2. NumSerieFactura: 12345678/G33
3. FechaExpedicionFactura: 01-01-2024
4. TipoFactura: F1
5. CuotaTotal: 12.35
6. ImporteTotal: 123.45
7. Huella (*):
8. FechaHoraHusoGenRegistro: 2024-01-01T19:20:30+01:00
(*) Sin contenido, al tratarse del primer registro de ese SIF y, por tanto, no haber
registro de facturación anterior.
Se obtendría la siguiente cadena de caracteres sobre la que aplicar el algoritmo
de huella o «hash»:
IDEmisorFactura=89890001K&NumSerieFactura=12345678/G33&FechaExped
icionFactura=01-01-
2024&TipoFactura=F1&CuotaTotal=12.35&ImporteTotal=123.45&Huella=&Fec
haHoraHusoGenRegistro=2024-01-01T19:20:30+01:00




un saludo
  #9  
Antiguo 20-10-2024
jguarda jguarda is offline
Miembro
 
Registrado: feb 2008
Posts: 27
Poder: 0
jguarda Va por buen camino
dudas

Verifactu me dice que el nif con el que envio la factura no está dado de alta. Como habeís solucionado este tema.


Gracias
  #10  
Antiguo 20-10-2024
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.766
Poder: 8
ermendalenda Va por buen camino
Cita:
Empezado por jguarda Ver Mensaje
Verifactu me dice que el nif con el que envio la factura no está dado de alta. Como habeís solucionado este tema.


Gracias
Hola, yo solo tengo ese problema si envio con un nif que no existe o de pruebas de estos tipos:Juan Español Español 12312312F
Comprueba que el nombre corresponda (al menos parcialmente) con el que está dado de alta en la aeat. por ejemplo no puedes poner un nif de persona fisica asociado a un nombre comercial.
  #11  
Antiguo 20-10-2024
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.766
Poder: 8
ermendalenda Va por buen camino
Importante Para Envios Con Curl Para Software Antiguo

Hola, creo que es importante que se ponga esto en el primer post. Puede que le "salve la vida" a más de uno que usa desarrollo antiguo, tipo vb 6.0 , delphis antiquísimos etc..

Para realizar los envios con la aplicación Curl.exe.
1. Encapsular el fichero xml en SOAP.
Para ello agregar al fichero el inicio y final del soap
Código PHP:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sum="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd" xmlns:sum1="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd">
<
soapenv:Header />
<
soapenv:Body>
<
sum:RegFactuSistemaFacturacion>
....
..
</
sum:RegFactuSistemaFacturacion>
</
soapenv:Body>
</
soapenv:Envelope> 
Ojo hay que quitarle
Código PHP:
<?xml version="1.0" encoding="UTF-8"?>
y si habeis puesto el inicio del nodo RegFactuSistemaFacturacion con referencias quitarlas y dejarlas así:
Código PHP:
<sum:RegFactuSistemaFacturacion> 
Ya que las referencias ya estan en el soap, aunque lo mismo funciona poniendolo en uno o en otro, pero si lo dejas en los 2 no va a funcionar.


2.Enviar el fichero soap con CURL.exe

Os dejo el comando, al que podeis hacerle modificaciones
curl.exe --connect-timeout 300 -m 300 -k -L -d "@C:\....\VFac22223.xml" -o respuesta_
VFac22223.xml -D cabecera_VFac22223.xml --cert-type P12 --cert C:\...certificado.pfx:contraseña https://prewww1.aeat.es/wlpl/TIKE-CO.../VerifactuSOAP --trace respuestatrace_VFac22223.txt

Explico un poco:
-Para enviar de esta forma podeis tener en una carpeeta el certificado con el que enviais en formato pfx/pt2, aunque el comando curl tambien admite usar certificados desde un almacen en el que lo habeis importado, si lo necesitais desde almacen podeis buscar ayuda al respectgo por el google.
-Aunque para saber un poco más de los parametros curl podeis ejecutar curl --help all desde el cmd os dejo las explicaciones a los parametros que uso:
*Los timeouts, son los tiempos de espera en segundos, que aunque los he puesto un poco exagerados, por experiencia los prefiero tener así, ya que me he encontrado en situaciones de conexiones 2G o que usaban un router de datos con los datos agotados y al menos alarga unos megas mas los envios a velocidad lenta.
*La opción -k os quitará muchos dolores de cabeza, ya que a veces hay restricciones de envios por temas de firewall, seguridad..., y es para que no tenga en cuenta si ha caducado el certificado del propio curl o de vuestro propio sistema... pero no tiene nada que ver con que caduque el certificado electronico con el que enviais, si ese caduca, channn-- error---

*La opcion -L permite que haya redirecciones, no es necesario, pero lo activo por si acaso meten alguna redireccion
*La opcion -d seguida de la ruta completa del archivo a enviar entrecomillada y precedida por el simbolo arroba @ antes de la ruta, es el archivo a enviar, se precede por el @ parea que se envie y reciba en formato binario y nos aseguremos que los caracteres que enviamos no lleguen convertidos a otro sistema que no sea el UTF8.
*La opción -o seguida de la ruta completa de la respuesta, nos devolverá en un fichero la respuesta de Hacienda en formato XML. Aconsejo usarla con la respuesta de cabecera -D, ya que podemos ver previamente si hay conexion o no, o sea, el de cabecera nos proporciona informacion adicional sobre la conexion, el fichero de cabecera puede tener varios estados: uno de ellos es vacio o que no se genere(con lo cual no ha habido conexion) y si tiene contenido nos informa si la conexion ha sido ok, haced bastantes pruebas, quitando la red, mandando repetidos etc.
* La opción --trace, no es necesaria, solo para hacer alguna prueba más severa por que tengamos algun problema con alguna conexion en particular y queramos informacion muy específica de todo lo que esta haciendo el comando.
* La opcion --cert-type P12 --cert continuada por el nombre del fichero(certificado pfx/pt2), continuada por dos puntos ":" y la contraseña indicamos que estamos enviando con un certificado de un fichero que tenemos donde indicamos. Debeis tener especial cuidad con este comando de no dejar rastros, no es aconsejable crear un .bat ni nada de eso, y tened en cuenta que es un pelin inseguro por temas que no voy a decir aquí.
* Y ya por ultimo el servidor para las altas de facturas:
https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP


Nota:
Podeis tener problemas con el servidor si teneis un router con tarjeta de datos 3g/4g/5g si el proveedor os han metido CG-NAT (de repente) o s han puesto en un blacklist, para saberlo receibirais al conectar un error 443, normalmente no es problema del firewall, que ese es otro tema, para corregir el problema teneis 2 opciones, o llamais al proveedor y os lo soluciona (le decis que os saque del CG-NAT) o cambias la tarjeta de datos.
Os lo digo por si quereis meter ese control en las respuestas, ya que no es un error frecuente y os puede también dar dolores de cabeza.

Última edición por ermendalenda fecha: 20-10-2024 a las 10:13:10.
  #12  
Antiguo 20-10-2024
Avatar de bmfranky
bmfranky bmfranky is offline
Miembro
 
Registrado: may 2024
Ubicación: Gandia, Valencia
Posts: 870
Poder: 3
bmfranky Va por buen camino
Para los errores de dni no censado.

Cita:
Errores conwxion
1-> Error nif cliente mo coincide con nombre
2-> Error hora
Solo por que tengamos claro que hay que hacer. Marcar incidencia. Rectificativa...
Cita:
Empezado por jguarda Ver Mensaje
3-> Verifactu me dice que el nif con el que envio la factura no está dado de alta. Como habeís solucionado este tema.


Gracias

Hola, para los casos 2 y 3 hay una solucion propuesta por la misma administracion, porque puede ser perfectamente que un cliente no este censado en hacienda y al reenviarpor un corte seguro estamos fuera, de la hora de generacion fijo.


Para el caso 1 y 3 uso la misma solucion, compruebo la estructura que este bien formado, que no lo haya introducido mal.
Código:
   class verificaDniCif
    {
       public static Boolean valida_NIFCIFNIE(string data)
        {
            if (String.IsNullOrEmpty(data) || data.Length < 8)
                return false;

            var initialLetter = data.Substring(0, 1).ToUpper();
            if (Char.IsLetter(data, 0))
            {
                switch (initialLetter)
                {
                    case "X":
                        data = "0" + data.Substring(1, data.Length - 1);
                        return validarNIF(data);
                    case "Y":
                        data = "1" + data.Substring(1, data.Length - 1);
                        return validarNIF(data);
                    case "Z":
                        data = "2" + data.Substring(1, data.Length - 1);
                        return validarNIF(data);
                    default:
                        if (new Regex("[A-Za-z][0-9]{7}[A-Za-z0-9]{1}$").Match(data).Success)
                            return validadCIF(data);
                        break;
                }
            }
            else if (Char.IsLetter(data, data.Length - 1))
            {
                if (new Regex("[0-9]{8}[A-Za-z]").Match(data).Success || new Regex("[0-9]{7}[A-Za-z]").Match(data).Success)
                    return validarNIF(data);
            }
            return false;
        }

        private static string getLetra(int id)
        {
            Dictionary<int, String> letras = new Dictionary<int, string>();
            letras.Add(0, "T");
            letras.Add(1, "R");
            letras.Add(2, "W");
            letras.Add(3, "A");
            letras.Add(4, "G");
            letras.Add(5, "M");
            letras.Add(6, "Y");
            letras.Add(7, "F");
            letras.Add(8, "P");
            letras.Add(9, "D");
            letras.Add(10, "X");
            letras.Add(11, "B");
            letras.Add(12, "N");
            letras.Add(13, "J");
            letras.Add(14, "Z");
            letras.Add(15, "S");
            letras.Add(16, "Q");
            letras.Add(17, "V");
            letras.Add(18, "H");
            letras.Add(19, "L");
            letras.Add(20, "C");
            letras.Add(21, "K");
            letras.Add(22, "E");
            return letras[id];
        }

        private static bool validarNIF(string data)
        {
            if (data == String.Empty)
                return false;
            try
            {
                String letra;
                letra = data.Substring(data.Length - 1, 1);
                data = data.Substring(0, data.Length - 1);
                int nifNum = int.Parse(data);
                int resto = nifNum % 23;
                string tmp = getLetra(resto);
                if (tmp.ToLower() != letra.ToLower())
                    return false;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return false;
            }
            return true;
        }

        private static bool validadCIF(string data)
        {
            try
            {
                int pares = 0;
                int impares = 0;
                int suma;
                string ultima;
                int unumero;
                string[] uletra = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "0" };
                string[] fletra = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J" };
                int[] fletra1 = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
                string xxx;

                /*
                * T      P      P      N  N  N  N  N  C
                Siendo:
                T: Letra de tipo de Organización, una de las siguientes: A,B,C,D,E,F,G,H,K,L,M,N,P,Q,S.
                P: Código provincial.
                N: Númeración secuenial dentro de la provincia.
                C: Dígito de control, un número ó letra: Aó1,Bó2,Có3,Dó4,Eó5,Fó6,Gó7,Hó8,Ió9,Jó0.
                *
                *
                A.    Sociedades anónimas.
                B.    Sociedades de responsabilidad limitada.
                C.    Sociedades colectivas.
                D.    Sociedades comanditarias.
                E.    Comunidades de bienes y herencias yacentes.
                F.    Sociedades cooperativas.
                G.    Asociaciones.
                H.    Comunidades de propietarios en régimen de propiedad horizontal.
                I.    Sociedades civiles, con o sin personalidad jurídica.
                J.    Corporaciones Locales.
                K.    Organismos públicos.
                L.    Congregaciones e instituciones religiosas.
                M.    Órganos de la Administración del Estado y de las Comunidades Autónomas.
                N.    Uniones Temporales de Empresas.
                O.    Otros tipos no definidos en el resto de claves.

                */
                data = data.ToUpper();

                ultima = data.Substring(8, 1);

                int cont = 1;
                for (cont = 1; cont < 7; cont++)
                {
                    xxx = (2 * int.Parse(data.Substring(cont++, 1))) + "0";
                    impares += int.Parse(xxx.ToString().Substring(0, 1)) + int.Parse(xxx.ToString().Substring(1, 1));
                    pares += int.Parse(data.Substring(cont, 1));
                }

                xxx = (2 * int.Parse(data.Substring(cont, 1))) + "0";
                impares += int.Parse(xxx.Substring(0, 1)) + int.Parse(xxx.Substring(1, 1));

                suma = pares + impares;
                unumero = int.Parse(suma.ToString().Substring(suma.ToString().Length - 1, 1));
                unumero = 10 - unumero;
                if (unumero == 10) unumero = 0;

                if ((ultima == unumero.ToString()) || (ultima == uletra[unumero - 1]))
                    return true;
                else
                    return false;

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return false;
            }
        }
    }
Si esta correcto compruebo el Nif con hacienda usando la opcion de buscar los datos del nif en hacienda.http://www2.agenciatributaria.gob.es...ws/VNifV2.wsdl
Código:
        /// <summary>
        /// Comprueba si un CIF/NIf esta censado
        /// </summary>
        /// <returns>Si o No segun el estado del censo</returns>
        public string Censado()
        {
            string censado = "No";
            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            Salida respuestaNif = new Salida();
            Entrada checaNif = new Entrada();
            VNifV2EntContribuyente contribuyente = new VNifV2EntContribuyente();
            contribuyente.Nif = Dni.Text;
            contribuyente.Nombre = Apellido1.Text + " " + Apellido2.Text + " " + nom.Text;
            VNifV2EntContribuyente[] contrib = new VNifV2EntContribuyente[1];
            contrib[0] = contribuyente;
            checaNif.VNifV2Ent = contrib;
            VNifV2Client checa = new VNifV2Client("VNifPort1");
            checa.ClientCredentials.ClientCertificate.Certificate = new System.Security.Cryptography.X509Certificates.X509Certificate2(Program.certificado, Program.passcertificado);
            checa.ClientCredentials.UseIdentityConfiguration = true;
            checa.ClientCredentials.SupportInteractive = true;
            VNifV2SalContribuyente nifsalida = new VNifV2SalContribuyente();

            var resultado = checa.VNifV2(checaNif);
            if(resultado.VNifV2Sal[0].Resultado == "IDENTIFICADO")
            {
                txtCensado.BackColor = Color.Green;
                censado = "Si";
            }
            else
            {
                txtCensado.BackColor = Color.Red;
                MessageBox.Show("El cliente no esta censado en hacienda o sus datos son incorrectos, por favor reviselo , o no se podra utilizar para enviar le facturas.");
            }
            return censado;
        }
Si el CIF/NIF esta bien estructurado , pero no censado, se usa el tipo IDotro, rellenando todos los campos y estableciendo el idtype en 7, no censado
Código:
idOtro.IDType = PersonaFisicaJuridicaIDTypeType.Item07;
En cuanto a la hora , el numero 2, dan la opcion de consignar Incidencia, para que no tenga en cuenta la hora,
Cita:
Buenas tardes:
Este es un error de los denominados admisibles (ver documento de validaciones, apartado "4.3 Tratamiento de los errores admisibles ") y debido a ello se admitirá el registro. Este error en concreto, se excepciona de la necesidad de ser subsanado por lo que necesitarían realizar ninguna subsanación posteriormente.
Otra cuestión a tener en cuenta, es que está previsto que los sistemas informáticos de facturación, tengan indisponibilidades como cortes de luz, falta de conexión, fallos en el sistema , etc. y se pueda superar el tiempo establecido...En esos casos deben activar el campo "Incidencia" (ver diseño de registro, hoja "1)DR Remisión Alta-Anul.VF-Req.") para que no les aparezca dicho error
Por otro lado, en vuestro caso que rellenais a pelo el xml, deveriais intentar rellenar lo ultimo le Timestamp para que tengais el mayor margen posible.
  #13  
Antiguo 20-10-2024
ermendalenda ermendalenda is offline
Miembro
 
Registrado: ago 2021
Posts: 2.766
Poder: 8
ermendalenda Va por buen camino
Cita:
Empezado por bmfranky Ver Mensaje
Hola, para los casos 2 y 3 hay una solucion propuesta por la misma administracion, porque puede ser perfectamente que un cliente no este censado en hacienda y al reenviarpor un corte seguro estamos fuera, de la hora de generacion fijo.


Para el caso 1 y 3 uso la misma solucion, compruebo la estructura que este bien formado, que no lo haya introducido mal.
Código:
   class verificaDniCif
    {
       public static Boolean valida_NIFCIFNIE(string data)
        {
            if (String.IsNullOrEmpty(data) || data.Length < 8)
                return false;

            var initialLetter = data.Substring(0, 1).ToUpper();
            if (Char.IsLetter(data, 0))
            {
                switch (initialLetter)
                {
                    case "X":
                        data = "0" + data.Substring(1, data.Length - 1);
                        return validarNIF(data);
                    case "Y":
                        data = "1" + data.Substring(1, data.Length - 1);
                        return validarNIF(data);
                    case "Z":
                        data = "2" + data.Substring(1, data.Length - 1);
                        return validarNIF(data);
                    default:
                        if (new Regex("[A-Za-z][0-9]{7}[A-Za-z0-9]{1}$").Match(data).Success)
                            return validadCIF(data);
                        break;
                }
            }
            else if (Char.IsLetter(data, data.Length - 1))
            {
                if (new Regex("[0-9]{8}[A-Za-z]").Match(data).Success || new Regex("[0-9]{7}[A-Za-z]").Match(data).Success)
                    return validarNIF(data);
            }
            return false;
        }

        private static string getLetra(int id)
        {
            Dictionary<int, String> letras = new Dictionary<int, string>();
            letras.Add(0, "T");
            letras.Add(1, "R");
            letras.Add(2, "W");
            letras.Add(3, "A");
            letras.Add(4, "G");
            letras.Add(5, "M");
            letras.Add(6, "Y");
            letras.Add(7, "F");
            letras.Add(8, "P");
            letras.Add(9, "D");
            letras.Add(10, "X");
            letras.Add(11, "B");
            letras.Add(12, "N");
            letras.Add(13, "J");
            letras.Add(14, "Z");
            letras.Add(15, "S");
            letras.Add(16, "Q");
            letras.Add(17, "V");
            letras.Add(18, "H");
            letras.Add(19, "L");
            letras.Add(20, "C");
            letras.Add(21, "K");
            letras.Add(22, "E");
            return letras[id];
        }

        private static bool validarNIF(string data)
        {
            if (data == String.Empty)
                return false;
            try
            {
                String letra;
                letra = data.Substring(data.Length - 1, 1);
                data = data.Substring(0, data.Length - 1);
                int nifNum = int.Parse(data);
                int resto = nifNum % 23;
                string tmp = getLetra(resto);
                if (tmp.ToLower() != letra.ToLower())
                    return false;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return false;
            }
            return true;
        }

        private static bool validadCIF(string data)
        {
            try
            {
                int pares = 0;
                int impares = 0;
                int suma;
                string ultima;
                int unumero;
                string[] uletra = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "0" };
                string[] fletra = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J" };
                int[] fletra1 = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
                string xxx;

                /*
                * T      P      P      N  N  N  N  N  C
                Siendo:
                T: Letra de tipo de Organización, una de las siguientes: A,B,C,D,E,F,G,H,K,L,M,N,P,Q,S.
                P: Código provincial.
                N: Númeración secuenial dentro de la provincia.
                C: Dígito de control, un número ó letra: Aó1,Bó2,Có3,Dó4,Eó5,Fó6,Gó7,Hó8,Ió9,Jó0.
                *
                *
                A.    Sociedades anónimas.
                B.    Sociedades de responsabilidad limitada.
                C.    Sociedades colectivas.
                D.    Sociedades comanditarias.
                E.    Comunidades de bienes y herencias yacentes.
                F.    Sociedades cooperativas.
                G.    Asociaciones.
                H.    Comunidades de propietarios en régimen de propiedad horizontal.
                I.    Sociedades civiles, con o sin personalidad jurídica.
                J.    Corporaciones Locales.
                K.    Organismos públicos.
                L.    Congregaciones e instituciones religiosas.
                M.    Órganos de la Administración del Estado y de las Comunidades Autónomas.
                N.    Uniones Temporales de Empresas.
                O.    Otros tipos no definidos en el resto de claves.

                */
                data = data.ToUpper();

                ultima = data.Substring(8, 1);

                int cont = 1;
                for (cont = 1; cont < 7; cont++)
                {
                    xxx = (2 * int.Parse(data.Substring(cont++, 1))) + "0";
                    impares += int.Parse(xxx.ToString().Substring(0, 1)) + int.Parse(xxx.ToString().Substring(1, 1));
                    pares += int.Parse(data.Substring(cont, 1));
                }

                xxx = (2 * int.Parse(data.Substring(cont, 1))) + "0";
                impares += int.Parse(xxx.Substring(0, 1)) + int.Parse(xxx.Substring(1, 1));

                suma = pares + impares;
                unumero = int.Parse(suma.ToString().Substring(suma.ToString().Length - 1, 1));
                unumero = 10 - unumero;
                if (unumero == 10) unumero = 0;

                if ((ultima == unumero.ToString()) || (ultima == uletra[unumero - 1]))
                    return true;
                else
                    return false;

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return false;
            }
        }
    }
Si esta correcto compruebo el Nif con hacienda usando la opcion de buscar los datos del nif en hacienda.http://www2.agenciatributaria.gob.es...ws/VNifV2.wsdl
Código:
        /// <summary>
        /// Comprueba si un CIF/NIf esta censado
        /// </summary>
        /// <returns>Si o No segun el estado del censo</returns>
        public string Censado()
        {
            string censado = "No";
            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            Salida respuestaNif = new Salida();
            Entrada checaNif = new Entrada();
            VNifV2EntContribuyente contribuyente = new VNifV2EntContribuyente();
            contribuyente.Nif = Dni.Text;
            contribuyente.Nombre = Apellido1.Text + " " + Apellido2.Text + " " + nom.Text;
            VNifV2EntContribuyente[] contrib = new VNifV2EntContribuyente[1];
            contrib[0] = contribuyente;
            checaNif.VNifV2Ent = contrib;
            VNifV2Client checa = new VNifV2Client("VNifPort1");
            checa.ClientCredentials.ClientCertificate.Certificate = new System.Security.Cryptography.X509Certificates.X509Certificate2(Program.certificado, Program.passcertificado);
            checa.ClientCredentials.UseIdentityConfiguration = true;
            checa.ClientCredentials.SupportInteractive = true;
            VNifV2SalContribuyente nifsalida = new VNifV2SalContribuyente();

            var resultado = checa.VNifV2(checaNif);
            if(resultado.VNifV2Sal[0].Resultado == "IDENTIFICADO")
            {
                txtCensado.BackColor = Color.Green;
                censado = "Si";
            }
            else
            {
                txtCensado.BackColor = Color.Red;
                MessageBox.Show("El cliente no esta censado en hacienda o sus datos son incorrectos, por favor reviselo , o no se podra utilizar para enviar le facturas.");
            }
            return censado;
        }
Si el CIF/NIF esta bien estructurado , pero no censado, se usa el tipo IDotro, rellenando todos los campos y estableciendo el idtype en 7, no censado
Código:
idOtro.IDType = PersonaFisicaJuridicaIDTypeType.Item07;
En cuanto a la hora , el numero 2, dan la opcion de consignar Incidencia, para que no tenga en cuenta la hora,
Por otro lado, en vuestro caso que rellenais a pelo el xml, deveriais intentar rellenar lo ultimo le Timestamp para que tengais el mayor margen posible.
Gracias
Ya .as o menos se vé por donde van
Yo antes de enviar voy a comprobar la hora del registro y le meto incidencia si ha pasado por ejemplo 100 segundos, ya veo que si no es muy habitual quenle mandes todo fuera de hora tampoco te van a decir nada.
  #14  
Antiguo 27-09-2024
richidemola richidemola is offline
Miembro
 
Registrado: sep 2024
Posts: 32
Poder: 0
richidemola Va por buen camino
Cita:
Empezado por jlmoli_67 Ver Mensaje
Buenas,

Solo comentaros que el servicio funciona perfectamente. Ya consegui enviar sin errores. La direccion es la del post que viene mas arriba de sglorka ( ). La peticion soap la he firmado con mi certificado personal.


Me he tranquilizado muchisimo despues de ver mi primer "OK" ( lo estaba pasando realmente mal )



Gracias a todos. Os estoy muy agradecido. No podria haber hecho sin vuestra ayuda!!
Puedes compartir el proceso de envío? Vamos, que como lo has enviado, si con algún lenguaje de programación, curl, llamada soap, es que no consigo enviar una mierda, he usado la url que pones y nada, he firmado el xml primero con autofirma y nada de nada.

Si tienes algo de código fuente de como lo envías y lo compartes pues te estaríamos eternamente agradecidos.

Gracias.
  #15  
Antiguo 27-09-2024
jlmoli_67 jlmoli_67 is offline
Miembro
 
Registrado: feb 2024
Posts: 132
Poder: 3
jlmoli_67 Va por buen camino
Cita:
Empezado por richidemola Ver Mensaje
Puedes compartir el proceso de envío? Vamos, que como lo has enviado, si con algún lenguaje de programación, curl, llamada soap, es que no consigo enviar una mierda, he usado la url que pones y nada, he firmado el xml primero con autofirma y nada de nada.

Si tienes algo de código fuente de como lo envías y lo compartes pues te estaríamos eternamente agradecidos.

Gracias.
Buenas, en vb net lo hago asi:

Public Function validarCertificado(ByVal sender As Object, ByVal certificado As System.Security.Cryptography.X509Certificates.X509Certificate, ByVal cadena As System.Security.Cryptography.X509Certificates.X509Chain, ByVal sslErrores As System.Net.Security.SslPolicyErrors) As Boolean
Return True
End Function


Por cierto... no es necesario que firmes el xmk. Tan solo firmar la peticion con tu certificado pfx

un saludo


Public Function SendSOAPRequest(ByVal soapRequest As String, ByVal url As String, ByVal certificatePath As String, ByVal certificatePassword As String) As String
Dim soapResponse As String = Nothing


Try


System.Net.ServicePointManager.SecurityProtocol = DirectCast(3072, System.Net.SecurityProtocolType)
System.Net.ServicePointManager.ServerCertificateValidationCallback = New System.Net.Security.RemoteCertificateValidationCallback(AddressOf validarCertificado)

' solicitud = DirectCast(System.Net.HttpWebRequest.Create(target), System.Net.HttpWebRequest)
' solicitud.Timeout = 2500



' Crear la solicitud web
Dim webRequest As HttpWebRequest = DirectCast(System.Net.HttpWebRequest.Create(url), System.Net.HttpWebRequest)
webRequest.Timeout = 2500
' webRequest.Headers.Add("SOAPAction", "AltaFactuSistemaFacturacion")
webRequest.ContentType = "text/xml;charset=""utf-8"""
webRequest.Accept = "text/xml"
webRequest.Method = "POST"

' Configurar el certificado
Dim certificate As X509Certificate2 = New X509Certificate2(certificatePath, certificatePassword)
webRequest.ClientCertificates.Add(certificate)

' Escribir la solicitud SOAP en el flujo de la solicitud web
Using streamWriter As StreamWriter = New StreamWriter(webRequest.GetRequestStream())
streamWriter.Write(soapRequest)
streamWriter.Flush()
streamWriter.Close()
End Using

' Obtener la respuesta
Using webResponse As WebResponse = webRequest.GetResponse()
Using streamReader As StreamReader = New StreamReader(webResponse.GetResponseStream())
soapResponse = streamReader.ReadToEnd()
End Using
End Using
Catch ex As Exception
' Manejar errores
MsgBox("Error en la solicitud SOAP: " & ex.Message)
Return "Error en la solicitud SOAP: " & ex.Message
End Try

Return soapResponse
End Function


' el siguiente botón hace la petición al servicio


Private Sub peticion_Click(sender As System.Object, e As System.EventArgs) Handles peticion.Click
Dim client As New SOAPClient()

' Ruta al archivo de certificado y contraseña del certificado
Dim certificatePath As String = "D:\documentos\certificado.pfx"
Dim certificatePassword As String = "xxxxxxxxxx"

' URL del servicio web SOAP
Dim url As String = "https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP"

' en textbox1 meto el xml que previamente he generado
Dim soapRequest As String = TextBox1.Text



' Enviar la solicitud SOAP
Dim soapResponse As String = client.SendSOAPRequest(soapRequest, url, certificatePath, certificatePassword)
' en respuesta.xml meto la respuesta
My.Computer.FileSystem.WriteAllText("respuesta.xml", soapResponse, False)
' Manejar la respuesta SOAP

End Sub

No hace falta firmar el xml, tan solo la peticion con tu certificado pfx

Última edición por jlmoli_67 fecha: 27-09-2024 a las 19:52:08. Razón: Aclaracion
Tema Cerrado


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Hijo de Informáticos gluglu Humor 3 13-03-2007 11:05:35
Adictos informaticos ... Trigger Humor 2 11-10-2004 12:18:32
Nosotros los Informáticos Trigger Humor 1 10-10-2004 14:58:09
Patrón de los Informáticos. obiwuan Varios 20 10-09-2003 14:44:54
Chistes Informaticos jhonny Humor 2 11-08-2003 21:59:09


La franja horaria es GMT +2. Ahora son las 11:31:23.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi