إضافة بطاقة صعود الطائرة إلى "محفظة Google"

يمكنك استخدام ميزة الرسائل من Google مع خدمات الاتصالات التفاعلية (RCS) ومحفظة Google لتصميم مسار تسجيل وصول سلس: يكمل المستخدم عملية تسجيل وصوله ويتلقّى بطاقة صعود الطائرة ويضيفها مباشرةً إلى "محفظة Google" من تطبيق "الرسائل". وبعد تعديل المحفظة، يتم تعديل البطاقة تلقائيًا إذا تغيّرت تفاصيل الرحلة الجوية. يمكن للمستخدمين الوصول سريعًا إلى بطاقة صعود الطائرة الحديثة على هواتفهم مباشرةً.

يصف هذا المستند الخطوات الفنية لتنفيذ بطاقة صعود الطائرة إلى مسار "محفظة Google". يتضمّن التطبيق أيضًا نموذجًا لمحادثة مع نصائح بشأن التصميم لضمان تجربة سلسة وأكثر فعالية عند تفعيل ميزة "مراسلة الأنشطة التجارية من خلال خدمات الاتصالات التفاعلية (RCS)".

التنفيذ الفني

لتنفيذ بطاقة صعود الطائرة في مسار "محفظة Google"، يجب استخدام واجهة برمجة تطبيقات Google Wallet وRBM API.

المتطلبات الأساسية

لبدء استخدام Google Wallet API، اتّبِع الخطوات التالية:

  1. اشترِك في حساب جهة إصدار محفظة كي تتمكن من إنشاء بطاقات وتوزيعها على "محفظة Google".
  2. أنشِئ مشروع Google Cloud Platform (GCP) إذا لم يكن لديك مشروع.
  3. تفعيل Google Wallet API
  4. عليك إنشاء حساب خدمة ومفتاح لتتمكّن من الاتصال بـ Google Wallet API.
  5. تفويض حساب الخدمة في Google Pay وWallet Console
  6. يمكنك استخدام نموذج بطاقة صعود الطائرة لإنشاء صف جديد لصعود الطائرة.

واجهة برمجة تطبيقات "محفظة Google"

لإنشاء بطاقة صعود الطائرة وإنشاء عنوان URL لميزة "الإضافة إلى محفظة Google" لميزة "مراسلة الأنشطة التجارية من خلال خدمات الاتصالات التفاعلية (RCS)"، يُرجى اتّباع هذه الخطوات:

  1. نفّذ عمليات المصادقة والتفويضات اللازمة.
  2. أنشِئ كائن "البطاقات".
  3. احصل على رمز JSON المميّز للويب (JWT). يبلغ الحد الأقصى لطول ملف JWT المشفّر 2048 حرفًا.
  4. استخدِم JWT لإنشاء عنوان URL للإضافة إلى "محفظة Google".

واجهة برمجة تطبيقات ميزة "مراسلة الأنشطة التجارية من خلال خدمات الاتصالات التفاعلية (RCS)"

لإرسال اقتراح "إضافة إلى محفظة Google" من ميزة "مراسلة الأنشطة التجارية من خلال خدمات الاتصالات التفاعلية (RCS)"، أرسِل إجراء عنوان URL مفتوح. في حمولة الرسالة، نفِّذ ما يلي:

  1. بخصوص text، أدخِل "إضافة إلى محفظة Google".
  2. بالنسبة إلى url، أدخِل عنوان 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. يؤكّد الوكيل خيار المستخدم.

    حالات الرسائل: المقعد 18(أ)، موافق.

    عيّنة تعليمات برمجية

    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" في البطاقة المنسّقة. يؤدي هذا الاقتراح إلى تشغيل إجراء عنوان URL المفتوح الذي يفتح تطبيق "محفظة Google"، حيث يمكن للمستخدم إضافة بطاقة صعود الطائرة بسهولة إلى محفظته. (إذا لم يكن التطبيق متوفرًا على جهاز المستخدم، سيُطلب منه تثبيته). بعد إضافة البطاقة إلى "محفظة Google"، يتلقّى المستخدم تلقائيًا تذكيرًا بشأن الرحلة الجوية وتعديلات في الحالة في حال تغيّر تفاصيل الرحلة الجوية.

    يجب أيضًا إبقاء المستخدمين الذين لا يضيفون البطاقة إلى "محفظة Google" معدّلين. وأرسِل إلى المستخدم أي تغييرات على معلومات صعود الطائرة المعروضة على البطاقة المنسَّقة.

  18. ينقر المستخدم على إجراء مقترح لإضافة البطاقة إلى "محفظة Google".

    رمز "محفظة Google" واقتراح "الإضافة إلى محفظة Google"

  19. سيتم فتح تطبيق "محفظة Google". ينقر المستخدم على زر لإضافة البطاقة إلى محفظته.

    يعرض تطبيق "محفظة Google" بطاقة دخول مبسّطة وزرًا يعرض عبارة "إضافة".

  20. ينقر المستخدم على زر للاطّلاع على بطاقتك.

    تظهر علامة اختيار فوق البطاقة. زر يظهر في "محفظة Google"

  21. ستظهر لك بطاقة صعود الطائرة التي تتضمّن رمز الاستجابة السريعة.

    بطاقة صعود الطائرة تتضمّن جميع تفاصيل رحلات الطيران ورمز الاستجابة السريعة