Adicionar cartão de embarque à Carteira do Google

Você pode usar o Google Mensagens com o RCS e a Carteira do Google para criar um fluxo de check-in contínuo: o usuário conclui o check-in, recebe o cartão de embarque e o adiciona diretamente à Carteira do Google pelo app Mensagens. Quando estão na carteira, o cartão é atualizado automaticamente se os detalhes do voo mudarem. Os usuários têm acesso rápido a um cartão de embarque atualizado diretamente no smartphone.

Este documento descreve as etapas técnicas para implementar um cartão de embarque no fluxo da Carteira do Google. Ele também apresenta uma conversa de exemplo com dicas de design para uma experiência de check-in tranquila e eficiente com o RBM.

Implementação técnica

Para implementar um fluxo de cartão de embarque para a Carteira do Google, você vai trabalhar com a API Google Wallet e a API RBM.

Pré-requisitos

Para começar a usar a API Google Wallet, siga estas etapas necessárias:

  1. Crie uma conta de emissor da Carteira para criar e distribuir cartões para a Carteira do Google.
  2. Crie um projeto do Google Cloud (GCP) se você ainda não tiver um.
  3. Ative a API Google Wallet.
  4. Crie uma conta de serviço e uma chave para chamar a API Google Wallet.
  5. Autorize a conta de serviço no Console do Google Pay e da Carteira.
  6. Use o modelo de cartão de embarque para criar uma nova classe de embarque.

API Google Wallet

Para criar um cartão de embarque e gerar um URL de "Adicionar à Carteira do Google" para o RBM, siga estas etapas:

  1. Executar as autenticações e autorizações necessárias.
  2. Crie um objeto de cartão.
  3. Receba um JSON Web Token (JWT) assinado. O comprimento máximo de um JWT codificado é de 2.048 caracteres.
  4. Use o JWT para gerar um URL de "Adicionar à Carteira do Google".

API RBM

Para enviar uma sugestão de adição à Carteira do Google usando o RBM, envie uma ação de abrir URL. No payload da mensagem, faça o seguinte:

  1. Para text, digite "Adicionar à Carteira do Google".
  2. Em url, insira o URL "Adicionar à Carteira do Google".

O ícone da Carteira do Google vai aparecer automaticamente no rótulo da sugestão.

Ícone da Carteira do Google na sugestão "Adicionar à Carteira do Google"

Design de conversa

Este exemplo usa o poder exclusivo da conversa para orientar os usuários em um fluxo de check-in completo. Ele demonstra como usar a conversa natural e recursos avançados, como sugestões de um toque e cards avançados, para ajudar os usuários a alcançar os objetivos. Neste caso, os objetivos são: (1) personalizar minha experiência de voo, (2) receber meu cartão de embarque e (3) adicionar à Carteira do Google para acesso rápido no aeroporto.

A seguir, confira uma visão geral da conversa. É seguido por dicas de design e um detalhamento passo a passo do fluxo. Para implementar um design semelhante para seu agente, consulte os exemplos de código seguindo as etapas.

Diagrama da conversa

Conselhos de design

Tenha estes princípios em mente ao projetar seu fluxo de check-in:

  • Sua primeira mensagem é a mais importante. Informe brevemente o objetivo da conversa para que o usuário tenha um motivo para interagir.
  • Cada mensagem precisa fornecer um pequeno trecho de informações e solicitar que o usuário responda. As respostas sugeridas e as ações sugeridas ajudam os usuários a dar o próximo passo.
  • O agente precisa ser responsivo, não robótico. Use uma linguagem que reflita o tom de voz da sua marca. Como o representante ideal da marca conversaria com um cliente?
  • As pessoas gostam de se sentir especiais. Você pode personalizar a experiência de check-in sugerindo assentos ou refeições com base no histórico de voos do usuário.
  • Rich cards e carretéis tornam a conversa mais dinâmica. Use-as para compartilhar imagens e detalhes que ajudem o usuário a escolher entre as opções.
  • Uma boa conversa termina bem. Confirme os detalhes de check-in do usuário antes de enviar o cartão de embarque. Adicione um toque humano com uma mensagem amigável.

Fluxo de check-in

  1. O agente notifica o usuário de que o check-in para o voo está aberto.

    Mensagem de saudação com detalhes do check-in e respostas sugeridas

    Exemplo de código

    const suggestions = [
      {
        reply: {
          text: '⚡ Check in',
          postbackData: 'checkIn',
        },
      },
      {
        reply: {
          text: '⏰ Remind me later',
          postbackData: 'remindMe',
        },
      },
      {
        reply: {
          text: '✈️ View my flight details',
          postbackData: 'flightDetails',
        },
      },
      {
        reply: {
          text: '🔀 Change my flight',
          postbackData: 'flightChange',
        },
      },
    ];  
    
    const params = {
      messageText: 'Check-in for your flight',
      messageDescription: '👏 Happy morning, Jo! Check-in is now open for your flight from London to Mumbai on ' + getFlightTime() + ' at 2:00PM. What would you like to do? ',
      msisdn: phoneNumber,
      suggestions: suggestions,
      imageUrl: getImageUrl('fly.png'),
      height: 'MEDIUM',
    };  
    
    rbmApiHelper.sendRichCard(params);      
    
  2. O usuário toca em uma resposta sugerida para fazer o check-in.

    A sugestão de fazer check-in é tocada

  3. O agente define as expectativas para o processo de check-in.

    A mensagem diz: OK, ótimo. São apenas três etapas para fazer o check-in. Confira a primeira etapa para começar

    Exemplo de código

    const params = {
      messageText: "OK, great. It's just 3 simple steps to check in. Here's the first step to get you onboard:",
      msisdn: msisdn,
    };  
    
    let self = this;
    
    rbmApiHelper.sendMessage(params, function (response, err) {
      self.sendPolicyImage(msisdn);
    });   
    

  4. O agente pede que o usuário concorde com a política de segurança.

    Card interativo com infográfico da política de segurança e sugestões para concordar ou discordar. O texto no card diz: Para garantir um voo seguro, revise nossa política de segurança e informe se você concorda.

    Exemplo de código

    const suggestions = [
      {
        reply: {
          text: 'Yes, I agree',
          postbackData: 'policy_agree',
        },
      },
      {
        reply: {
          text: "No, I don't agree",
          postbackData: 'policy_nack',
        },
      },
    ];  
    
    const params = {
      messageText: 'Baggage safety policy',
      messageDescription: 'To help us ensure a safe flight, please review our safety policy and let us know you agree',
      msisdn: msisdn,
      suggestions: suggestions,
      imageUrl: getImageUrl('policyImage.png'),
      height: 'MEDIUM',
      orientation: 'HORIZONTAL',
      thumbnailImageAlignment: 'LEFT',
    };  
    
    rbmApiHelper.sendRichCard(params);
    

  5. O usuário toca em uma resposta sugerida para concordar.

    A sugestão de concordância é tocada

  6. O agente agradece ao usuário e apresenta a próxima etapa.

    A mensagem diz: "Agradeço. Um passageiro seguro é um passageiro feliz." Confira a próxima etapa

    Exemplo de código

    const params = {
      messageText: "Thank you - A safe passenger is a happy passenger! Here's the next step:",
      msisdn: msisdn,
    };
    
    let self = this;
    
    rbmApiHelper.sendMessage(params, function (response, err) {
      self.sendPlan(msisdn);
    });     
    

  7. O agente pede que o usuário escolha um assento.

    Rich card com infográfico do mapa de assentos. O texto no card diz: "É hora de relaxar!" Recomendamos alguns assentos com base no seu último voo. Escolha o que você quer ou informe o número do seu assento preferido. As sugestões após o cartão mostram algumas opções de lugares

    Exemplo de código

    const suggestions = [
      {
        reply: {
          text: 'View the seat map',
          postbackData: 'view_seat_map',
        },
      },
    ];
    
    const outerSuggestions = [
      {
        reply: {
          text: '17A',
          postbackData: 'seat_17A',
        },
      },
      {
        reply: {
          text: '17C',
          postbackData: 'seat_17C',
        },
      },
      {
        reply: {
          text: '18A',
          postbackData: 'seat_18A',
        },
      },
      {
        reply: {
          text: 'Show me more',
          postbackData: 'more',
        },
      },
    ];  
    
    const params = {
      messageText: 'Choose your seat',
      messageDescription: "It's time to sit back and get comfy! 💺 We've recommended some seats based on your last flight. Choose the one you want, or let us know your preferred seat by typing the number.",
      msisdn: msisdn,
      imageUrl: getImageUrl('seatMap.png'),
      height: 'TALL',
      orientation: 'VERTICAL',
      outerSuggestions: outerSuggestions
    };  
    
    rbmApiHelper.sendRichCard(params);
    

  8. O usuário toca em uma resposta sugerida para o assento escolhido.

    A sugestão para o assento 18A é tocada

  9. O agente confirma a escolha do usuário.

    A mensagem diz: assento 18A, você conseguiu.

    Exemplo de código

    this.seatmap[msisdn] = seat;  
    
    const params = {
      messageText: `Seat ${seat}, you got it`,
      msisdn: msisdn,
    };  
    
    let self = this;  
      rbmApiHelper.sendMessage(params, function(res) {
        self.sendFoodOptions(msisdn);
    }); 
    

  10. O agente pede para o usuário escolher a refeição a bordo.

    A mensagem diz: Agora vamos falar sobre comida. Você pode encomendar uma refeição a bordo. Você ficaria feliz com uma entrada vegetariana ou uma entrada de frango?

    Exemplo de código

    const params = {
      messageText: `Now let's talk food 😋 You can pre-order your in-flight meal. Would you be happy with a vegetarian entree or a chicken entree?`,
      msisdn: msisdn,
    };  
    
    let self = this;  
    
    rbmApiHelper.sendMessage(params, function(res) {
      self.sendFoodDetails(msisdn);
    });
    

  11. O agente mostra as opções de refeição.

    Carrossel de Rich Card mostrando dois cards: um com a imagem de uma salada e outro com uma imagem de frango assado. Ambos os cards têm uma lista de ingredientes e uma sugestão para escolher a refeição

    Exemplo de código

    const cardContents = [
      {
        title: 'Panzanella salad (v)',
        description: 'Ingredients: bread, lettuce, onions, tomatoes, olive oil',
        suggestions: [
          {
            reply: {
              text: 'Choose vegetarian',
              postbackData: 'veggie',
            },
          },
        ],
        media: {
          height: 'MEDIUM',
          contentInfo: {
            fileUrl: getImageUrl('salad.jpg'),
          },
        },
      },
      {
        title: 'Grilled chicken with greens',
        description: 'Ingredients: chicken, potatoes, peppers, olive oil',
        suggestions: [
          {
            reply: {
              text: 'Choose chicken',
              postbackData: 'chicken',
            },
          },
        ],
        media: {
          height: 'MEDIUM',
          contentInfo: {
            fileUrl: getImageUrl('chicken.png'),
          },
        },
      },
    ];  
    
    const params = {
      msisdn: msisdn,
      cardContents: cardContents,
    };  
    
    rbmApiHelper.sendCarouselCard(params);
    

  12. O usuário toca em uma resposta sugerida para a refeição escolhida.

    A sugestão de escolher o cardápio vegetariano é tocada.

  13. O agente confirma a escolha do usuário.

    A mensagem diz: "Vou pedir comida vegetariana."

    Exemplo de código

    const params = {
      messageText: `Vegetarian it is 💚`,
      msisdn: msisdn,
    };  
    
    let self = this;  
    
    rbmApiHelper.sendMessage(params, function (response, err) {
      self.sendAskConfirmation(msisdn);  
    });
    

  14. O agente resume os detalhes do check-in.

    A mensagem diz: Confira o que registramos: você escolheu o assento 18A e uma refeição vegetariana. Confirme suas escolhas. Sugestões aparecem abaixo da mensagem para confirmar os detalhes, mudar o assento ou a refeição.

    Exemplo de código

    let seat = this.seatmap[msisdn];  
    
    const suggestions = [
      {
        reply: {
          text: "Yes, I'm happy with that",
          postbackData: 'happy',
        },
      },
      {
        reply: {
          text: 'Change my seat',
          postbackData: 'change_seat',
        },
      },
      {
        reply: {
          text: 'Change my meal',
          postbackData: 'change_meal',
        },
      },
    ];
    
    const params = {
      messageText: "Here's what we've noted down: You've opted for seat " + seat + " and a vegetarian meal. Please confirm your choices.",
      msisdn: msisdn,
      suggestions: suggestions
    };  
    
    rbmApiHelper.sendMessage(params);  
    

  15. O usuário toca em uma resposta sugerida para confirmar os detalhes do check-in.

    Sugestão para confirmar os detalhes é tocada.

  16. O agente anuncia que o check-in foi concluído.

    Mensagem: Oba! Seu check-in foi feito. Este é seu cartão de embarque. Será um prazer receber você em breve.

    Exemplo de código

    const params = {
      messageText: "Hooray! You're now checked in for your flight ☑️ Here's your boarding pass. We're so happy to host you soon!",
      msisdn: msisdn,
    };  
    
    let self = this;  
    
    rbmApiHelper.sendMessage(params, function (response, err) {
      self.sendWalletPass(msisdn);       
    }); 
    

  17. O agente envia o cartão de embarque do usuário.

    O cartão avançado mostra uma imagem do cartão de embarque com um código QR e os detalhes do voo. O texto no card diz: Vamos manter você informado! Você vai receber uma notificação se os detalhes do voo mudarem. Uma sugestão no cartão diz "Adicionar à Carteira do Google".

    Exemplo de código

    this.walletHelper.createFlightPassUrl(this.seatmap[msisdn]).then((url) => {
      let suggestions = [
        {
          action: {
            text: 'Add to Google Wallet',
            postbackData: 'addToWallet',
            openUrlAction: {
              url: url
            },
          },
        },
      ];  
    
      const params = {
        messageText: 'HS123 LHR to BOM\nPassenger: Jo Flow',
        messageDescription: "We'll keep you up to date! You'll get a notification if your flight details change.",
        msisdn: msisdn,
        suggestions: suggestions,
        imageUrl: getImageUrl('boardingPass.png'),
        height: 'TALL',
        orientation: 'HORIZONTAL',
        thumbnailImageAlignment: 'LEFT',
      };  
    
      rbmApiHelper.sendRichCard(params);
    }); 
    

    Neste Rich Card horizontal, a imagem é um cartão de embarque totalmente funcional fornecido pela companhia aérea. A imagem precisa mostrar todas as informações de embarque necessárias, incluindo um código de barras que possa ser digitalizado. Os usuários podem tocar na imagem para conferir e digitalizar o cartão de embarque no app Mensagens do Google.

    Uma sugestão Adicionar à Carteira do Google aparece no cartão rico. Essa sugestão aciona uma ação de abrir URL que abre o app Carteira do Google, onde o usuário pode adicionar o cartão de embarque à carteira. Se o app não estiver no dispositivo do usuário, ele será solicitado para instalação. Depois que o cartão é adicionado à Carteira do Google, o usuário recebe automaticamente um lembrete de voo e atualizações de status se os detalhes do voo mudarem.

    Os usuários que não adicionarem o cartão à Carteira do Google também precisam ser atualizados. Enviar uma mensagem ao usuário sobre alterações nas informações de embarque mostradas no rich card.

  18. O usuário toca em uma ação sugerida para adicionar o cartão à Carteira do Google.

    Ícone da Carteira do Google e sugestão para adicionar à Carteira do Google

  19. O app Carteira do Google é aberto. O usuário toca em um botão para adicionar o cartão à carteira.

    O app Carteira mostra um cartão de embarque simplificado e um botão "Adicionar".

  20. O usuário toca em um botão para conferir o cartão.

    A marca de seleção aparece acima do cartão. O botão "Ver na Carteira do Google" aparece.

  21. O cartão de embarque com o código QR é mostrado.

    Cartão de embarque com todos os detalhes do voo e QR code