Ver Mensaje Individual
  #2973  
Antiguo 19-10-2024
Avatar de bmfranky
bmfranky bmfranky is offline
Miembro
 
Registrado: may 2024
Ubicación: Gandia, Valencia
Posts: 863
Reputación: 3
bmfranky Va por buen camino
Enviar a pelo xml en c#

Cita:
Empezado por ermendalenda Ver Mensaje
Ni idea, aun no me he metido con los envíos, los compañeros seguro que te ayudan. Pero tienes que hener en cuenta que el xml no se manda tal cual. Tienes que empaquetarlo como soap, en eso no te puedo ayudar,.por que a pelo un soap es complicado (praxticamente i posible si nl conoces en profundidad coml funcionan las funciones de firmas etc), hay que firmados con hash etc.
Pero con autoafirma.exe si puedes investigar, aunque tun pelin complicado y no se si se ajustará a los tiempos que necesitas para las generaciones. La otra opción es que compras alguna función api/dll para estas cosas, hay un par de ellas que son adaptables a casi cualquier software de desarrollo antiguo
La verdad es que opinaba lo mismo que tu de enviar el codigo , pero realmente con el xml formado simplemengte hay que añadir las cabecerass y ending soap y enviar por https, y lo acepta sin mas.
Cita:
//facxml es un string que contiene el xml añadimos cabecera

facXml = facXml.Replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>", "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"> <soapenv:Header /> <soapenv:Body >");
//en mi caso me generaba mal esta etiqueta

facXml = facXml.Replace("<RegFactuSistemaFacturacion xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">", "<RegFactuSistemaFacturacion xmlns=\"https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd\">");
//añadimos el ending soap.
facXml = facXml + " </soapenv:Body> </soapenv:Envelope > ";
//lo pasamos a un document para poder realizar la llamada

XmlDocument doc = new XmlDocument();
doc.LoadXml(facXml.Replace("utf-16", "utf-8"));
//llamamos a la funcion que hace la consula soap

string ret = Call("https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP", "RegistroAlta", doc);
Aqui os dejo la funcion que realiza la consulta a la AEAT, por si a alguienle sirve , segun esta formada necesita que se creen unavarialble que contenga el certificado y otra con la clave del mismo.
byte[] Program.certificado , esta variable contiene el certificado usado para firmar la conexion

string Program.passcertificado, esta variable contiene la clave del certificado

[CODE C#]
/// <summary>
/// Llama a al web service de la AEAT para el VeriFactu seleccionado.
/// </summary>
/// <param name="url">Url destino.</param>
/// <param name="action">Acción a ejecutar.</param>
/// <param name="xmlDocument">Documento soap xml.</param>
/// <returns>Devuelve la respuesta.</returns>
protected static string Call(string url, string action, XmlDocument xmlDocument)
{
HttpWebRequest webRequest = CreateWebRequest(url, action);
X509Certificate2 certificate = new X509Certificate2(Program.certificado, Program.passcertificado); // Aqui se carga el certificado, yo lo almaceno en la base de datos, pero podriai s cargarlo desde un archivo
var tiempo = certificate.SubjectName;
if (certificate == null)
throw new ArgumentNullException(
"Certificate is null. Maybe serial number in configuration was wrong.");

if (certificate.NotAfter < DateTime.Now)
throw new ArgumentNullException(
$"Certificate is out of date. NotAfter: {certificate.NotAfter}.");

webRequest.ClientCertificates.Add(certificate);

using (Stream stream = webRequest.GetRequestStream())
{
xmlDocument.Save(stream);
}
HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();
string statusDescription = response.StatusDescription;
Stream dataStream = response.GetResponseStream();
string responseFromServer;
using (StreamReader reader = new StreamReader(dataStream))
{
responseFromServer = reader.ReadToEnd();
reader.Close();
dataStream.Close();
response.Close();
}
return responseFromServer;
}

[/code]