Ir para conteúdo
  • Cadastre-se

dev botao

ACBRDFeWebServices


Ver Solução Respondido por Italo Giurizzato Junior,
  • Este tópico foi criado há 3292 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Boa tarde,

Hoje de manhã fiz um post por esbarrar num problema com o NFSe usando o provedor do SimplISS.

Nesse post até propus uma solução no fonte para esse problema, mas conforme fui avançando notei que toda a parte de "consumo" do webservice do NFSe está "em cima" do ACBrDFeWebService e este faz N validações do certificado.

O problema é que o SimplISS não exige certificado o que faz com que eu não consiga enviar absolutamente nada para o webservice.

Abaixo está a função EnviarDados do ACBrDFeWebServices todas minhas requisições passaram por ela e ela por si só exige informações do certificado.

procedure TDFeWebService.EnviarDados;
Var
  Tentar, Tratado: Boolean;
begin
  { Sobrescrever apenas se necessário }

  FPRetWS := '';
  FPRetornoWS := '';

  { Verifica se precisa converter o Envelope para UTF8 antes de ser enviado.
     Entretanto o Envelope pode já ter sido convertido antes, como por exemplo,
     para assinatura.
     Se o XML está assinado, não deve modificar o conteúdo }
  if not XmlEstaAssinado(FPEnvelopeSoap) then
    FPEnvelopeSoap := ConverteXMLtoUTF8(FPEnvelopeSoap);

  Tentar := True;
  while Tentar do
  begin
    Tentar := False;
    Tratado := False;

    if FPConfiguracoes.Certificados.VerificarValidade and
       (FPDFeOwner.SSL.CertDataVenc < Now) then
      raise EACBrDFeException.Create('Data de Validade do Certificado já expirou: '+
                                     FormatDateBr(FPDFeOwner.SSL.CertDataVenc));

    try
      FPRetornoWS := FPDFeOwner.SSL.Enviar(FPEnvelopeSoap, FPURL, FPSoapAction, FPMimeType);
    except
      if Assigned(FPDFeOwner.OnTransmitError) then
        FPDFeOwner.OnTransmitError( FPDFeOwner.SSL.HTTPResultCode,
                                    FPDFeOwner.SSL.InternalErrorCode,
                                    FPURL, FPEnvelopeSoap, FPSoapAction,
                                    Tentar, Tratado) ;

      if not (Tentar or Tratado) then
        raise;
    end;
  end;

  { Resposta sempre é UTF8, ParseTXT chamará DecodetoString, que converterá
    de UTF8 para o formato nativo de  String usada pela IDE }
  FPRetornoWS := ParseText(FPRetornoWS, True, True);
end;

Existe algo que eu possa fazer? Estou pensando da forma correta (uso o componente a um bom tempo, mas fui tentar "entender" ele recentemente)?

 

Att, Marcos

Marcos Gerene

[email protected]

  • Consultores
Postado

Boa tarde Marcos,

Na procedure EnviarDados temos apenas duas linhas onde faz referencia ao certificado digital.

N primeira é checado se o XML esta assinado ou não, mas neste caso o componente não se utiliza do certificado, apenas verifica se existe ou não a TAG Signature no XML, portanto não há motivo de se preocupar.

A segunda verifica a validade do certificado:

    if FPConfiguracoes.Certificados.VerificarValidade and
       (FPDFeOwner.SSL.CertDataVenc < Now) then
      raise EACBrDFeException.Create('Data de Validade do Certificado já expirou: '+
                                     FormatDateBr(FPDFeOwner.SSL.CertDataVenc));
 

Acredito que se alterarmos o código acima para:

    if FPConfiguracoes.Certificados.VerificarValidade then
      if
 (FPDFeOwner.SSL.CertDataVenc < Now) then
      raise EACBrDFeException.Create('Data de Validade do Certificado já expirou: '+
                                     FormatDateBr(FPDFeOwner.SSL.CertDataVenc));
 

E atribuir o valor False a propriedade VerificarValidade não teremos problemas no que diz respeito ao certificado.

  • Curtir 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

Boa tarde Ítalo,

Fiz a alteração que me passou e a que eu tinha dito no outro post, porém agora a exceção ocorre em ACBrDFeCapicomDelphiSoap

procedure TDFeCapicomDelphiSoap.OnBeforePost(const HTTPReqResp: THTTPReqResp;
  Data: Pointer);
var
  CertContext: ICertContext;
  PCertContext: Pointer;
  ContentHeader: String;
begin
  CertContext := Certificado as ICertContext;
  CertContext.Get_CertContext(integer(PCertContext));

  with FpDFeSSL do
  begin
    if not InternetSetOption(Data, INTERNET_OPTION_CLIENT_CERT_CONTEXT,
      PCertContext, SizeOf(CERT_CONTEXT)) then
      raise EACBrDFeException.Create('Erro ao ajustar INTERNET_OPTION_CLIENT_CERT_CONTEXT: ' +
                                     IntToStr(GetLastError));

    if trim(ProxyUser) <> '' then
      if not InternetSetOption(Data, INTERNET_OPTION_PROXY_USERNAME,
        PChar(ProxyUser), Length(ProxyUser)) then
        raise EACBrDFeException.Create('Erro ao ajustar INTERNET_OPTION_PROXY_USERNAME: ' +
                                       IntToStr(GetLastError));

    if trim(ProxyPass) <> '' then
      if not InternetSetOption(Data, INTERNET_OPTION_PROXY_PASSWORD,
        PChar(ProxyPass), Length(ProxyPass)) then
        raise EACBrDFeException.Create('Erro ao ajustar INTERNET_OPTION_PROXY_PASSWORD: ' +
                                       IntToStr(GetLastError));

    ContentHeader := Format(ContentTypeTemplate, [FMimeType+'; charset=utf-8']);
    HttpAddRequestHeaders(Data, PChar(ContentHeader), Length(ContentHeader),
                            HTTP_ADDREQ_FLAG_REPLACE);
  end;

  FIndyReqResp.CheckContentType;
end;

Na linha   CertContext.Get_CertContext(integer(PCertContext)); ocorre um Acess Violation.

 

Obrigado pela atenção

Marcos Gerene

[email protected]

Postado

Bom dia Ítalo, tudo bem?

 

Na empresa em que eu trabalho (a própria software house) usamos o SimplISS e até pouco tempo atrás nem havia certificado emitido para nós, emitimos somente para o SAT quando este foi lançado.

Ainda hoje a máquina do financeiro que faz as NFS-e não tem o certificado instalado pois não emitimos NF-e, somente a NFS-e.

 

Att, Marcos

Marcos Gerene

[email protected]

  • Consultores
  • Solution
Postado

Bom dia Marcos,

O componente ACBrNFSe - Trunk2 se utiliza de diversas rotinas padronizadas que são utilizadas pelos demais componentes que emitem Documentos Fiscais Eletrônicos.

Acredito que mesmo o provedor não necessitando que o RPS e ou Lote seja assinados digitalmente será necessário possuir um certificado instalado na maquina e o componente configurado para este certificado.

Em um primeiro momento você pode achar que o custo seja desnecessário, mas lembre-se que se tratando de NFS-e as coisas mudam.

Se a prefeitura não possui um sistema próprio então ela contratou uma empresa (provedor) através de licitação, sendo assim quando vencer o contrato uma nova licitação sera feita e uma nova empresa pode ganhar.

Se essa nova empresa (provedor) requer que o RPS e ou o lote sejam assinados, não vai ter jeito, você vai ter que adquirir o certificado.

  • Curtir 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

Boa dia Ítalo,
 

Nós já temos o certificado que emitimos devido ao SAT porém simplesmente não usávamos por não haver necessidade.

O meu "problema" na verdade pode ser sanado facilmente só usando o certificado, mas eu criei o tópico porque encontrei esse particularidade, mas se isso pode "quebrar" a estrutura planejada por um benefício muito baixo entendo a "não alteração" (não é viável).

 

Obrigado,

Marcos

  • Curtir 1

Marcos Gerene

[email protected]

  • Este tópico foi criado há 3292 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.