Ir para conteúdo
  • Cadastre-se

areacentral

Membros
  • Total de ítens

    4
  • Registro em

  • Última visita

Posts postados por areacentral

  1. Leonardo,

    quero verificar a data de vencimento antes de associar o certificado selecionado, o método SelecionarCertificado me força a chamar GetCertificado para ter a referência de ICertificate2 e ai caso não seja o certificado correto eu já perdi a referência de ICertificate2 anterior, isto pode acontecer quando o usuário vai atualizar o certificado por exemplo.

    Há alguma razão para que o método SelecionarCertificado não associe o certificado selecionado a PCertCarregado? E Então ao chamar GetCertificado a referência já estaria associada.

  2. Olá Pessoal, bom dia!

    Precisava de alguma forma selecionar o certificado, mas antes de associar o número de serie queria validar se o usuário selecionou o certificado correto, se o cnpj conferia com o cadastro da empresa, se está vencido ou não, então criei um segundo método SelecionarCertificado2 que retorna a referência de ICertificate2 ao invés do número de série.

    Com isso consigo validar, antes de o certificado ser de fato associado ao componente da Nfe:

    function TCertificadosConf.SelecionarCertificado2: ICertificate2;
    var
      Store        : IStore3;
      Certs        : ICertificates2;
      Certs2       : ICertificates2;
      Cert         : ICertificate2;
    begin
      Store := CoStore.Create;
      Store.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_STORE_NAME, CAPICOM_STORE_OPEN_READ_ONLY);
    
      Certs := Store.Certificates as ICertificates2;
      Certs2 := Certs.Select('Certificado(s) Digital(is) disponível(is)', 'Selecione o Certificado Digital para uso no aplicativo', false);
    
      if not(Certs2.Count = 0) then
      begin
        Cert := IInterface(Certs2.Item[1]) as ICertificate2;
        //Não alterar o número de série, quem utilizar este método deve fazer isso manualmente para associar o certificado ao componente
        //FNumeroSerie := Cert.SerialNumber;
        //FDataVenc    := Cert.ValidToDate;
        //FSubjectName := Cert.SubjectName;
      end;
    
      Result := Cert;
    end;

    Fica minha sugestão para adicionar a Biblioteca, mas para evitar redundância de código, seria melhor refatorar o método SelecionarCertificado para utilizar o SelecionarCertificado2:

    function TCertificadosConf.SelecionarCertificado: AnsiString;
    var
      Cert         : ICertificate2;
    begin
      Cert := SelecionarCertificado2;
      
      if (Cert <> nil) then
      begin
        FNumeroSerie := Cert.SerialNumber;
        FDataVenc    := Cert.ValidToDate;
        FSubjectName := Cert.SubjectName;
        
        Result := FNumeroSerie;
      end;
    end;

    Exemplo de utilização:

    procedure TFrmCertificado.btnSelecionarClick(Sender: TObject);
    var Cert: ICertificate2;
    begin
      Cert := ACBRNfe1.Configuracoes.Certificados.SelecionarCertificado2;
      if (Cert <> nil) then
      begin
        if (Cert.ValidToDate < Today) then
           raise Exception.Create('Certificado vencido!');
           
        ACBRNfe1.Configuracoes.Certificados.NumeroSerie := Cert.SerialNumber;
        ACBRNfe1.Configuracoes.Certificados.GetCertificado;
      end;
    end;
    
  3. Pessoal,

    estava tentando manifestar ciência da operação no ambiente nacional:

        Nfe.EventoNFe.Evento.Clear;
        with Nfe.EventoNFe.Evento.Add do
        begin
          infEvento.cOrgao   := 91;//NotaUtil.UFtoCUF(Uf);
          infEvento.chNFe    := Chave;
          infEvento.CNPJ     := Cnpj;
          infEvento.dhEvento := Now;
          infEvento.tpEvento := teManifDestCiencia;
        end;
        Nfe.EnviarEventoNFe(1);

    Porém, sempre recebia Rejeicao: O autor do evento diverge do destinatario da NF-e

    Percebi que não estava direcionando para a url do ambiente nacional.

    A TNFeEnvEvento.DefinirURL coloca o FLayout := LayNFeEventoAN

    E na NotaUtil.GetURL é inicialmente retornado a url do ambiente nacional, mas em seguida no mesmo método é depois retornado a url do ambiente estadual, então fiz a seguinte alteração no NotaUtil.GetURL:

    class function NotaUtil.GetURL(const AUF, AAmbiente, FormaEmissao : Integer;
      ALayOut: TLayOut; AModeloDF: TpcnModeloDF = moNFe; AVersaoDF: TpcnVersaoDF = ve200): WideString;
    begin
    
    case FormaEmissao of
      1,2,4,5,9 : begin
           case ALayOut of
             LayNfeEnvDPEC      : Result := DFeUtil.SeSenao(AAmbiente=1, 'https://www.nfe.fazenda.gov.br/SCERecepcaoRFB/SCERecepcaoRFB.asmx',          'https://hom.nfe.fazenda.gov.br/SCERecepcaoRFB/SCERecepcaoRFB.asmx');
             LayNfeConsultaDPEC : Result := DFeUtil.SeSenao(AAmbiente=1, 'https://www.nfe.fazenda.gov.br/SCEConsultaRFB/SCEConsultaRFB.asmx',          'https://hom.nfe.fazenda.gov.br/SCEConsultaRFB/SCEConsultaRFB.asmx');
             LayNFeEventoAN     : Result := DFeUtil.SeSenao(AAmbiente=1, 'https://www.nfe.fazenda.gov.br/RecepcaoEvento/RecepcaoEvento.asmx',          'https://hom.nfe.fazenda.gov.br/RecepcaoEvento/RecepcaoEvento.asmx ');
             LayNfeConsNFeDest  : Result := DFeUtil.SeSenao(AAmbiente=1, 'https://www.nfe.fazenda.gov.br/NFeConsultaDest/NFeConsultaDest.asmx',        'https://hom.nfe.fazenda.gov.br/NFeConsultaDest/NFeConsultaDest.asmx');
             LayNfeDownloadNFe  : Result := DFeUtil.SeSenao(AAmbiente=1, 'https://www.nfe.fazenda.gov.br/NfeDownloadNF/NfeDownloadNF.asmx',            'https://hom.nfe.fazenda.gov.br/NfeDownloadNF/NfeDownloadNF.asmx');
             LayDistDFeInt      : Result := DFeUtil.SeSenao(AAmbiente=1, 'https://www1.nfe.fazenda.gov.br/NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx', 'https://hom.nfe.fazenda.gov.br/NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx');                                                                    https://www1.nfe.fazenda.gov.br/NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx
           end;
    
           
           if (ALayOut <> LayNFeEventoAN) then //Adicionei esta verificação
           begin
             case AUF of
              ...
             end;
           end;
        end;
    end;

    Bom, resolveu, me retornou a url do ambiente nacional, mas não tenho certeza se seria a melhor solução, e se for, para que seja adicionado aos fontes.

×
×
  • 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.