A ver, que esto está empezando a volverme loco...
He creado el XML y lo he revisado con la utilidad de "invocación de webservice de la AEAT" para comprobar si es válido:
https://prewww1.aeat.es/static_files...teWSAEAT2.html
La respuesta del servidor es "Correcto".
Por lo tanto, entiendo que en el XML que genero está todo bien, pero por algún motivo el componente HTTPRIO no está leyendo la respuesta porque me devuelve el error:
Received content of invalid content-type setting: text/html - SOAP expects "text/xml"
Entiendo que en el SII no hay que firmar el XML, solo el envío. Esto lo hago en el evento OnNeedCertificate:
Código:
for I := 0 to ACertificateList.Count - 1 do
begin
if i=strtointdef(comboCertificate.items.SelectedItem.Hint,0) then
begin
AnIndex := I;
Exit;
end;
end;
El envío lo hago usando el HTTPRIO, que no es que me guste pero no sé si hay otra forma de hacerlo (En TicketBAI y VeriFactu uso NetHTTPRequest y NetHTTPClient).
Código:
try
// se hace la llamada a la funcion suministrada por el WS
if ENTORNO_DE_PRUEBAS then
begin
HTTPRIO1.WSDLLocation := 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroFactEmitidas.wsdl';
HTTPRIO1.Service := 'siiService';
HTTPRIO1.Port := 'SuministroFactEmitidasPruebas';
HTTPRIO1.URL := 'https://prewww1.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP';
end
else
begin
HTTPRIO1.WSDLLocation := 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroFactEmitidas.wsdl';
HTTPRIO1.Service := 'siiService';
HTTPRIO1.Port := 'SuministroFactEmitidas';
HTTPRIO1.URL := 'https://www1.agenciatributaria.gob.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP';
end;
result := GetsiiSOAP(false,HTTPRIO1.URL,HTTPRIO1).SuministroLRFacturasEmitidas(ASuministroLRFacturasEmitidas);
//mostrar los resultados devueltos por la llamada
for i := low(result.RespuestaLinea) to High(result.RespuestaLinea) do
begin
with result.RespuestaLinea[i] do
begin
//si el estado no es correcto, se muestran los errores
if EstadoRegistro <> EstadoRegistroType(0) then
begin
showmessage('Error ' + InttoStr(CodigoErrorRegistro)+#13#10+DescripcionErrorRegistro);
error:=DescripcionErrorRegistro;
end
else
begin
spain.Table1.edit;
spain.Table1.FieldByName('ID_HACIENDA').AsString:=result.CSV;
spain.Table1.Post;
end;
end;
end;
except
On E:Exception do
MessageDlg(E.Message, mtError, [mbOK], 0);
end;
¿Alguien puede decirme si el envío lo está haciendo de la misma manera o si ve algo raro en lo anterior?
He probado también a hacer el envío con el componente NetHTTPClient para ver qué pasa. En ese caso, como respuesta obtengo un código html de una página de la AEAT (eso explica el error si uso HTTPRIO, estoy obteniendo como respuesta una página html en vez de un xml).
¿Puede alguien confirmarme si las URL que estoy usando y la forma de llamar a GetsiiSOAP() es correcta? Algo me dice que el envío está abriendo otra página, o algo similar, y por eso devuelve html y no xml.
La firma del envío la hago en el evento OnNeedCertificate del HTTPRIO. No creo que eso esté mal porque lleva funcionando así siempre.
¿Será que debo usar otro certificado distinto? ¿Hay que darse de alta en algún sitio primero? ¿Puedo usar certificados de prueba? ¿Debe el nombre del emisor coincidir con el nombre en el certificado?
La verdad es que ya no sé qué más probar. Funcionaba todo bien hasta hace unos días (al menos a mi cliente). Y ahora tanto él como yo no podemos enviar al entorno de pruebas.