Post Técnico
Transações por Aproximação de Forma Simples
Todo mundo sabe como os cartões com chip podem ser um verdadeiro tormento. Inserir o cartão, bater o pé de impaciência, torcer para o chip falhar e poder passar na tarja magnética… Tudo bem, talvez seja um exagero. Mas você entende o que quero dizer. O "EMV por contato" padrão frustra os clientes (e já levou muitos desenvolvedores de aplicativos de pagamento à beira de um colapso) por ser lento, complexo e nada tolerante a erros.
Tudo isso muda com o EMV por aproximação. Uma transação "tap and go" normalmente leva menos de 500 milissegundos e pode ser realizada 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 por aproximação em 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 nem dependências complicadas. Isso sim é desenvolvimento ágil!
Veja as 4 linhas de JavaScript a seguir:
Acredite se quiser: essas 4 linhas permitem executar uma transação EMV por aproximação usando qualquer um dos leitores de cartão compactos e econômicos 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 de aproximação) do leitor — ele emitirá um sinal sonoro, iniciará uma comunicação NFC e, em seguida, transmitirá os dados da transação (via USB).
Claro que, para essas linhas de código funcionarem de verdade, você primeiro precisa instalar o script Node que se comunica 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 Chrome, usando o aplicativo disponível aqui.
O que é o ViVOpay Explorer? É simplesmente uma página HTML bem simples com 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 parser TLV sobre a qual falei em uma postagem anterior). Ao usar o ViVOpay Explorer no Chrome ou Firefox (não tente no Internet Explorer), você verá uma página do navegador com aparência semelhante a esta:
A área cinza, abaixo de "Console," é um REPL ativo (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.
Clicar no pequeno ponto de interrogação ao lado do menu suspenso abre um pequeno painel de Ajuda que explica 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 sua máquina Windows local. (O pacote inclui uma cópia do node.exe, além de scripts e arquivos de suporte; tudo o que você precisa está no arquivo. No entanto, 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, 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 USB e também inicializa 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 uma aparência semelhante a:
OUT:
{
"source":"client"
"data":"5669564f74656368320018010000b3cd"
"type":"raw command"
}
ENTRADA:
{
"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, denominados 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 no 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 na Base de Conhecimento Pública 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 funcione!) deve ser considerado de caráter demonstrativo, e não adequado para uso em produção. Em um ambiente de produção, seria necessário incluir um Valor real, a Data da Transação atual, entre outros dados pertinentes.
O envio do comando ao leitor é um processo de duas etapas: primeiro, é necessário enviá-lo ao driver em um objeto JSON via Websockets; em seguida, o driver o transmite ao leitor USB. Empacotar o comando em um objeto JSON que o driver possa processar é muito simples: veja a 2ª e a 3ª linhas do código acima. A quarta linha emite o objeto de dados no socket.
Lembre-se: antes de realizar qualquer uma dessas etapas, você deve associar um listener (ou callback) ao socket para processar a resposta do leitor. Isso pode ser feito de forma simples, como:
Como Iniciar uma Transação por Aproximação: Estratégia 2
Há uma segunda estratégia para iniciar a transação. Conforme mencionado anteriormente, o processo de inicialização ocorre em duas etapas:
1. Enviar uma mensagem do navegador para o driver.
2. Receber 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 facilmente para que ele contenha (já armazenado em uma String) o comando de firmware especial que inicia a transação (ou uma função que gera essa string). Isso permite ocultar o comando de firmware especial por trás de uma API de sua escolha, de modo que o aplicativo de pagamento (representado aqui pelo ViVOpay Explorer) precise enviar apenas uma mensagem simples (definida por você) ao driver para iniciar a transação.
Qual é o propósito disso? Por que ocultar o comando de firmware no próprio driver?
Consigo pensar em algumas boas razões para isso.
Em primeiro lugar, faz 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 liberá-lo dessa dependência 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ê crie sua própria API para esse comando, dando-lhe a oportunidade de introduzir uma API muito mais simplificada que o aplicativo de pagamento possa utilizar. (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 aplicativo de pagamento forneça pouco mais do que o valor da transação ao subsistema de transações; e o subsistema de transações (que se comunica com o leitor de cartão) retorna um código de autorização e as informações para impressão do recibo. Os dados sensíveis do cartão nunca chegam ao aplicativo de pagamento.
Portanto, no cenário 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. (Consulte minha postagem anterior para ver a 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 de 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 a página para ver os links). Não deixe também de acessar a página de Downloads gratuita da ID TECH para documentação adicional de produtos, white papers, documentação de SDK, entre outros recursos.
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:
