-
Total de ítens
4 -
Registro em
-
Última visita
Tipo de Conteúdo
Blocks
Notes ACBrLibNFe
Fóruns
Downloads
Calendário
Posts postados por areacentral
-
-
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;
-
Olá Italo,
Está resolvido, atualizei os pacotes, recompilei a biblioteca e funcionou tudo certo!
Estava com problemas também no webservice de Download da Nfe, vi que já foi comentado para não utilizar a url da estadual, então também tá resolvido isso.
Valeu, obrigado!
- 1
-
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.
Método SelecionarCertificado que retorne ICertificate2
em ACBrNFe
Postado
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.