將登機證新增至 Google 錢包

你可以將 Google 訊息與 RCS 和 Google 錢包搭配使用,設計出流暢的結帳流程:使用者完成登機報到手續、收到登機證,然後從「訊息」應用程式直接將票證新增至 Google 錢包。錢包一經變更,票證就會自動更新。使用者可在手機上快速取得最新的登機證。

本文件說明將登機證導入 Google 錢包流程的技術步驟。此外,課程還會提供對話設計範例範例,協助您透過 RBM 順暢且有效率地進行簽到。

技術實作

如要在 Google 錢包流程中導入登機證,請使用 Google Wallet API 和 RBM API。

必要條件

如要開始使用 Google Wallet API,請按照下列步驟操作:

  1. 註冊 Google 錢包發卡機構帳戶,才能建立及發布 Google 錢包票證。
  2. 如果您還沒有 Google Cloud Platform (GCP) 專案,請建立一個。
  3. 啟用 Google Wallet API。
  4. 建立服務帳戶和金鑰,以便呼叫 Google Wallet API。
  5. 在 Google Pay 和錢包主控台中授權服務帳戶。
  6. 使用登機證範本建立新的登機證。

Google Wallet API

如要建立登機證並產生 RBM 的「新增至 Google 錢包」網址,請按照下列步驟操作:

  1. 執行必要的驗證和授權。
  2. 建立票證物件。
  3. 取得已簽署的 JSON Web Token (JWT)。編碼的 JWT 的長度上限為 2048 個字元。
  4. 使用 JWT 來產生「新增至 Google 錢包」網址。

RBM API

如要透過 RBM 將「新增至 Google 錢包」建議,請傳送開啟網址動作。 在訊息酬載中執行下列操作:

  1. text 設為「新增至 Google 錢包」。
  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. 服務專員會提示使用者選擇座位。

    複合式資訊卡,其中含有座位圖。資訊卡上的文字說:是時候放鬆身心吧!系統是根據你上次搭乘的航班,向你建議一些座位。請選擇您想要的值,或是輸入數字以告訴我們您偏好的座位。資訊卡下方會顯示幾個座位選項

    程式碼範例

    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. 服務專員傳送使用者的登機證。

    複合式資訊卡會顯示登機證的圖片,以及 QR 圖碼和航班詳細資料。資訊卡上的文字: 我們會即時通知你!如果你的航班詳細資料有所變更,你會收到通知。資訊卡上的建議說「新增至 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. 顯示 QR 圖碼的登機證。

    包含所有航班詳細資料和 QR 圖碼的登機證