A ver si alguien me puede ayudar, porque ya no sé que esto haciendo mal.
Esto es lo que hago, firmo con secure black box
Código Delphi
[-]
procedure TFrMain.ButtonEjecutarClick(Sender: TObject);
var
SoapHeader: TSOAPHeader;
SOAPRequester: FacturaSSPPWebServiceProxyPort;
I: Integer;
DatoEntrada: string;
ConsultarUnidadesRespuesta: ConsultarRelacionesResponse;
ConsultarRelacionesPorAdministracionRespuesta: ConsultarRelacionesPorAdministracionResponse;
ConsultarNIFsRespuesta: ConsultarNIFsResponse;
ConsultarNIFsPorAdministracionRespuesta: ConsultarNIFsPorAdministracionResponse;
ConsultarEstadoRespuesta: ConsultarEstadosResponse;
ReceiverEnviarFactura: EnviarFacturaResponse;
SenderEnviarFactura: EnviarFacturaRequest;
Anexos: ArrayOfAnexoFile;
Anexo: AnexoFile;
SelecFile: TOpenDialog;
ConsultarFacturaRespuesta: ConsultarFacturaResponse;
begin
try
TxtResult.Lines.Clear;
GD_HTT_PRIO := THTTPRIO.Create(nil);
GD_HTT_PRIO.WSDLLocation := DEF_FWSDL_PRUEBAS;
GD_HTT_PRIO.URL := DEF_URL_PRUEBAS;
GD_HTT_PRIO.Service := DEF_SERVICE_PRUEBAS;
GD_HTT_PRIO.Port := DEF_PORT_PRUEBAS;
SoapHeader := TSOAPHEADER.create;
GD_HTT_PRIO.SOAPHeaders.Send(SoapHeader);
TCustomProcedureFACE.NumSerial := BinToStr((ComboBoxCertificadosEnvio.Items.Objects[ComboBoxCertificadosEnvio.ItemIndex] as TsbxCertificate).SerialNumber);
TCustomProcedureFACE.RutaResultado := EdtRutaRespuesta.Text;
GD_HTT_PRIO.HTTPWebNode.ClientCertificate.SerialNum := BinToStr((ComboBoxCertificadosEnvio.Items.Objects[ComboBoxCertificadosEnvio.ItemIndex] as TsbxCertificate).SerialNumber);
GD_HTT_PRIO.OnBeforeExecute := TCustomProcedureFACE.BeforeExecute;
GD_HTT_PRIO.OnAfterExecute := TCustomProcedureFACE.AfterExecute;
SOAPRequester := (GD_HTT_PRIO as FacturaSSPPWebServiceProxyPort);
case ComboBoxFunciion.ItemIndex of
0: begin ConsultarUnidadesRespuesta := SOAPRequester.consultarUnidades;
if (Trim(ConsultarUnidadesRespuesta.resultado.codigo) = '0') then
begin
for I := Low(ConsultarUnidadesRespuesta.relaciones) to High(ConsultarUnidadesRespuesta.relaciones) do
begin
TxtResult.Lines.Add('Oficina Contable: ' + ConsultarUnidadesRespuesta.relaciones[i].oficinaContable.codigo +
' ' + ConsultarUnidadesRespuesta.relaciones[i].oficinaContable.nombre);
TxtResult.Lines.Add('Organo Gestor: ' + ConsultarUnidadesRespuesta.relaciones[i].organoGestor.codigo +
' ' + ConsultarUnidadesRespuesta.relaciones[i].organoGestor.nombre);
TxtResult.Lines.Add('Unidad Tramitadora: ' + ConsultarUnidadesRespuesta.relaciones[i].unidadTramitadora.codigo +
' ' + ConsultarUnidadesRespuesta.relaciones[i].unidadTramitadora.nombre);
TxtResult.Lines.Add('');
end;
end
else
begin
TxtResult.Lines.Add('ERROR:');
TxtResult.Lines.Add(ConsultarUnidadesRespuesta.resultado.codigo + '-' +
ConsultarUnidadesRespuesta.resultado.descripcion + ' (' +
ConsultarUnidadesRespuesta.resultado.codigoSeguimiento + ')');
end;
end;
1: begin .......
SOAPRequester := nil;
SoapHeader.Free;
GD_HTT_PRIO := nil;
except on E: Exception do
ShowMessage('ButtonEjecutarClick: ' + e.ToString);
end;
end;
y luego el onbefore y onafter
Código Delphi
[-]
class procedure TCustomProcedureFACE.BeforeExecute(const MethodName: string;
SOAPRequest: TStream);
var
SS: TStringStream;
FSOAPSigner: TsbxSOAPSigner;
OutPut: TBytes;
Cert : TsbxCertificate;
I: Integer;
function StreamToBytes(Stream: TStream): TBytes;
begin
SetLength(Result, Stream.Size);
Stream.Position := 0;
Stream.ReadBuffer(Result[0], Stream.Size);
end;
begin
try
FSOAPSigner := TsbxSOAPSigner.Create(nil);
FSOAPSigner.InputBytes := StreamToBytes(SOAPRequest);
FSOAPSigner.OutputFile := RutaResultado + PathDelim + FILE_TEMP_OUTPUT;
if trim(NumSerial) = EmptyStr then
begin
ShowMessage('Error SignXML: ' + 'No existe el Certificado');
Exit;
end;
for I := 0 to GD_ListaCertificados.Count-1 do
begin
if BinToStr(GD_ListaCertificados[i].SerialNumber) = NumSerial then
begin
Cert := GD_ListaCertificados[i];
Break;
end;
end;
if not Assigned(Cert) then
begin
ShowMessage('Error SignXML: ' + 'No se encuentra el Certificado');
Exit;
end;
FSOAPSigner.SigningCertificate := Cert;
FSOAPSigner.NewSignature.SignatureType := sstWSSSignature;
FSOAPSigner.NewSignature.HashAlgorithm := 'SHA1';
FSOAPSigner.EmbedCertificateMethod := cwecInBinarySecurityToken;
FSOAPSigner.Config('XMLFormatting=auto');
FSOAPSigner.Sign();
if FileExists(RutaResultado + PathDelim + FILE_TEMP_OUTPUT) then
begin
SS := TStringStream.Create;
SS.LoadFromFile(RutaResultado + PathDelim + FILE_TEMP_OUTPUT);
FrMain.TxtRequest.Lines.Clear;
FrMain.TxtRequest.Lines.Add(SS.DataString);
FrMain.TxtRequest.Lines.Add('');
SOAPRequest.Position := 0;
SOAPRequest.CopyFrom(SS,SS.Size);
SS.Free;
end;
except on E: Exception do
ShowMessage('Error en BeforeExecute: ' + e.ToString);
end;
end;
class procedure TCustomProcedureFACE.AfterExecute(const MethodName: string;
SOAPResponse: TStream);
var
SS: TStringStream;
begin
try
if FileExists(RutaResultado + PathDelim + FILE_RESULT_NAME) then
DeleteFile(RutaResultado + PathDelim + FILE_RESULT_NAME);
SS := TStringStream.Create('', TEncoding.UTF8);
SOAPResponse.Position := 0;
SS.CopyFrom(SOAPResponse, SOAPResponse.Size);
FrMain.TxtResponse.Lines.Clear;
FrMain.TxtResponse.Text := SS.DataString;
SS.SaveToFile(RutaResultado + PathDelim + FILE_RESULT_NAME);
SS.Free;
except on E: Exception do
ShowMessage('Error en AfterExecute: ' + e.ToString);
end;
end;
A ver si alguien me puede echar una mano, porque esto da error "La petición no esta firmada"