tíquetes de passagens aéreas

Integrando uma aplicação PHP com Apple Wallet

Os aplicativos de carteira digital ou wallet podem armazenar cartões de membro, ingressos, passagens, cupons, etc. que possam ser vinculados a algum tipo de código de barras ou código 2D (como o QrCode). Entre suas vantagens destaco a economia de papel, a tranquilidade de não precisar lembrar de pegar o ingresso antes de sair e a praticidade de ter todos esses dados acessíveis sem carregar nada a mais na carteira física. Além do Apple Wallet existem apps de terceiros para Android.

No início desse mês recebi uma demanda de integração com Apple Wallet em um sistema de check-in que gera QrCode para uso presencial no estabelecimento, muito semelhante ao processo de check-in antecipado de passagens aéreas.

Nunca havia feito a integração com nenhum serviço da Apple encarei essa tarefa como um desafio. Nesse artigo foco mais no processo de resolução do problema do que nos aspectos técnicos.

Aviso: parte do processo descrito aqui requer uma assinatura ativa do Apple Developer Program que na data de publicação desse artigo tem custo anual de 99,00 dólares americanos.

Meu processo foi dividido em duas etapas “O quê fazer?” e “Como fazer?”

O quê fazer? Qual o produto que preciso gerar?

O primeiro passo foi me familiarizar com a integração, minha abordagem é sempre buscar a documentação oficial ao invés de um tutorial. Os primeiros resultados da pesquisa me mostraram as soluções em Swift e Objective-C, mas não era exatamente o que estava procurando, por a implementação será web (em PHP). Encontrei um guia oficial de integração que descreve a criação e atualização dos tíquetes (wallet pass). Como a solução prevê emissão do tíquete sem posterior atualização me mantive na base da necessidade de saber e analisei apenas a criação do arquivos.

Em resumo, um tíquete é um arquivo ZIP usando extensão .pkpass contendo um arquivo JSON com as descrição do tíquete, as imagens exibidas, um arquivo com hashs dos recursos e uma “assinatura” feita usando um certificado digital. Os QrCodes utilizados para “adicionar ao Apple Wallet” são apenas URLs que oferecem download do arquivo .pkpass.

O guia fornece toda a estrutura do arquivo JSON, descreve o processo de emissão do certificado digital através do painel de desenvolvedor, bom como o método para assinatura.

Como fazer? Qual a solução técnica?

Apesar da minha vontade de fazer tudo “na mão” e ter domínio sobre o que a aplicação faz, o prazo combinado não permitiria e decidi usar uma biblioteca externa. Encontrei duas candidatas flexible-agency/php-pkpass e eymengunay/php-passbook. Mesmo assim busco saber o que estou colocando no projeto do cliente e costumo ler o código que será incluído para entender minimamente o que está acontecendo.

Selecionei o php-passbook, os principais motivos foram a abstração da estrutura JSON – permitindo a integração sem precisar consultar a referência, o uso de uma interface fluente, o exemplo de implementação contém tudo o que é necessário, a existência de testes e a descrição de todos os comandos para auxiliar a criação dos certificados.

Com isso em mãos foi simplesmente instalar a biblioteca usando o composer e usar o código de exemplo como base incluindo os dados da aplicação que serão exibidos no tíquete. O php-passbook salva localmente o arquivo gerado, a sua implementação que precisa fornecer o download do arquivo, eu usei alguns cabeçalhos HTTP e a função SplFileObject::fpassthru.

Para o QrCode a integração precisa levar em conta que será outro dispositivo que vai acessar a aplicação. Para garantir que a experiência do usuário seja transparente a URL de download não pode depender de autenticação e/ou sessão. É preciso também garantir a segurança e eu sugiro usar alguma forma de token CSRF (cross-site request forgery) ou URLs assinada.

A última etapa foi a integração no front-end, usei a verificação pelo evento ontouchstart para definir se o usuário está acessando no celular, assim é possível decidir se vou exibir um QrCode com a URL para download ou oferecer o arquivo diretamente. Uma última dica para garantir que só a sua aplicação e seu usuário tenha acesso ao tíquete e gerar o QrCode localmente ao invés de usar um serviço externo.

Comente aqui embaixo, esse conhecimento for útil? Te ajudou em alguma aplicação prática? Quais outros conteúdos você gostaria de ler?

Até mais.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s