Ir para conteúdo
  • Cadastre-se

dev botao

Método SelecionarCertificado que retorne ICertificate2


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

Recommended Posts

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;
Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 3226 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.