Ir para conteúdo
  • Cadastre-se

dev botao

AcbrPos na CIELO LIO


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

Recommended Posts

Bom dia a todos!
Desenvolvo uma aplicação para emissão de BP-e e migrei a parte mobile para o Acbr.
Tenho a aplicação rodando em vários dispositivos diferentes desde celulares com a
mini impressora BT a vário modelos de terminais POS.
Tanto o AcbrBPe quanto o AcbrPOSPrinter funcionam perfeitamente em qualquer dessas
situações.
O único problema que em tenho é com os terminais Cielo LIO.
Essas máquinas têm um SO modificado que não permite acessar a impressora.
Nesse sistema da Cielo LIO você envia comandos para a impressora no formato de urls
com o seguinte formato:
lio://print?request=$base64&urlCallback=order://response

O que eu tenho feito é criar um instrução nesse formato:
          scheme := '{"operation":"PRINT_IMAGE","styles":[{"key_attributes_align":0,"key_attributes_textsize":40}],"value":["/storage/emulated/0/saved_images/QRCODE.BMP"]}';


E depois enviar a impressora com essa rotina:
    Base64 := MinhaEncodeBase64(BytesOf(scheme));
    Uri := 'lio://print?request='+Base64+'&urlCallback=order://response';
    Imprime1 := TJIntent.Create;
    Imprime1.setAction(TJIntent.JavaClass.ACTION_VIEW);
    Imprime1.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP) ;
    Imprime1.setData(StrToJURI(uri));
    SharedActivity.startActivity(Imprime1)

Será que é viável criar uma classe para compatibilizar o AcbrPosPrinter com esse método de impressão através Intent?
Se sim, vocês tem alguma dica para começar?

Desde já agradeço.
Márcio Dias Ramos
 

Editado por Marcio Dias Ramos
Link para o comentário
Compartilhar em outros sites

  • Fundadores

notei que várias dessas máquinas Android que tem rotinas de segurança, não permitem acesso direto a impressora...

mas ainda não avaliei qual a melhor forma de interagir com elas...

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

Ok Daniel, obrigado pela resposta.
Na verdade essa da Cielo até agora foi a única que o AcbrPosPrinter não rodou.
Eu uso até uma que um cliente adquiriu na china e eu imaginei que não funcionaria mas rodou.
Essa da Cielo parece que passou por uma personalização no OS.
Mas valeu a atenção.
Eu estou pensando em umas alternativas aqui pra esse situação.
Obrigado.

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Na Pior das hipóteses, poderíamos criar eventos no componente, como: "OnSendData" e "OnReadData".. Ou seja, facilitar o uso dos "hooks", por outras aplicações... 

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • 11 meses depois ...

Olá Senhores,

Pesquisando no forum achei este post já com mais de 1 ano sem interações. O que o Marcio dias esta usando é a integração Híbrida que nao tem acesso direto a impressora, mas eu tambem nao consegui fazer com que o componente conseguisse reconhecer a impressora da LIO usando a integração local. Já consegui fazer todos os processos e pagamentos por ela usando o método de integração local consumindo o SDK usando classes JavaClass adicionando na libraries do projeto, mas impressão de uma NFCe ainda estou apanhando... Se conseguir posso contribuir postando os resultados aqui... Alguém aqui ja conseguiu impressão da NFCe nessa Cielo LIO?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Fundadores

Veja como fiz recentemente, classes Externas para o ACBrPosPrinter, para supotar as Bibliotecas da Elgin e Gertec, para Android...

http://svn.code.sf.net/p/acbr/code/trunk2/Fontes/ACBrSerial/ACBrPosPrinterGEDI.pas

http://svn.code.sf.net/p/acbr/code/trunk2/Fontes/ACBrSerial/ACBrPosPrinterElginE1Lib.pas

Talvez a implementação que mais se assemelhe, seja essa, que traduz as Tags do ACBrPosPrinter, para chamadas a Intent Service E1, da Elgin

http://svn.code.sf.net/p/acbr/code/trunk2/Fontes/ACBrSerial/ACBrPosPrinterElginE1Service.pas

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

Obrigado Daniel por dar retorno. Realmente as chamadas são bem diferentes em relação a Elgin porque vc usou intents e no caso to usando o SDK com integração local, segue em anexo a classe e as libs anexadas em Libraries se vc quiser dar uma olhada. Eu não consegui usar a classe JPrintermanager porque pede um parâmetro do tipo JMap e nao achei documentação para conversão do HashMap formato JAVA para Delphi no procedimento printImage(JBitmap, JMap, JPrinterListener). Note que a LIO nao aceita impressão PDF direta então tive que converter de PDF para JBitmap.

No JAVA o HashMap seria mais ou menos assim:

HashMap<String, Integer> alignCenter = new HashMap<>();
alignCenter.put(PrinterAttributes.KEY_ALIGN, PrinterAttributes.VAL_ALIGN_CENTER);
alignCenter.put(PrinterAttributes.KEY_TYPEFACE, 1);
alignCenter.put(PrinterAttributes.KEY_TEXT_SIZE, 20);

CieloSDK.jar Android.CieloLIO.pas

Editado por LIDERNetwork
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Como forma de contribuição segue a conversão:

  alignCenter := TJHashMap.Create;
  alignCenter.put(StringToJString('KEY_ALIGN'), StringToJString('VAL_ALIGN_CENTER'));
  alignCenter.put(StringToJString('KEY_TYPEFACE'), StringToJString('1'));
  alignCenter.put(StringToJString('KEY_TEXT_SIZE'), StringToJString('20'));

 ImpLIO.printImage(DadosVenda.JBitmapNFCe, TJMap.Wrap(JObjectToID(alignCenter)), ListernerPrinter );

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...
Em 22/06/2021 at 16:16, LIDERNetwork disse:

Como forma de contribuição segue a conversão:

  alignCenter := TJHashMap.Create;
  alignCenter.put(StringToJString('KEY_ALIGN'), StringToJString('VAL_ALIGN_CENTER'));
  alignCenter.put(StringToJString('KEY_TYPEFACE'), StringToJString('1'));
  alignCenter.put(StringToJString('KEY_TEXT_SIZE'), StringToJString('20'));

 ImpLIO.printImage(DadosVenda.JBitmapNFCe, TJMap.Wrap(JObjectToID(alignCenter)), ListernerPrinter );

bom dia amigo, peguei teu 

 

Em 22/06/2021 at 14:40, LIDERNetwork disse:

Obrigado Daniel por dar retorno. Realmente as chamadas são bem diferentes em relação a Elgin porque vc usou intents e no caso to usando o SDK com integração local, segue em anexo a classe e as libs anexadas em Libraries se vc quiser dar uma olhada. Eu não consegui usar a classe JPrintermanager porque pede um parâmetro do tipo JMap e nao achei documentação para conversão do HashMap formato JAVA para Delphi no procedimento printImage(JBitmap, JMap, JPrinterListener). Note que a LIO nao aceita impressão PDF direta então tive que converter de PDF para JBitmap.

No JAVA o HashMap seria mais ou menos assim:

HashMap<String, Integer> alignCenter = new HashMap<>();
alignCenter.put(PrinterAttributes.KEY_ALIGN, PrinterAttributes.VAL_ALIGN_CENTER);
alignCenter.put(PrinterAttributes.KEY_TYPEFACE, 1);
alignCenter.put(PrinterAttributes.KEY_TEXT_SIZE, 20);

CieloSDK.jar 133 kB · 2 downloads Android.CieloLIO.pas 131 kB · 2 downloads

ola amigo, peguei esse sdk pra estudar, mas estou um pouco perdido como fazer as chamadas, vc poderia por um codigo de exemplo, de criar uma order, fazer o bind.

 

desde ja agradecido!

 

 

Gabriel Rodrigues Da Costa Neto

Link para o comentário
Compartilhar em outros sites

Também estou penando a um tempo para desenvolver a integração com a lio, já fiz um app no delphi consigo listar meus abastecimentos mas na hora do pagamento estou levando uma surra para chamar a lio, só trabalho com delphi a 3 anos e não tenho tanta experiencia com mobile, apenas vlc.

Link para o comentário
Compartilhar em outros sites

41 minutos atrás, LIDERNetwork disse:

Vou ajudar vcs...

@gabriellc me passe ate onde vc conseguiu fazer no seu projeto. Vc ja anexou o SDK e ja importou o Android.Cielo.LIO.pas que anexo ao topico? Veja acima os anexos que coloquei...

 

ja sim, minhas duvidas sao so em como chamar os metodos, nao sou muito familiarizado com essa juncao do java com o delphi

se puder postar exemplos basicos, eu desenrolo o restante, tipo

 

uma chamada de uma order

o exemplo do bind

 

Gabriel Rodrigues Da Costa Neto

Link para o comentário
Compartilhar em outros sites

Eu apanhei bastante pra aprender a salada de códigos que vem de uma biblioteca JAVA para Delphi, eu acho até que é bem difícil vc encontrar um ser vivente que decifre tudo, nada além do esperado enquanto se trata de JAVA 🙄!! 

Vou passar mais conteúdo, afim de ajudar outros colegas...

Declare os Objetos das interfaces TJavaLocal, deverá ter um listener para o bind e outro para o pagamento que será usado para chamar o OrderManager:

 

TServBindListener = class(TJavaLocal, JServiceBindListener)
  public
    procedure onServiceBound; cdecl;
    procedure onServiceBoundError(P1: JThrowable); cdecl;
    procedure onServiceUnbound; cdecl;
  end;

  TPagListener = class(TJavaLocal, JPaymentListener)
  public
    procedure onCancel; cdecl;
    procedure onError(P1: JPaymentError); cdecl;
    procedure onPayment(P1: JOrder); cdecl;
    procedure onStart; cdecl;
  end;

 

Declare variáveis private ou public das classes Listener e uma variável da classe Java do tipo JOrderManager

 

var
  OrderManager            : JOrderManager;
  ServiceBindListener     : TServBindListener;
  PaymentListener         : TPagListener;

Vc precisa inicializar os objetos no form onde vc fará as chamadas

 

 

initialization
{Credenciais CIELO}
const ClientID : string = 'SUA CLIENTEID';
const AccessToken : string= 'SEU TOKEN_ACCESS';

ServiceBindListener := TServBindListener.Create;

PaymentListener := TPagListener.Create;

OrderManager := TJOrderManager.JavaClass.init(TJdomain_Credentials.JavaClass.init(StringToJString(ClientID), StringToJString(AccessToken)),
  SharedActivityContext);

OrderManager.bind(SharedActivity, ServiceBindListener);

 

Até aqui a LIO já estará "escutando" todo pedido de pagamento...

Para chamar o método e solicitar um ordem de pagamento

 

 function TfrmFORMULARIO.RealizaPagamento : boolean;
{$IFDEF ANDROID}
var
  LOrder: JOrder;
{$ENDIF}
begin
 {$IFDEF ANDROID}
 try

 begin
  LOrder := OrderManager.createDraftOrder(StringToJString(DadosVenda.codven.tostring));

  LOrder.addItem(StringToJString(CODIGO_PRODUTO), StringToJString(DESCRICAO_PRODUTO),
  CurrencyToNumeric(100.00,-2), CurrencyToNumeric(10,-3), StringToJString('UND'));

  OrderManager.placeOrder(LOrder);

  OrderManager.checkoutOrder(LOrder.getId, CurrencyToNumeric(DadosVenda.ValorVenda,-2), PaymentListener);

  Result := DadosVenda.StatusPagamento;
 end;
       except
       on e : Exception do
       begin
       ShowMessage(e.message);
       end;
       end;
end;


Nesse momento ao chamar OrderManager.checkoutOrder vai abrir o app da Cielo para passar o cartao, o retorno do método quando a LIO finalizar o pagamento vc captura em TPagtListener.onPayment onde os retornos possíveis vc pega com JStringToString(P1.getStatus.toString) dentro do método, veja a documentação para saber quais retornos possíveis...

procedure TPagListener.onPayment(P1: JOrder);
begin
  frmFORMULARIOn.Text1.Text := 'VENDA ID = ' + JStringToString(P1.getId) +
   #10#13 + ' VALOR = ' + P1.paidAmount.toString + #10#13 + 'VALOR RESTANTE = ' + P1.getPendingAmount.toString +
    #10#13 + 'STATUS = ' + JStringToString(P1.getStatus.toString);

end;

Dai pra frente veja se consegue desenrolar!

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

11 horas atrás, LIDERNetwork disse:

Eu apanhei bastante pra aprender a salada de códigos que vem de uma biblioteca JAVA para Delphi, eu acho até que é bem difícil vc encontrar um ser vivente que decifre tudo, nada além do esperado enquanto se trata de JAVA 🙄!! 

Vou passar mais conteúdo, afim de ajudar outros colegas...

Declare os Objetos das interfaces TJavaLocal, deverá ter um listener para o bind e outro para o pagamento que será usado para chamar o OrderManager:

 

TServBindListener = class(TJavaLocal, JServiceBindListener)
  public
    procedure onServiceBound; cdecl;
    procedure onServiceBoundError(P1: JThrowable); cdecl;
    procedure onServiceUnbound; cdecl;
  end;

  TPagListener = class(TJavaLocal, JPaymentListener)
  public
    procedure onCancel; cdecl;
    procedure onError(P1: JPaymentError); cdecl;
    procedure onPayment(P1: JOrder); cdecl;
    procedure onStart; cdecl;
  end;

 

Declare variáveis private ou public das classes Listener e uma variável da classe Java do tipo JOrderManager

 

var
  OrderManager            : JOrderManager;
  ServiceBindListener     : TServBindListener;
  PaymentListener         : TPagListener;

Vc precisa inicializar os objetos no form onde vc fará as chamadas

 

 

initialization
{Credenciais CIELO}
const ClientID : string = 'SUA CLIENTEID';
const AccessToken : string= 'SEU TOKEN_ACCESS';

ServiceBindListener := TServBindListener.Create;

PaymentListener := TPagListener.Create;

OrderManager := TJOrderManager.JavaClass.init(TJdomain_Credentials.JavaClass.init(StringToJString(ClientID), StringToJString(AccessToken)),
  SharedActivityContext);

OrderManager.bind(SharedActivity, ServiceBindListener);

 

Até aqui a LIO já estará "escutando" todo pedido de pagamento...

Para chamar o método e solicitar um ordem de pagamento

 

 function TfrmFORMULARIO.RealizaPagamento : boolean;
{$IFDEF ANDROID}
var
  LOrder: JOrder;
{$ENDIF}
begin
 {$IFDEF ANDROID}
 try

 begin
  LOrder := OrderManager.createDraftOrder(StringToJString(DadosVenda.codven.tostring));

  LOrder.addItem(StringToJString(CODIGO_PRODUTO), StringToJString(DESCRICAO_PRODUTO),
  CurrencyToNumeric(100.00,-2), CurrencyToNumeric(10,-3), StringToJString('UND'));

  OrderManager.placeOrder(LOrder);

  OrderManager.checkoutOrder(LOrder.getId, CurrencyToNumeric(DadosVenda.ValorVenda,-2), PaymentListener);

  Result := DadosVenda.StatusPagamento;
 end;
       except
       on e : Exception do
       begin
       ShowMessage(e.message);
       end;
       end;
end;


Nesse momento ao chamar OrderManager.checkoutOrder vai abrir o app da Cielo para passar o cartao, o retorno do método quando a LIO finalizar o pagamento vc captura em TPagtListener.onPayment onde os retornos possíveis vc pega com JStringToString(P1.getStatus.toString) dentro do método, veja a documentação para saber quais retornos possíveis...

procedure TPagListener.onPayment(P1: JOrder);
begin
  frmFORMULARIOn.Text1.Text := 'VENDA ID = ' + JStringToString(P1.getId) +
   #10#13 + ' VALOR = ' + P1.paidAmount.toString + #10#13 + 'VALOR RESTANTE = ' + P1.getPendingAmount.toString +
    #10#13 + 'STATUS = ' + JStringToString(P1.getStatus.toString);

end;

Dai pra frente veja se consegue desenrolar!

 

show cara, vlw!

Gabriel Rodrigues Da Costa Neto

Link para o comentário
Compartilhar em outros sites

  • 9 meses depois ...
Em 19/08/2021 at 20:45, LIDERNetwork disse:
OrderManager := TJOrderManager.JavaClass.init(TJdomain_Credentials.JavaClass.init(StringToJString(ClientID), StringToJString(AccessToken)),
  SharedActivityContext);

Olá, tudo bem, venho desenvolvendo para a LIO, mas no momento da criação do OrderManager da esse erro "java.lang.noclassdeffounderror: failed resolution of: lkotlin/jvm/internal/intrinsics;" alguém já passou por isso?

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois ...
  • 2 meses depois ...

Olá @Carlos Modesto, sim isso mesmo, vc nos ajudou com seu código lá no GitHub e agradeço muito pela contribuição. Tive que fazer nova leitura e conversão do SDK da Cielo para a versão atual e implementei novas funcionalidades como impressão de comprovante, pagamento por PIX dentre outras, mas parti do principio usando seu código e isso foi a virada de chave que precisava na época, obrigado!

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...
Em 29/08/2022 at 09:34, LIDERNetwork disse:

Olá @Carlos Modesto, sim isso mesmo, vc nos ajudou com seu código lá no GitHub e agradeço muito pela contribuição. Tive que fazer nova leitura e conversão do SDK da Cielo para a versão atual e implementei novas funcionalidades como impressão de comprovante, pagamento por PIX dentre outras, mas parti do principio usando seu código e isso foi a virada de chave que precisava na época, obrigado!

@LIDERNetwork você poderia falar como conseguiu ler e converter o arquivo? o que voce tinha passado em algumas mensagens anteriores está com alguns códigos em kotlin que o delphi não interpreta ele, assim fazendo o meu app ficar com a tela preta e travado. e eu estou com alguns clientes dependendo apenas de integração com a lio para migrar para meu sistema, e para ser mais simples o desenvolvimento estou tentando reutilizar o mesmo app que roda no gpos700 que ja implementei.

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...
Em 29/08/2022 at 09:34, LIDERNetwork disse:

Olá @Carlos Modesto, sim isso mesmo, vc nos ajudou com seu código lá no GitHub e agradeço muito pela contribuição. Tive que fazer nova leitura e conversão do SDK da Cielo para a versão atual e implementei novas funcionalidades como impressão de comprovante, pagamento por PIX dentre outras, mas parti do principio usando seu código e isso foi a virada de chave que precisava na época, obrigado!

@LIDERNetwork você teria algum exemplo de como fez a parte de impressão? o material qe tinha passado antes foi de grande ajuda e meu app agora esta comunicando só falta a impressão para testar em uma maquina fisica.

Link para o comentário
Compartilhar em outros sites

2 minutos atrás, djinfope disse:

@LIDERNetwork você teria algum exemplo de como fez a parte de impressão? o material qe tinha passado antes foi de grande ajuda e meu app agora esta comunicando só falta a impressão para testar em uma maquina fisica.

Ola @djinfope te passo sim, so quando chegar no pc mais tarde OK! Vou te passar como fiz, pode nao ser o ideal mas aqui esta funfando de boa...

Link para o comentário
Compartilhar em outros sites

1 minuto atrás, LIDERNetwork disse:

Ola @djinfope te passo sim, so quando chegar no pc mais tarde OK! Vou te passar como fiz, pode nao ser o ideal mas aqui esta funfando de boa...

Blz, muito obrigado por suas contribuições aqui, me ajudaram muito. não sei se você consegue pegar o nome da bandeira no seu projeto, aqui quando tento o app trava, para pegar a bandeira e nsu que estão em uma subclasse.

Editado por djinfope
Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...
Em 17/11/2022 at 14:50, LIDERNetwork disse:

Ola @djinfope te passo sim, so quando chegar no pc mais tarde OK! Vou te passar como fiz, pode nao ser o ideal mas aqui esta funfando de boa...

Bom dia, você poderia enviar uma base da impressão? para eu finalizar o app aqui só falta essa parte, desde já obrigado por suas contribuições.

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...
  • Este tópico foi criado há 196 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.