ID TECH
Contato
Todos os posts técnicos

Post Técnico

Transações por Aproximação de Forma Simples

Todo mundo sabe o quanto os cartões com chip podem ser um "problema nos bastidores". Inserir o cartão, bater o pé de impaciência, torcer para o chip falhar e poder passar o cartão na leitora… Tudo bem, talvez estejamos exagerando um pouco. Mas você entende o que quero dizer. O EMV de contato padrão frustra os clientes (e já levou mais de um desenvolvedor de aplicativos de pagamento ao limite da sanidade) por ser lento, complexo e pouco tolerante a erros.

Tudo isso muda com o EMV sem contato. Uma transação por aproximação ("tap and go") normalmente leva menos de 500 milissegundos e pode ser feita com o celular — muito mais prático do que tirar um cartão plástico da carteira. E sabe o que mais? Também é mais fácil para os desenvolvedores. Você consegue executar uma transação sem contato com apenas algumas linhas de código — e pode fazer tudo em JavaScript, se preferir, sem precisar abrir o Visual Studio ou o Xcode. Sem ciclo de compilação, sem bibliotecas vinculadas ou dependências complicadas. É o desenvolvimento ágil em sua melhor forma!

Veja as 4 linhas de JavaScript a seguir:

Acredite se quiser, mas essas 4 linhas permitem realizar uma transação EMV sem contato utilizando qualquer um dos leitores de cartão compactos e acessíveis da série VP3300, disponíveis pela ID TECH (como o VP3300 mostrado acima). Após a execução dessas 4 linhas, basta aproximar o celular (ou um cartão por aproximação) do leitor: ele emitirá um bipe, iniciará uma comunicação NFC e enviará os dados da transação (via USB).

É claro que, para que essas linhas de código funcionem de fato, é preciso primeiro instalar o script Node responsável pela comunicação com o dispositivo USB (e o próprio Node JS) conforme descrito no meu post anterior. (Baixe o script executável junto com o próprio Node em um único arquivo aqui.) E provavelmente você vai querer executar as linhas de código acima no Firefox ou no Chrome, utilizando o aplicativo disponível aqui.

O que é o ViVOpay Explorer? É simplesmente uma página HTML bem simples que contém um console JS e alguns comandos pré-carregados. A página é composta por 50 linhas de HTML e 400 linhas de JavaScript (incluindo a rotina de análise TLV que mencionei em uma publicação anterior). Ao usar o ViVOpay Explorer no Chrome ou no Firefox (não tente no Internet Explorer), você verá uma página no navegador com a seguinte aparência:

A área cinza, abaixo de "Console," é um REPL ao vivo (neste caso, um jQuery Terminal) no qual você pode executar código JavaScript arbitrário em tempo real. No canto superior direito, você encontrará campos de texto (exibindo "http://localhost" e "9901") ao lado de um botão Connect . Ao pressionar o botão, o ViVOpay Explorer busca uma conexão Websocket em 127.0.0.1, porta 9901. A metade inferior da página é uma área de log onde diversos tipos de informações de status (por exemplo, leituras de tráfego USB) aparecem em tempo real, em resposta aos comandos.

Ao clicar no pequeno ponto de interrogação ao lado do menu suspenso, um pequeno painel de Ajuda é exibido, explicando como utilizar o ViVOpay Explorer. Em resumo, veja o que você precisa fazer:

1. Baixe o Node driver (arquivo Zip de 11 MB) e descompacte-o em seu computador Windows local. (Ele inclui uma cópia do node.exe, além de scripts e arquivos de suporte; tudo o que você precisa está no arquivo. Porém, não tente executá-lo no Mac ou Linux. Trata-se de uma versão do Node específica para Windows.)

2. Na pasta descompactada do Zip, localize start.bat e execute-o. (Mantenha-o em execução. Não feche a janela.) Isso inicia o driver baseado em Node que se comunica com a USB e também inicia um servidor Websockets.

3. Conecte um leitor de cartão de crédito da série VP3300 (UniPay III, BTPay Mini, etc.) da ID TECH à sua porta USB. O driver Node detectará automaticamente o dispositivo e se conectará a ele.

4. Clique no botão Conectar (acima, à direita). Você deverá ver a seguinte mensagem abaixo: "Conectado ao driver na porta 9901." Isso significa que seu navegador está se comunicando com o driver via Websockets em http://localhost:9901.

5. Selecione o comando Ping reader no menu suspenso. Isso executará um script que envia um ping ao dispositivo USB conectado.

Se a Etapa 5 for concluída com êxito, você verá uma resposta registrada (na tela principal, abaixo do Console) com a seguinte aparência:

OUT:
{
"source":"client"
"data":"5669564f74656368320018010000b3cd"
"type":"raw command"
}

IN:
{
"source":"usb"
"data":"5669564f74656368320018000000fa83″
"type":"data"
}

Estas são as mensagens JSON enviadas (para o dispositivo USB) e recebidas (pelo navegador), via WebSockets, durante o ping. Observe que os objetos JSON personalizados seguem um esquema bastante simples: há três campos, chamados source, data e type. Para mensagens de saída (do navegador para o driver), a propriedade source deve ter o valor "client"; o campo data conterá uma string hexadecimal representando o comando enviado ao dispositivo USB; e o campo type conterá "raw command", para indicar ao driver que o comando de dados deve ser repassado diretamente ao dispositivo USB.

Enviar um objeto JSON (ou qualquer outra mensagem) do navegador para o driver é simples. No código do seu navegador, basta executar socket.emit( 'echo', myObject ). Para receber dados do driver, basta definir um listener: socket.on( 'message', myListener ), onde myListener pode ser uma função anônima, como function( m ) { log( m ); }. É importante definir o listener antes de enviar qualquer dado ao driver. Caso contrário, o driver poderá responder antes que você esteja pronto para capturar a resposta.

Como Iniciar uma Transação por Aproximação: Estratégia 1

Para colocar o leitor em modo NFC e fazê-lo ler um cartão ou carteira por aproximação, basta emitir o comando de firmware adequado (como uma string hexadecimal):

A primeira linha declara o comando como uma string. Para saber como construir esses comandos, consulte a documentação técnica do seu leitor. (Você pode baixar a documentação da ID TECH na Página de Downloads da Base de Conhecimento Público da ID TECH.) Este comando específico contém um Valor padrão de US$ 1,00 e uma data que já está desatualizada. Portanto, este código — embora funcional — deve ser considerado apenas como prova de conceito, e não como código de produção. Em um ambiente de produção, seria necessário incluir um Valor real, a Data da Transação correta, entre outros dados.

Enviar o comando ao leitor é um processo de duas etapas: primeiro, você precisa enviá-lo ao driver em um objeto JSON via Websockets; em seguida, o driver o encaminha ao leitor USB. Empacotar o comando em um objeto JSON que o driver consiga processar é muito simples: veja as linhas 2 e 3 do código acima. A quarta linha envia o objeto de dados pelo socket.

Lembre-se: antes de executar qualquer uma dessas etapas, você deve associar um listener (ou callback) ao socket para processar a resposta do leitor. Isso pode ser tão simples quanto:

Como Iniciar uma Transação por Aproximação: Estratégia 2

Existe uma segunda estratégia para iniciar a transação. Conforme mencionado anteriormente, o processo de início é composto por duas etapas:

1. Enviar uma mensagem do navegador para o driver.

2. Obter a mensagem do driver para o dispositivo USB.

A "mensagem" é uma longa e complexa string hexadecimal de firmware.

O "driver", neste caso, é simplesmente um script Node (com cerca de 350 linhas de JavaScript) executado no espaço de processo do Node. O código-fonte do driver está na pasta driver. Procure por usb-websocket-shim.js.

Você pode modificar o código do driver com muita facilidade para que ele já contenha (armazenado em uma String) o comando de firmware especial que inicia a transação (ou uma função que gera essa string). Fazer isso permite ocultar o comando de firmware especial por trás de uma API de sua escolha, de modo que seu aplicativo de pagamento (representado aqui pelo ViVOpay Explorer) precise enviar apenas uma mensagem muito simples (definida por você) ao driver para iniciar a transação.

Qual é o objetivo disso? Qual é o sentido de ocultar o comando de firmware no próprio driver?

Consigo pensar em algumas razões bastante válidas para isso.

Em primeiro lugar, faz todo sentido remover as dependências de dispositivo do aplicativo de pagamento e transferi-las para o driver do dispositivo, que está logicamente muito mais próximo do hardware. Pense bem: você realmente quer que seu aplicativo de pagamento tenha conhecimento detalhado dos comandos de firmware? Não seria melhor liberar o aplicativo dessa dependência direta com o hardware? O aplicativo não deveria se concentrar apenas na lógica de negócios?

Em segundo lugar: transferir o comando especial para dentro do driver permite que você defina sua própria API para esse comando, abrindo a oportunidade de criar uma interface muito mais simplificada que o aplicativo de pagamento possa consumir. (Veja um exemplo abaixo.)

Além disso, há a questão da redução de escopo a considerar. Na prática, a maioria dos aplicativos de pagamento e sistemas de ponto de venda é desenvolvida de forma que o PDV ou o aplicativo de pagamento fornece pouco mais do que o valor da transação ao subsistema de transações; e esse subsistema (que se comunica com o leitor de cartão) retorna um código de autorização e as informações do comprovante para impressão. Dados sensíveis do cartão nunca chegam ao aplicativo de pagamento.

Portanto, no caso de "redução de escopo", o ideal seria ter um código dentro do driver que respondesse a mensagens Websockets recebidas como esta:

E isso, de fato, já está implementado em nosso driver Node. (Veja minha postagem anterior para uma listagem do código do driver.) O que significa que tudo o que precisamos fazer para iniciar uma transação sem contato a partir do aplicativo de pagamento (ou do ViVOpay Explorer) é:

No ViVOpay Explorer, encapsulei todo o código necessário (incluindo o código para um callback que analisa os dados TLV da transação e os exibe na tela) em uma função chamada startContactlessTransaction().

Lembre-se de que, para obter mais informações sobre como o driver baseado em Node habilita a conectividade USB, você pode consultar minhas postagens anteriores (role para baixo para ver os links). Certifique-se também de consultar a página gratuita de downloads da ID TECH Página de Downloads para documentação adicional de produtos, white papers, documentação de SDK, entre outros.

Para obter um kit de avaliação contendo um dos leitores de cartão da ID TECH, entre em contato conosco a qualquer momento pelo número indicado abaixo:

Número Gratuito
1-800-984-1010