Ver Mensaje Individual
  #3  
Antiguo 25-06-2024
Avatar de elcharlie
elcharlie elcharlie is offline
Miembro
 
Registrado: mar 2013
Ubicación: Bilbao
Posts: 193
Reputación: 14
elcharlie Va por buen camino
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 //Consultar Unidades
        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 //Consultar Unidades por Administracion
       .......

  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.AddBodyReference('', true);
    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"

Última edición por elcharlie fecha: 25-06-2024 a las 14:22:54.
Responder Con Cita