将登机牌添加到 Google 钱包

您可以将 Google 信息与 RCS 和 Google 钱包搭配使用,设计顺畅的登记流程:用户完成登记、接收登机牌,然后直接从“信息”应用将其添加到 Google 钱包。卡券添加到钱包后,如果航班详情发生变化,卡券会自动更新。用户可以在手机上快速查看最新的登机牌。

本文档介绍了实现将登机牌添加到 Google 钱包的流程的技术步骤。本培训还提供包含设计提示的示例对话,帮助您通过 RBM 获得顺畅、高效的签到体验。

技术实现

如需实现将登机牌添加到 Google 钱包的流程,您需要使用 Google 钱包 API 和 RBM API。

前提条件

要开始使用 Google Wallet API,请按照以下必要步骤操作:

  1. 注册 Google 钱包发卡机构账号,以便为 Google 钱包创建和分发卡券。
  2. 如果您还没有 Google Cloud (GCP) 项目,请创建一个。
  3. 启用 Google Wallet API。
  4. 创建一个服务账号和密钥,以便调用 Google Wallet API。
  5. 在 Google Pay 和钱包控制台中授权服务账号。
  6. 使用登机牌模板创建新的登机类。

Google Wallet API

如需为 RBM 创建登机牌并生成“添加到 Google 钱包”网址,请按以下步骤操作:

  1. 执行必要的身份验证和授权。
  2. 创建卡券对象。
  3. 获取签名的 JSON Web 令牌 (JWT)。编码后的 JWT 的长度上限为 2048 个字符。
  4. 使用 JWT 生成“添加到 Google 钱包”网址。

RBM API

如需从 RBM 发送“添加到 Google 钱包”建议,请发送打开网址操作。在消息载荷中,执行以下操作:

  1. 对于 text,请输入“Add to Google Wallet”。
  2. 对于 url,请输入“添加到 Google 钱包”网址。

Google 钱包图标会自动显示在建议标签上。

“添加到 Google 钱包”建议中的 Google 钱包图标

对话设计

此示例利用对话的独特优势,引导用户完成完整的签到流程。该示例展示了如何使用自然对话和丰富功能(例如一键式建议和富媒体卡片)来帮助用户实现目标。在本例中,用户的目标是:(1) 自定义我的航班体验、(2) 接收登机牌,以及 (3) 将其添加到 Google 钱包,以便在机场快速访问。

接下来是对对话的概述。接下来是设计提示和流程的分步细分。如需为代理实现类似的设计,请参阅以下步骤代码示例。

对话示意图

设计建议

设计签到流程时,请牢记以下原则:

  • 您的第一条消息至关重要。简要说明对话的目的,让用户有理由进行互动。
  • 每条消息都应提供一小段信息,并提示用户做出回应。建议的回复建议的操作可帮助用户执行后续操作。
  • 您的客服人员应具有回应能力,而不是机械式回答。使用反映品牌语气的语言。理想的品牌代表会如何与客户聊天?
  • 人们喜欢被宠爱。您可以根据用户的航班记录,推荐座位或餐食,从而打造个性化的登机体验。
  • 复合搜索卡轮播界面可让对话更有活力。使用这些元素分享图片和详细信息,帮助用户从选项中进行选择。
  • 良好的对话会收尾。在发送用户登机牌之前,确认用户的登机手续详细信息。通过友好送去添加一些人性元素。

签到流程

  1. 客服人员通知用户可以办理航班的登机手续。

    包含入住详情和建议回复的问候消息

    代码示例

    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. 用户点按建议的回复进行签到。

    点按签到建议

  3. 客服人员会说明签到流程。

    消息状态:好的,太好了。只需 3 个步骤即可完成签到。以下是帮助您快速上手的第一步

    代码示例

    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. 客服人员要求用户同意安全政策。

    富媒体卡片,其中包含安全政策信息图和同意或不同意的建议。卡片上的文字:为帮助我们确保您乘坐的航班安全顺利,请查看我们的安全政策,并确认您同意。

    代码示例

    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. 用户点按建议的回复以表示同意。

    点按同意建议

  6. 客服人员向用户表示感谢,并介绍后续步骤。

    消息内容:谢谢,安全的乘客是快乐的乘客!后续步骤

    代码示例

    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. 客服人员提示用户选择座位。

    包含座位图信息图的复合信息卡。卡片上的文字:It's time to sit back and get comfy! 我们根据您上次乘坐的航班为您推荐了一些座位。选择您想要的座位,或输入座位号告诉我们您首选的座位。卡片后面的建议会显示一些座位选项

    代码示例

    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. 用户点按所选座位的建议回复。

    已点按 18A 号座位的建议

  9. 客服人员确认用户的选择。

    消息状态:18A 号座位,你明白了。

    代码示例

    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. 客服人员要求用户选择机上餐食。

    消息内容:现在,我们来谈谈食物。您可以预订机餐。您喜欢素食主菜还是鸡肉主菜?

    代码示例

    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. 客服人员会显示餐食选项。

    复合信息卡轮播界面显示了两张卡片:一张是沙拉图片,另一张是烤鸡图片。这两张卡片都包含食材清单和选择该餐食的建议

    代码示例

    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. 用户点按针对其所选餐食的建议回复。

    已点按选择素食的建议。

  13. 代理会确认用户的选择。

    消息内容:这里是素食。

    代码示例

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

  14. 客服人员会总结入住详情。

    消息内容:我们记录了以下信息:您选择了 18A 座位和素食餐。请确认您的选择。系统会在消息下方显示建议,以便您确认详细信息、更改餐食或更改座位。

    代码示例

    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. 用户点按建议的回复以确认签到详情。

    点按建议以确认详细信息。

  16. 客服人员会宣布办理入住手续已完成。

    消息状态:好哇!您现在已为航班办理登机手续。这是您的登机牌。我们非常高兴很快就能为您提供支持!

    代码示例

    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. 客服人员发送用户的登机牌。

    富媒体卡片会显示登机牌的图片,其中包含二维码和航班详细信息。卡片上的文字:“我们会及时告知您最新进展!”如果航班详情发生变化,您会收到通知。卡片上显示一条建议,提示“添加到 Google 钱包”。

    代码示例

    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);
    }); 
    

    在此横向复杂卡片中,图片是航空公司提供的功能齐全的登机牌。图片应显示所需的所有登机信息,包括可扫描的条形码。用户可以点按图片,在 Google 的“信息”应用中查看和扫描登机牌。

    复合信息卡上会显示添加到 Google 钱包建议。此建议会触发“打开网址”操作来打开 Google 钱包应用,用户可以在其中将登机牌添加到自己的钱包。(如果用户设备上未安装该应用,系统会提示用户安装该应用。)将卡券添加到 Google 钱包后,如果用户的航班详情发生变化,系统会自动收到航班提醒状态更新

    未将卡券添加到 Google 钱包的用户也应及时获取最新信息。向用户发送有关富媒体卡片上显示的登机信息的任何更改的消息。

  18. 用户点按建议的操作,将卡券添加到 Google 钱包。

    Google 钱包图标和“添加到 Google 钱包”建议

  19. Google 钱包应用随即打开。用户点按按钮将卡券添加到钱包。

    钱包应用显示简化的登机牌和一个带有“添加”字样的按钮。

  20. 用户点按按钮以查看卡券。

    卡券上方会显示对勾标记。系统显示“在 Google 钱包中查看”按钮。

  21. 系统会显示包含二维码的登机牌。

    包含所有航班详细信息和二维码的登机牌