Ir para conteúdo
  • Cadastre-se

Valdir Dill

Membros Pro
  • Total de ítens

    924
  • Registro em

  • Última visita

  • Days Won

    4

Posts postados por Valdir Dill

  1. Não, no código Acbr não mexi. Apenas pesquisei para ver se tinha alguma rotina para transformar a octet-stream que retorna, em um arquivo .pdf.

    Essa mexida no código Acbr foi o @DevSolucaoSistemasque fez, lá no início do ano passado quando ele abriu esse post. Mas depois não teve mais continuidade.

    O arquivo .txt com a stream que retorna da Sicredi eu anexei na minha postagem anterior (há pouco).

    O que eu precisaria é de uma rotina (em Delphi) para salvar essa stream em arquivo .pdf, entende?  

    Obrigado  

  2. 11 minutos atrás, Juliomar Marchetti disse:

    Creio que ele deva ter desistido ou o código está já funcionando do svn pois já faz 1 ano da ultima interação dele

    Boa tarde,

    Sim @Juliomar Marchettieu havia notado que o post é bastante antigo. Mas como não encontramos nada a respeito do assunto (e já pesquisamos um bocado nos últimos dias), resolvemos arriscar perguntando aqui no post do amigo. Vai que...rs.

    No componente não tem opção para tratar retorno pdf da Sicred. Já virei os fontes de ponta cabeça e não encontrei.

    Talvez a questão seja até simples de resolver, e seja eu que não esteja achando o fio da meada. 
    Veja se podes me ajudar com alguma dica, por gentileza.

    É assim: o que ocorre é que a Sicredi, no caso da requisição do .pdf, ela retorna uma octet-stream, conforme arquivo que estou anexando a este post.
    O meu problema é que não estou sabendo como fazer para gerar o arquivo .pdf com essa stream, entende?
    Qualquer sugestão ajuda, rs.

    Obrigado! 

    retPdf.txt

  3. Em 07/02/2023 at 16:57, DevSolucaoSistemas disse:

    Vou fazer uns testes em produção essa semana para poder postar os fontes aqui. Essa implementação é da API do Sicredi que permite fazer o boleto Hibrido. Terminando crio um tópico com os fontes novos para validação.

    Bom dia, @DevSolucaoSistemas

    Conseguistes algum progresso em relação a gerar o arquivo .pdf com a octet-stream retornada pela API Sicredi?

    Se sim, por gentileza, compartilha conosco, pois nós, e com certeza outros, estão com o mesma dificuldade. 

    Obrigado! 

    • Curtir 1
  4. 6 minutos atrás, Diego Foliene disse:

    No tópico Como solicitar credenciais e configurar PSPs no componente temos a seguinte informação para o Sicredi:

    Ao baixar esta cartilha e conferir na mesma temos:

    image.png

    Dado o retorno que você obteve, entendo que foi usado o arquivo resultante de Download Key.

    A sugestão seria realizar um teste com o arquivo de Download Key (Sem frase de segurança)

    Ah, perfeito.

    Vamos tentar isso e retornaremos com os resultados.

    Obrigado! 

    • Curtir 1
  5. 1 hora atrás, Diego Foliene disse:

    Bom dia!

    Conferindo no seu arquivo api-pix-pix_max.key, o mesmo começa com:

    Ou seja, o mesmo é o arquivo da chave privada criptografada com a senha e no momento da leitura pela dll da OpenSSL, espera se que essa senha seja fornecida em algum momento.

    Ao fazer um teste aqui em meu ambiente, notei que é no momento que a informação vai ser passada para a dll fazer a leitura, ela chega como

    Ou seja, só a chave.

    Por favor, faça um teste configurando no componente o arquivo Key (Sem frase de segurança).

    Boa tarde

     

      Em 10/03/2024 at 08:02, Valdir Dill disse:

    Bom dia,

    Estamos tendo erro "bad decrypt" ao carregar (no demo Acbr) o arquivo de chave privada (.key. Arquivo .key e print do erro, em anexo.

    Esse arquivo foi gerado no portal do Sicredi, assim como o .cer. 

    Fiz um teste gerando um arquivo de chave privada pelo demo do Acbr. Este é carregado sem erros. 

     

    Alguma sugestão do que pode ser esse problema?

    Obrigado

    ErroDemo.png

    1 hora atrás, Diego Foliene disse:

    Bom dia!

    Conferindo no seu arquivo api-pix-pix_max.key, o mesmo começa com:

    Ou seja, o mesmo é o arquivo da chave privada criptografada com a senha e no momento da leitura pela dll da OpenSSL, espera se que essa senha seja fornecida em algum momento.

    Ao fazer um teste aqui em meu ambiente, notei que é no momento que a informação vai ser passada para a dll fazer a leitura, ela chega como

    Ou seja, só a chave.

    Por favor, faça um teste configurando no componente o arquivo Key (Sem frase de segurança).

    Boa tarde,

    Sim, como eu havia dito, eu fiz um teste com o outro arquivo .key que gerei pelo demo Acbr, e esse arquivo tem na primeira linha o "-----BEGIN RSA PRIVATE KEY-----". Esse arquivo não dá erro ao carregá-lo no Demo.
    Mas o arquivo .key que vem do banco é esse que anexei e, ao carregá-lo, dá o erro. 

    Por favor, faça um teste configurando no componente o arquivo Key (Sem frase de segurança)...
    Não entendi muito bem. Pode, por gentileza, detalhar mais como eu faria esse teste?

    Obrigado!

     

  6. Bom dia,

    Estamos tendo erro "bad decrypt" ao carregar (no demo Acbr) o arquivo de chave privada (.key. Arquivo .key e print do erro, em anexo.

    Esse arquivo foi gerado no portal do Sicredi, assim como o .cer. 

    Fiz um teste gerando um arquivo de chave privada pelo demo do Acbr. Este é carregado sem erros. 

     

    Alguma sugestão do que pode ser esse problema?

    Obrigado

    ErroDemo.png

    api-pix-pix_max.key

  7. 3 minutos atrás, Daniel Simoes disse:

    Você não deve escrever um código como esse... pois ele está presumindo que sempre haverá um elemento PIX na resposta, o que pode não ser verdadeiro...

    Quando for trabalhar com Arrays ou Listas, sempre verifique primeiro a propriedade Count para depois tentar acessar os elementos...

    Exemplo

    If ACBrPixCD1.PSP.epCob.CobCompleta..pix.Count > 0 then
       VRetorno.FValorPago := ACBrPixCD1.PSP.epCob.CobCompleta.pix[0].valor;
    esse
       VRetorno.FValorPago := 0;

     

    Sim, eu concordo que ao varrer uma lista, deve ser verificado antes o seu count. A boa prática de código seria essa.

    Mas note que o código (na rotina completa que coloquei) só pega o index 0 se ACBrPixCD1.PSP.epCob.CobCompleta.status = stcCONCLUIDA.
    E veja também (no .txt que anexei) que, no momento em que ocorre a exceção, em ACBrPixCD1.PSP.epCob.CobCompleta.AsJSON tem sim um PIX.

    Então, se status = stcCONCLUIDA e ACBrPixCD1.PSP.epCob.CobCompleta.AsJSON contém retorno de um PIX pago, o ACBrPixCD1.PSP.epCob.CobCompleta.pix.count não deveria estar necessariamente > 0?

    Obrigado!

  8. Bom dia,

    Estamos tendo um erro na hora de confirmar se um PIX dinâmico, banco Inter, foi pago.
    Gostaria de ajuda para ver se há alguma coisa errada em nosso código ou se pode ser algum problema no componente.

    O que ocorre é que são gerados e confirmados 6, 7, ...PIX ou mais, tudo normal, ou seja, é gerado o qrCode e depois a confirmação.
    Porém, aleatoriamente acontece um erro. Como eu disse, vários PIX processam normalmente e, de repente, um deles dá problema, sem que nada diferente seja feito em relação aos PIX anteriores que processaram corretamente.

    A consulta é feita por um timer com interval de 5 segundos. 

    O erro é: "Argument out of range". Acreditamos (não temos certeza porque não há como debbugar) que ocorra nessas linhas de nosso código:
     begin
      VRetorno.FValorPago := ACBrPixCD1.PSP.epCob.CobCompleta.pix[0].valor;
      VRetorno.FEndToEnd := ACBrPixCD1.PSP.epCob.CobCompleta.pix[0].endToEndId;
     end; 


    O código todo de tratamento da confirmação é este:

    try
      if not ACBrPixCD1.PSP.epCob.ConsultarCobrancaImediata(VID_PIXGerado) then  //se não conseguiu fazer a consulta.
       begin
        TimerConsultarPIX.Enabled := false;

        VRetorno.FStatus := stcNENHUM;
        VRetorno.FErro := 'Não foi possível efetuar a consulta.';
       end
      else
       begin
        VRetorno.FStatus := ACBrPixCD1.PSP.epCob.CobCompleta.status;

        if VRetorno.FStatus <> stcATIVA then //se estivar ativa, ou seja, se não foi paga nem baixada, não sai.
         begin
          TimerConsultarPIX.Enabled := false;

          if VRetorno.FStatus = stcCONCLUIDA then
           begin
            VRetorno.FValorPago := ACBrPixCD1.PSP.epCob.CobCompleta.pix[0].valor;
            VRetorno.FEndToEnd := ACBrPixCD1.PSP.epCob.CobCompleta.pix[0].endToEndId;
           end
          else  ChamaErro('O PIX mudou status, mas não foi pago. Seu status está: ' + PIXStatusCobrancaToString(VRetorno.FStatus));
        end;
       end;
     except
      on e:exception do
       begin
        TimerConsultarPIX.Enabled := false;
        VMsg := 'Ocorreu um erro ao tentar buscar o status de pagamento do PIX.';
        VMsg := VMsg + '- exception: ' + e.message + sLineBreak + '- Status do PIX: ' + PIXStatusCobrancaToString(VRetorno.FStatus);
        if NaoEstaVazio(ACBrPixCD1.PSP.epCob.CobCompleta.AsJSON) then
          VMsg := VMsg + sLineBreak + '- Json retornado: ' + ACBrPixCD1.PSP.epCob.CobCompleta.AsJSON;

        WriteToTXT(VG.FDirTemp + 'logPIX.txt', VMsg, false);
        ChamaErro(VMsg);
       end;
     end;

    Ou tem alguma coisa que estamos fazendo errado (o tempo do timer talvez?), ou, em algum momento o componente se perde e não alimenta a lista do ACBrPixCD1.PSP.epCob.CobCompleta.pix[0], pois a consulta retorna tudo certo no, conforme dá para ver no arquivo logPIX.txt que é gravado e estou anexando aqui.

     Obrigado

    logPIX.txt

  9. Deixe-me se entendi a sugestão e me ajudem colocar isso em um código, por favor.

    no evento ACBrTEFAPI1QuandoPerguntarMenu eu faria:

    - if szPrompt = "DATA 1 PARCELA:" then VIDentificadorGuardadoDataPrimeiraParcela := wIdentificador

    - if szPrompt = "VALOR 1 PARCELA:" then  VIDentificadorGuardadoValorPrimeiraParcela := wIdentificador


    aí, no final da operação faço:
    DataPrimeiraParcela := ACBrTEFAPI1.UltimaRespostaTEF.LeInformacao(VIDentificadorGuardadoDataPrimeiraParcela)
    ValorPrimeiraParcela := ACBrTEFAPI1.UltimaRespostaTEF.LeInformacao(VIDentificadorGuardadoValorPrimeiraParcela)

    Seria isso?

    Obrigado!

  10. 4 horas atrás, EMBarbosa disse:

    Olá Valdir,

    Se você quiser capturar durante a apresentação dos dados, você pode usar os eventos OnObtemCampo e OnExibeMenu.

    É justamente nesse código que os usuários vão informar os dados ao TEF.

    Boa noite,

    Obrigado @EMBarbosa  as acho que você não entendeu bem nossa dúvida/dificuldade.

    Vou tentar explicar melhor.

    Bem, em primeiro lugar, é preciso registrar que, na verdade os eventos que você sugere seriam os QuandoPerguntarCampo e QuandoPerguntarMenu.
    Obs.: estamos falando do TEF PayGo, ok?

    Mas a questão não é onde (quando) pegar esses dados e sim, COMO pegar. Qual a rotina/método usar? 

    Por exemplo, se eu quiser saber a quantidade de parcelas, vou ler:
    ACBrTEFAPI1.UltimaRespostaTEF.LeInformacao(PWINFO_INSTALLMENTS), certo?

    Mas COMO ler, por exemplo, o valor e vencimento da parcela 02 dessa transação que eu mencionei na abertura deste post?

    Os parâmetros PWINFO_INSTALLMDATE e PWINFO_INSTALLM1AMT trazem o vencimento e valor, mas é apenas da entrada (acredito que seja a primeira parcela).
    Mas e as parcelas 2, 3, ...? Como faço para obter seus dados?

    Obs.: eu já havia relatado essa situação no Discord e o @Daniel Simoes me orientou a abrir um post aqui no fórum para uma melhor análise.

    Obrigado

  11. Bom dia,

    Estamos tentando implementar a opção de recebimento no TEF com cartão de débito com mais de 1 parcela.

    Em anexo enviamos os arquivos de log para análise, se necessário.
    A operação realizada e que consta no log foi:
    - Cartão débito
    - 3 parcelas
    - Valor total: R$ 10,00

    Ao iniciar o processamento, o TEF faz as perguntas:
    1) Se a primeira parcela será à vista: foi respondido que não;

    2) Se as parcelas serão iguais: respondido que não;
    Por conta dessa resposta, o TEF pergunta o valor e vencimento de cada parcela. Foi informado assim:
    - Parcela 01: R$ 2,00; vencimento: 05/01/24
    - Parcela 02: R$ 3,00; vencimento: 10/01/24
    - Parcela 03: R$ 5,00; vencimento: 15/01/24

    A questão que não estamos conseguindo fazer é capturar os dados dessas parcelas. 
    Como é uma informação que o operador vai digitar na tela do TEF, precisamos capturar essa lista de parcelas após a operação ser autorizada, para podermos gravar no banco de dados da nossa aplicação.
    Como fazer essa captura?

    Em anexo arquivos de log e também comprovante impresso da transação.

    Obrigado!

    Comprovante.jpg

    comms_231221.log Log21122023.txt ppsers_231221.log

  12. 6 minutos atrás, Alexandre de Paula disse:

    Bom dia @Valdir Dill

    A versão 3.0 foi recém disponibilizada e é muito importante que a comunidade utilize e reporte os problemas para podermos corrigir.

    Obrigado pela informação e assim que tivermos uma atualização a esse respeito informamos aqui. Criamos a TK-4659 para avaliar o caso.

    O procedimento no momento é exatamente o que você realizou, operar com a versão 1.1 até termos uma atualização.

    Obrigado mais uma vez.

    Sim, exatamente essa foi a intenção do post, informar para que a questão seja analisada e, se for o caso, aplicada a correção.

    Obrigado!

    • Curtir 4
    • Obrigado 1
  13. 1 minuto atrás, Daniel InfoCotidiano disse:

    Bom dia @Valdir Dill
    E as dlls 3.0 estão ai na pasta do seu exe?
    Segue os links das dlls
    http://svn.code.sf.net/p/acbr/code/trunk2/DLLs/OpenSSL/3.1.3/

    Sim sim, exatamente por causa das dll estarem na pasta é que o Acbr está carregando elas e, quando as carrega, ocorre o problema.

    Entendo perfeitamente essa questão das .dll openSSL e que o Acbr buscará na pasta do .exe. Já usamos isso há vários anos, rs.

    A questão é simples: com dlls versão 1.1, tudo certo. Com dlls versão 3.0, vai dar esse erro. 

    Acredito que você fizer esse teste aí, vai acontecer o erro também, pois aconteceu com vários usuários nossos. Assim que colocamos as novas dlls na pasta, o problema ocorreu. Voltamos as dlls 1.1, o problema foi sanado.

    Lembrando que só ocorre se usar assim: FAcbrNota.SSL.DadosPFX := ...
    Se alimentar o número de série, ou buscando o .pfx do arquivo, o problema não acontece.

    Obrigado! 

    • Curtir 2
  14. Bom dia,

    Assim como sempre fizemos, estamos alimentando os dados do certificado no componente com uma stream gravada no BD de nossa aplicação.

    Desta forma:
    TBlobField(FDSFiscais.FieldByName('CERT_DADOSPFX')).SaveToStream(VStream);
    FAcbrNota.SSL.DadosPFX := VStream.DataString;

    Sempre funcionou e continua funcionando.

    Porém, com as openSSL versão 3 não funciona.
    Após alimentar os dados no componente e se tenta verificar o CNPJ AcbrNFe1.SSL.CertCNPJ ocorre o erro em anexo.

    Repito: a mesma rotina, mas utilizando as openSSL 1.1, não ocorre nenhum erro. 

     

     

     

    image.png

  15. 5 horas atrás, Daniel InfoCotidiano disse:

    @Valdir Dill
    Bom dia !
    Por favor pode testar com o programa exemplo?
    Como este exemplo é um sistema comum entre nós do ACBr e os clientes, se puder testar por gentileza.
    Assim podemos simular aqui, caso aconteça o mesmo erro nos seus testes.
    Muito Obrigado

    Boa tarde,

    No programa de exemplo não ocorre.

    Vamos investigar melhor o que pode ser.

    Obrigado

    • Curtir 1
  16. 4 horas atrás, Valdir Dill disse:

    Boa tarde,

    Não sei se estou fazendo algo errado, mas aqui não está salvando os XML dos eventos na pasta que indico para salvamento. Salva esses 2 arquivos abaixo, mas .json. Isso na consulta de evento usando apenas a chave.

    - 31056082203424804000106000000000000623099306124149-eve.json
    - 31056082203424804000106000000000000623099306124149-con-eve.json

    Já na consulta de eventos usando a chave e o código de evento (e101101), dá erro -> Expected "{" but found invalid symbol (1,2) 

     

    Sim Italo eu li seu post. Na verdade li, reli e reli de novo, rs. Justamente para não postar algo errado aqui, rs.

    Mas acho que você não viu meu post direito (ou então estou ficando doido, rs).

    Veja aí no primeiro parágrafo que eu falo da consulta do evento usando apenas a chave.  Essa consulta, naquele seu post, diz que está funcionando tudo ok, mas aqui não está.

    Essa última linha que coloquei dizendo que dá esse erro é uma outra consulta que só relatei pois nessa o componente gera o xml, mas dá o erro. Só incluí esse relato para demonstrar que estou fazendo pelo demo do acbr e que setei corretamente a pasta de salvamento.

    Mas vamos esquecer essa consulta que dá erro então. Vamos nos ater apenas a primeira parte desta minha resposta anterior, ou seja, da consulta de evento apenas com a chave (sem código de evento e sem a sequência). Nessa consulta, o sistema salva apenas esses 2 arquivos .json que mencionei. Nenhum XML é salvo, entende?  

  17. 4 minutos atrás, Italo Giurizzato Junior disse:

    Boa tarde Valdir,

    Isso na sua aplicação e no programa exemplo?

    No demo.

    O 31056082203424804000106000000000000623099306124149-eve.xml anexo é o que é gerado na pasta quando se consulta pela chave + código do evento. Também ocorre o erro do arquivo ErroChaveCodEvento.png anexo. Também gera o 31056082203424804000106000000000000623099306124149-con-eve.json (anexo).

    ErroChaveCodEvento.png

    31056082203424804000106000000000000623099306124149-con-eve.json 31056082203424804000106000000000000623099306124149-eve.xml

  18. 3 horas atrás, Italo Giurizzato Junior disse:

    Bom dia Valdir,

    O programa exemplo salva os arquivos temp1.xml e temp2.xml independente dessa propriedade de configuração.

    Eu já lhe disse que o retorno da API da NFS-e Padrão Nacional retorna um json.

    O programa exemplo não esta preparado para mostrar na aba de Retorno o conteúdo do json.

    Isso explica esse erro.

    Como você consultou um evento, favor procurar na pasta que você configurou para salvar os XML.

    Ele deve ter criado uma pasta chamada: Eventos e salvo o XML do evento que foi retornado dentro dessa pasta.

    Boa tarde,

    Não sei se estou fazendo algo errado, mas aqui não está salvando os XML dos eventos na pasta que indico para salvamento. Salva esses 2 arquivos abaixo, mas .json. Isso na consulta de evento usando apenas a chave.

    - 31056082203424804000106000000000000623099306124149-eve.json
    - 31056082203424804000106000000000000623099306124149-con-eve.json

    Já na consulta de eventos usando a chave e o código de evento (e101101), dá erro -> Expected "{" but found invalid symbol (1,2) 

     

  19. 6 horas atrás, Italo Giurizzato Junior disse:

    Valdir,

    Mas nesse arquivo não tem nada mesmo.

    O Padrão Nacional retorna um Json, com meia dúzia de objetos, sendo que um deles é o XML do evento que pela documentação é para estar compactado e decodificado em base 64.

    Se você quer ver esse XML, precisa configurar o componente para salvar os arquivos em disco.

    Configuracoes.Arquivos.Salvar := True.

    Sim, está habilitado. (Configuracoes.Arquivos.Salvar := True) É justamente por isso que o demo gera esse temp2.xml. Veja no print o que o demo mostra na aba "XML de REtorno". image.thumb.png.20e59ad67bedfbea673a59ea75ea4c62.png

  20. 34 minutos atrás, Italo Giurizzato Junior disse:

    Bom dia Valdir,

    O problema é o seguinte:

    O Consultar Evento existem 3 formas diferentes de realizar essa consulta.

    1. Consultar informando somente a chave da NFS-e, esta consulta esta funcionando sem nenhum problema, retorna e salva o XML do evento.

    2. Consultar informando a chave e o código do evento desejado, esta consulta não é realizada retornando um erro 404.

    3. Consultar informando a chave, o código e o numero sequencial do evento, esta consulta esta funcionando em partes, pois quando o componente tenta descompactar o XML após ter sido decodificado em base 64 ocorre o erro de Data Error.

    Descobrimos que o XML foi codificado em base 64 duas vezes, note que existe uma linha comentada que chama a função DecodeBase64 duas vez, se você comentar a linha acima e descomentar a outra, vai ver que vai funcionar.

    Mas lembre-se que se fizer essa alteração a primeira forma de consulta vai parar de funcionar.

    Já reportei o problema para o pessoal que cuida da API, agora é aguardar eles fazerem as devidas correções.

    Bom dia,

    Entendi. Mas, na verdade, nenhuma das 3 consultas está funcionando aqui.

    Se consulto com chave + código de evento + sequencial, dá esse erro ("data error") que reportei inicialmente.

    Se consulto somente com a chave + código do evento (sem o sequencial), ocorre o erro do print que estou anexando agora.

    Se consulto somente com a chave, aí não da erro de processamento, ou seja "Sucesso" vem true, mas o XML (temp2.xml)  traz apenas isto { "message": "The requested resource does not support http method 'GET'."}. no seu conteúdo. 

     

    consultaChaveECodigoEento.png

  21. 26 minutos atrás, Valdir Dill disse:

    Boa tarde,

    Estamos tendo o erro "data error", print em anexo. Também anexo o XML retornado.

    Ocorre ao executar o método ACBrNFSeX1.ConsultarEvento(. Debugando verifiquei que a consulta é processada normalmente e retorna um XML, mas no TACBrNFSeProviderPadraoNacional.TratarRetornoConsultarEvento(, linha 869 da PadraoNacional.Provider.pas, ou seja, ao executar ArquivoXml := DeCompress(DecodeBase64(ArquivoXml)), acontece o erro.

    Aí não sei se pode ser alguma falha no componente ou se o XML está retornando com dados corrompidos.

    Obrigado! 

    temp2.xml 8.8 kB · 0 downloads temp2.xml 8.8 kB · 0 downloads

    Desculpem, anexei duas vezes o XML e não anexei o erro, rs.

    Agora vai o print do erro.

    acbr.png

  22. Boa tarde,

    Estamos tendo o erro "data error", print em anexo. Também anexo o XML retornado.

    Ocorre ao executar o método ACBrNFSeX1.ConsultarEvento(. Debugando verifiquei que a consulta é processada normalmente e retorna um XML, mas no TACBrNFSeProviderPadraoNacional.TratarRetornoConsultarEvento(, linha 869 da PadraoNacional.Provider.pas, ou seja, ao executar ArquivoXml := DeCompress(DecodeBase64(ArquivoXml)), acontece o erro.

    Aí não sei se pode ser alguma falha no componente ou se o XML está retornando com dados corrompidos.

    Obrigado! 

    temp2.xml temp2.xml

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