स्टोर से ऑनलाइन पिकअप करें: बोनस से जुड़ा खाना - दूसरा भाग - शॉपिंग कार्ट बनाना

1. परिचय

53003251caaf2be5.png 8826bd8cb0c0f1c7.png

पिछली बार अपडेट किए जाने की तारीख: 30-10-2020

Business Messages पर शॉपिंग कार्ट बनाना!

यह सीरीज़ का दूसरा कोडलैब है. इसका मकसद, स्टोर में जाकर खरीदारी करने की सुविधा देने वाले उपयोगकर्ता के अनुभव को बेहतर बनाना है. ई-कॉमर्स के कई सफ़र में, शॉपिंग कार्ट उपयोगकर्ताओं को पैसे चुकाने वाले ग्राहकों में बदलने की सफलता की कुंजी है. शॉपिंग कार्ट अपने ग्राहकों को बेहतर ढंग से समझने का एक तरीका भी है. साथ ही, इसकी मदद से आप अपने ग्राहकों को ऐसे दूसरे आइटम के सुझाव भी दे सकते हैं जिनमें उनकी दिलचस्पी हो. इस कोडलैब में, हम शॉपिंग कार्ट का अनुभव बेहतर बनाने और ऐप्लिकेशन को Google App Engine में डिप्लॉय करने पर ध्यान देंगे.

एक अच्छा शॉपिंग कार्ट कैसे बनता है?

ऑनलाइन शॉपिंग के अनुभव को सफल बनाने के लिए, शॉपिंग कार्ट ज़रूरी हैं. Business Messages, संभावित ग्राहक वाले प्रॉडक्ट पर सवाल और जवाब की सुविधा देने के साथ-साथ खरीदारी का पूरा अनुभव देने में भी मदद करता है. साथ ही, बातचीत के दौरान पेमेंट करने की सुविधा भी देता है.

9d17537b980d0e62.png

एक अच्छे शॉपिंग कार्ट के अलावा, खरीदारी का अच्छा अनुभव उपयोगकर्ताओं को कैटगरी के हिसाब से आइटम ब्राउज़ करने की सुविधा देता है. साथ ही, इससे कारोबार को ऐसे अन्य प्रॉडक्ट का सुझाव देने में मदद मिलती है जिनमें खरीदार की दिलचस्पी हो सकती है. शॉपिंग कार्ट में और आइटम जोड़ने के बाद, उपयोगकर्ता अपने पूरे कार्ट की समीक्षा कर सकता है और चेक आउट करने से पहले आइटम हटा सकता है या ज़्यादा आइटम जोड़ सकता है.

आपको क्या बनाना होगा

कोडलैब सीरीज़ के इस सेक्शन में, काल्पनिक कंपनी Bonjour Meal के लिए बनाए गए डिजिटल एजेंट का दायरा बढ़ाया जा रहा है, जिसे आपने पार्ट 1 में बनाया था. इससे उपयोगकर्ता, आइटमों का कैटलॉग ब्राउज़ कर पाएंगे और शॉपिंग कार्ट में आइटम जोड़ पाएंगे.

इस कोडलैब में, आपका ऐप्लिकेशन ये काम कर पाएगा

  • Business Messages में सवालों का कैटलॉग दिखाएं
  • ऐसे आइटम के सुझाव दें जिनमें उपयोगकर्ताओं की दिलचस्पी हो सकती है
  • शॉपिंग कार्ट के कॉन्टेंट की समीक्षा करें और कुल कीमत की खास जानकारी तैयार करें

ab2fb6a4ed33a129.png

आपको इनके बारे में जानकारी मिलेगी

  • Google Cloud Platform पर App Engine पर वेब ऐप्लिकेशन डिप्लॉय करने का तरीका
  • शॉपिंग कार्ट की स्थिति को सेव करने के लिए, स्थायी स्टोरेज तरीके का इस्तेमाल करने का तरीका

यह कोडलैब इस कोडलैब सीरीज़ के पहले हिस्से से डिजिटल एजेंट को बढ़ाने पर फ़ोकस करता है.

आपको इन चीज़ों की ज़रूरत होगी

  • GCP प्रोजेक्ट को रजिस्टर किया गया हो और Business Messages के साथ इस्तेमाल करने की मंज़ूरी दी गई हो
  • अगर आपको यह जानना है कि क्या करना है, तो हमारी डेवलपर साइट पर जाएं
  • आपके GCP प्रोजेक्ट के लिए, सेवा खाते की JSON क्रेडेंशियल फ़ाइल जनरेट की गई
  • आपके पास Android 5 या इसके बाद के वर्शन वाला डिवाइस हो या आपके पास Google Maps ऐप्लिकेशन वाला iOS डिवाइस हो
  • वेब ऐप्लिकेशन प्रोग्रामिंग का अनुभव
  • इंटरनेट कनेक्शन है!

2. सेट अप किया जा रहा है

यह कोडलैब यह मानकर चलता है कि आपने अपना पहला एजेंट बना लिया है और कोडलैब का पहला हिस्सा पूरा कर लिया है. इसलिए, हम Business Messages और Business Communications API को चालू करने, सेवा खाते की कुंजियां बनाने, ऐप्लिकेशन डिप्लॉय करने या Business Communications कंसोल पर वेबहुक सेट अप करने से जुड़ी बुनियादी बातों पर चर्चा नहीं करेंगे. इसलिए, हम एक सैंपल ऐप्लिकेशन का क्लोन बनाएंगे, ताकि यह पक्का किया जा सके कि आपका ऐप्लिकेशन, ऊपर बनाए जा रहे प्रॉडक्ट से मेल खाता है. साथ ही, हम Google Cloud Platform पर Datastore के लिए एपीआई को चालू करेंगे, ताकि शॉपिंग कार्ट से जुड़ा डेटा सेव रखा जा सके.

GitHub से ऐप्लिकेशन को क्लोन करना

किसी टर्मिनल में, यहां दिए गए निर्देश की मदद से, अपने प्रोजेक्ट की काम करने वाली डायरेक्ट्री में Django Echo Bot सैंपल का क्लोन बनाएं:

$ git clone https://github.com/google-business-communications/bm-bonjour-meal-django-starter-code

सेवा खाते के लिए बनाई गई JSON क्रेडेंशियल फ़ाइल को, सैंपल के रिसॉर्स फ़ोल्डर में कॉपी करें. साथ ही, क्रेडेंशियल का नाम बदलकर "bm-agent-service-account-Credentials.json" करें.

bm-bonjour-meal-django-starter-code/bonjourmeal-codelab/step-2/resources/bm-agent-service-account-credentials.json

Google Datastore API चालू करना

इस कोडलैब के पहले हिस्से में, आपने Business Messages API, Business Messaging API, और Cloud Build API को चालू किया है.

इस कोडलैब के लिए, हम Google Datastore के साथ काम करेंगे, इसलिए हमें इस एपीआई को भी चालू करना होगा:

  1. Google Cloud Console में Google Datastore API खोलें.
  2. पक्का करें कि सही GCP प्रोजेक्ट का इस्तेमाल किया जा रहा हो.
  3. चालू करें पर क्लिक करें.

सैंपल ऐप्लिकेशन को डिप्लॉय करना

टर्मिनल में, सैंपल की चरण-2 डायरेक्ट्री पर जाएं.

सैंपल डिप्लॉय करने के लिए, किसी टर्मिनल में इन कमांड को चलाएं:

$ gcloud config set project PROJECT_ID*
$ gcloud app deploy
  • PROJECT_ID उस प्रोजेक्ट का प्रोजेक्ट आईडी है, जिसका इस्तेमाल आपने एपीआई के साथ रजिस्टर करने के लिए किया था.

आखिरी निर्देश के आउटपुट में डिप्लॉय किए गए ऐप्लिकेशन का यूआरएल देखें:

Deployed service [default] to [https://PROJECT_ID.appspot.com]

आपने अभी-अभी जो कोड डिप्लॉय किया है उसमें वेबहुक वाला वेब ऐप्लिकेशन मौजूद है, ताकि आपको Business Messages से मैसेज मिल सकें. इसमें वह सब कुछ शामिल होता है जो हमने कोडलैब के पहले पार्ट में किया है. अगर आपने पहले से ऐसा नहीं किया है, तो कृपया अपना वेबहुक कॉन्फ़िगर करें.

ऐप्लिकेशन, कुछ आसान सवालों के जवाब देगा. जैसे, कोई उपयोगकर्ता बोनजर खाने के कारोबार के खुले होने के समय के बारे में पूछता है. आपको अपने मोबाइल डिवाइस पर उन टेस्ट यूआरएल की मदद से इसकी जांच करनी चाहिए जिन्हें बिज़नेस कम्यूनिकेशन कंसोल में एजेंट की जानकारी से वापस पाया जा सकता है. टेस्ट यूआरएल, आपके मोबाइल डिवाइस पर Business Messages का अनुभव लॉन्च करेंगे. इसके बाद, वहां अपने एजेंट से बातचीत की जा सकेगी.

3. प्रॉडक्ट कैटलॉग

इन्वेंट्री सिस्टम

ज़्यादातर मामलों में, इंटरनल एपीआई की मदद से, किसी ब्रैंड की इन्वेंट्री को सीधे तौर पर इंटिग्रेट किया जा सकता है. अन्य मामलों में, आप किसी वेब पेज को स्क्रैप कर सकते हैं या अपना खुद का इन्वेंट्री ट्रैकिंग सिस्टम बना सकते हैं. हमारा मकसद इन्वेंट्री सिस्टम बनाना नहीं है; हम एक सामान्य स्टैटिक फ़ाइल का इस्तेमाल करेंगे, जिसमें अपने एजेंट के लिए इमेज और प्रॉडक्ट की जानकारी होगी. इस सेक्शन में, हम इस स्टैटिक फ़ाइल से जानकारी लेंगे, उस जानकारी को बातचीत में शामिल करेंगे, और उपयोगकर्ता को शॉपिंग कार्ट में जोड़ने के लिए उपलब्ध आइटम ब्राउज़ करने की अनुमति देंगे.

स्टैटिक इन्वेंट्री फ़ाइल इस तरह दिखती है:

bonjourmeal-codelab/step-2/resources/inventory.json

{

    "food": [
        {
            "id":0,
            "name": "Ham and cheese sandwich",
            "price": "6.99",
            "image_url": "https://storage.googleapis.com/bonjour-rail.appspot.com/ham-and-cheese.png",
            "remaining": 8
        },
        {
            "id":1,
            "name": "Chicken veggie wrap",
            "price": "9.99",
            "image_url": "https://storage.googleapis.com/bonjour-rail.appspot.com/chicken-veggie-wrap.png",
            "remaining": 2
        },
        {
            "id":2,
            "name": "Assorted cheese plate",
            "price": "7.99",
            "image_url": "https://storage.googleapis.com/bonjour-rail.appspot.com/assorted-cheese-plate.png",
            "remaining": 6
        },
        {
            "id":3,
            "name": "Apple walnut salad",
            "price": "12.99",
            "image_url": "https://storage.googleapis.com/bonjour-rail.appspot.com/apple-walnut-salad.png",
            "remaining": 1
        }
    ]
}

चलिए, इस फ़ाइल को Python ऐप्लिकेशन के ज़रिए पढ़ते हैं!

हमारी इन्वेंट्री से पढ़ना

इन्वेंट्री, "inventory.json" नाम की एक स्टैटिक फ़ाइल है ./resources डायरेक्ट्री में मौजूद है. JSON फ़ाइल का कॉन्टेंट पढ़ने और उसे बातचीत में दिखाने के लिए, हमें views.py में कुछ Python लॉजिक जोड़ना होगा. चलिए, एक ऐसा फ़ंक्शन बनाते हैं जो JSON फ़ाइल के डेटा को पढ़कर, उपलब्ध प्रॉडक्ट की सूची दिखाता है.

फ़ंक्शन की इस परिभाषा को views.py में कहीं भी रखा जा सकता है.

bonjourmeal-codelab/step-2/bopis/views.py

...
def get_inventory_data():
        f = open(INVENTORY_FILE)
        inventory = json.load(f)
        return inventory
...

इससे हमें वह जानकारी मिलेगी, जो हमें इन्वेंट्री का डेटा पढ़ने के लिए चाहिए. अब हमें इस प्रॉडक्ट की जानकारी को बातचीत में दिखाने का तरीका चाहिए.

प्रॉडक्ट कैटलॉग दिखाना

इस कोडलैब को आसानी से समझने के लिए, हमारे पास एक सामान्य प्रॉडक्ट कैटलॉग है. इसकी मदद से, हम एक रिच कार्ड कैरसेल की मदद से, Business Messages की बातचीत में सभी इन्वेंट्री आइटम दिखाते हैं.

प्रॉडक्ट कैटलॉग देखने के लिए, हम सुझाया गया ऐसा जवाब तैयार करेंगे जिसमें "मेन्यू दिखाएं" टेक्स्ट शामिल हो और postbackData "show-product-catalog". जब उपयोगकर्ता सुझाए गए जवाब पर टैप करते हैं और आपके वेब ऐप्लिकेशन को पोस्टबैक डेटा मिलता है, तो हम रिच कार्ड कैरसेल भेजेंगे. इस सुझाए गए जवाब के लिए नया स्थिरांक देखें.

bonjourmeal-codelab/step-2/bopis/views.py

...
CMD_SHOW_PRODUCT_CATALOG = 'show-product-catalog'
...

यहां से, हम मैसेज को पार्स करते हैं और उसे एक नए फ़ंक्शन पर रूट करते हैं. यह फ़ंक्शन, प्रॉडक्ट कैटलॉग वाला रिच कार्ड कैरसेल भेजता है. "send_product_catalog" फ़ंक्शन को कॉल करने के लिए, पहले route_message फ़ंक्शन को बढ़ाएं सुझाए गए जवाब को टैप करने पर, हम फ़ंक्शन तय करेंगे.

नीचे दिए गए स्निपेट में, route_message फ़ंक्शन के if स्टेटमेंट में एक और शर्त जोड़ें, ताकि यह पता लगाया जा सके कि normalized_message उस कॉन्सटेंट के बराबर है या नहीं जिसे हमने पहले तय किया था, CMD_SHOW_PRODUCT_CATALOG.

bonjourmeal-codelab/step-2/bopis/views.py

...
def route_message(message, conversation_id):
    '''
    Routes the message received from the user to create a response.

    Args:
        message (str): The message text received from the user.
        conversation_id (str): The unique id for this user and agent.
    '''
    normalized_message = message.lower()

    if normalized_message == CMD_RICH_CARD:
        send_rich_card(conversation_id)
    elif normalized_message == CMD_CAROUSEL_CARD:
        send_carousel(conversation_id)
    elif normalized_message == CMD_SUGGESTIONS:
        send_message_with_suggestions(conversation_id)
    elif normalized_message == CMD_BUSINESS_HOURS_INQUIRY:
        send_message_with_business_hours(conversation_id)
    elif normalized_message == CMD_ONLINE_SHOPPING_INQUIRY:
        send_online_shopping_info_message(conversation_id)
    elif normalized_message == CMD_SHOW_PRODUCT_CATALOG:
        send_product_catalog(conversation_id)
    else:
        echo_message(message, conversation_id)
...

साथ ही, यह पक्का करें कि फ़्लो को पूरा किया जा सके और send_product_catalog के बारे में बताया जा सके. send_product_catalog, get_menu_carousel, को कॉल करता है. इसकी मदद से, इन्वेंट्री फ़ाइल से रिच कार्ड का कैरसेल जनरेट किया जाता है. इस फ़ाइल को हमने पहले यहां पढ़ा था.

फ़ंक्शन की परिभाषाएं, views.py में कहीं भी दी जा सकती हैं. ध्यान दें कि नीचे दिए गए स्निपेट में दो नए कॉन्सटेंट का इस्तेमाल किया गया है, जिन्हें फ़ाइल के सबसे ऊपर जोड़ा जाना चाहिए.

bonjourmeal-codelab/step-2/bopis/views.py

...

CMD_ADD_ITEM = 'add-item'
CMD_SHOW_CART = 'show-cart'

...

def get_menu_carousel():
    """Creates a sample carousel rich card.

    Returns:
       A :obj: A BusinessMessagesCarouselCard object with three cards.
    """

    inventory = get_inventory_data()

    card_content = []

    for item in inventory['food']:
        card_content.append(BusinessMessagesCardContent(
            title=item['name'],
            description=item['price'],
            suggestions=[
                BusinessMessagesSuggestion(
                    reply=BusinessMessagesSuggestedReply(
                        text='Add item',
                        postbackData='{'+f'"action":"{CMD_ADD_ITEM}","item_name":"{item["id"]}"'+'}'))

                ],
            media=BusinessMessagesMedia(
                height=BusinessMessagesMedia.HeightValueValuesEnum.MEDIUM,
                contentInfo=BusinessMessagesContentInfo(
                    fileUrl=item['image_url'],
                    forceRefresh=False))))

    return BusinessMessagesCarouselCard(
        cardContents=card_content,
        cardWidth=BusinessMessagesCarouselCard.CardWidthValueValuesEnum.MEDIUM)

def send_product_catalog(conversation_id):
    """Sends the product catalog to the conversation_id.

    Args:
        conversation_id (str): The unique id for this user and agent.
    """
    rich_card = BusinessMessagesRichCard(carouselCard=get_menu_carousel())

    fallback_text = ''

    # Construct a fallback text for devices that do not support carousels
    for card_content in rich_card.carouselCard.cardContents:
        fallback_text += (card_content.title + '\n\n' + card_content.description
                          + '\n\n' + card_content.media.contentInfo.fileUrl
                          + '\n---------------------------------------------\n\n')

    message_obj = BusinessMessagesMessage(
        messageId=str(uuid.uuid4().int),
        representative=BOT_REPRESENTATIVE,
        richCard=rich_card,
        fallback=fallback_text,
        suggestions=[
        BusinessMessagesSuggestion(
            reply=BusinessMessagesSuggestedReply(
                text='See my cart',
                postbackData=CMD_SHOW_CART)
            ),
        BusinessMessagesSuggestion(
            reply=BusinessMessagesSuggestedReply(
                text='See the menu',
                postbackData=CMD_SHOW_PRODUCT_CATALOG)
            ),
        ]
        )

    send_message(message_obj, conversation_id)
...

अगर आपने कैरसेल आइटम बनाने की जांच की है, तो हम BusinessMessagesSuggestion क्लास का एक इंस्टेंस भी बनाते हैं. हर सुझाव, कैरसेल में किसी प्रॉडक्ट के लिए उपयोगकर्ता के चुने गए विकल्प को दिखाता है. जब कोई उपयोगकर्ता सुझाए गए जवाब पर टैप करेगा, तो Business Messages उसे पोस्टबैकडेटा भेजेगा. इसमें JSON फ़ॉर्मैट में, आइटम के बारे में जानकारी दी जाएगी. साथ ही, यह भी बताया जाएगा कि उपयोगकर्ता क्या कार्रवाई (कार्ट से जोड़ना या हटाना) करना चाहता है. नीचे दिए गए सेक्शन में, हम इस तरह दिखने वाले मैसेज को पार्स करेंगे, ताकि कार्ट में आइटम को असल में जोड़ा जा सके.

अब जबकि हमने ये बदलाव कर दिए हैं, तो हम वेब ऐप्लिकेशन को Google App Engine पर डिप्लॉय करते हैं और इस अनुभव को आज़माते हैं!

$ gcloud app deploy

जब आपके मोबाइल डिवाइस पर बातचीत वाला प्लैटफ़ॉर्म लोड हो जाए, तब "show-product-catalog" मैसेज भेजें साथ ही, आपको इस तरह के प्रॉडक्ट का कैरसेल दिखेगा.

4639da46bcc5230c.png

आइटम जोड़ें पर टैप करने पर, कुछ नहीं होता. हालांकि, एजेंट सुझाए गए जवाब से पोस्टबैक डेटा को इको करता है. अगले सेक्शन में, हम प्रॉडक्ट कैटलॉग का इस्तेमाल करेंगे और शॉपिंग कार्ट बनाने के लिए इसका इस्तेमाल करेंगे, जहां आइटम को जोड़ा जाएगा.

आपने अभी-अभी जो प्रॉडक्ट कैटलॉग बनाया है उसे कई तरीकों से बढ़ाया जा सकता है. आपके पास पीने के मेन्यू या फिर शाकाहारी पकवानों के अलग-अलग विकल्प हो सकते हैं. कैरसेल या सुझाव वाले चिप का इस्तेमाल करना, मेन्यू के विकल्पों को ड्रिल-डाउन करने का एक बेहतरीन तरीका है. इसकी मदद से, उपयोगकर्ता उन प्रॉडक्ट के सेट तक पहुंच सकते हैं जिन्हें वे खोज रहे हैं. इस कोडलैब के एक्सटेंशन के तौर पर, प्रॉडक्ट कैटलॉग के सिस्टम को बेहतर बनाएं, ताकि लोग मेन्यू में ड्रिंक और अलग-अलग पीने की चीज़ों को देख सकें या शाकाहारियों के विकल्प तय कर सकें.

4. शॉपिंग कार्ट

कोडलैब के इस सेक्शन में, हम पिछले सेक्शन में शॉपिंग कार्ट की सुविधाओं को तैयार करेंगे. इससे हमें उपलब्ध प्रॉडक्ट को ब्राउज़ करने में मदद मिलेगी.

इसके अलावा, मुख्य शॉपिंग कार्ट अनुभव उपयोगकर्ताओं को कार्ट में आइटम जोड़ने, कार्ट से आइटम हटाने, कार्ट में हर आइटम की संख्या पर नज़र रखने, और कार्ट में मौजूद आइटम की समीक्षा करने की सुविधा देता है.

शॉपिंग कार्ट की स्थिति पर नज़र रखने का मतलब है कि हमें वेब ऐप्लिकेशन पर डेटा बनाए रखना होगा. आसानी से एक्सपेरिमेंट करने और डिप्लॉयमेंट के लिए, डेटा को सेव रखने के लिए हम Google Cloud Platform में Google Datastore का इस्तेमाल करेंगे. उपयोगकर्ता और कारोबार के बीच बातचीत आईडी स्थिर रहता है, इसलिए हम इसका इस्तेमाल उपयोगकर्ताओं को शॉपिंग कार्ट आइटम से जोड़ने के लिए कर सकते हैं.

चलिए, Google Datastore के साथ कनेक्ट करके और बातचीत आईडी दिखने पर, उसमें बदलाव करके शुरुआत करते हैं.

Datastore से कनेक्ट करना

शॉपिंग कार्ट से किसी भी इंटरैक्शन के पूरा होने पर, हम Google Datastore से कनेक्ट करेंगे. उदाहरण के लिए, जब कोई उपयोगकर्ता किसी आइटम को जोड़ रहा हो या मिटा रहा हो. Google Datastore के साथ इंटरैक्ट करने के लिए, इस क्लाइंट लाइब्रेरी का इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, आधिकारिक दस्तावेज़ देखें.

नीचे दिया गया स्निपेट शॉपिंग कार्ट को अपडेट करने के लिए एक फ़ंक्शन तय करता है. फ़ंक्शन ये इनपुट लेता है: conversation_id और message. message में JSON शामिल है, जो उपयोगकर्ता की कार्रवाई के बारे में बताता है. यह जानकारी, प्रॉडक्ट कैटलॉग दिखाने वाले आपके कैरसेल में पहले से मौजूद होती है. यह फ़ंक्शन, Google Datastore क्लाइंट बनाता है और तुरंत ShoppingCart इकाई को फ़ेच करता है, जहां बातचीत आईडी कुंजी ही होती है.

निम्न फ़ंक्शन को अपनी views.py फ़ाइल में कॉपी करें. हम आने वाले सेक्शन में इस बारे में ज़्यादा जानकारी उपलब्ध कराएंगे.

bonjourmeal-codelab/step-2/bopis/views.py

from google.oauth2 import service_account
from google.cloud import datastore

def update_shopping_cart(conversation_id, message):
        credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_LOCATION)

        client = datastore.Client(credentials=credentials)
        key = client.key('ShoppingCart', conversation_id)
        entity = datastore.Entity(key=key)
        result = client.get(key)
        
        # TODO: Add logic to add and remove items from cart
        
        entity.update(result)
        client.put(entity)

कार्ट में किसी आइटम को जोड़ने के लिए, इस फ़ंक्शन को बढ़ाएं.

कार्ट में आइटम जोड़ना

जब उपयोगकर्ता, प्रॉडक्ट कैरसेल से सुझाई गई आइटम जोड़ें कार्रवाई पर टैप करता है, तो postbackData में JSON शामिल होता है, जिसमें उपयोगकर्ता की कार्रवाई के बारे में जानकारी देता है. JSON शब्दकोश में दो कुंजियां होती हैं, "कार्रवाई" और "item_name" और यह JSON डिक्शनरी आपके वेबहुक पर भेज दी जाएगी. "item_name" फ़ील्ड एक यूनीक आइडेंटिफ़ायर है, जोinventory.json में मौजूद आइटम से जुड़ा होता है.

जब हमें कार्ट कमांड और कार्ट आइटम को मैसेज से पार्स कर दिया जाता है, तो हम आइटम जोड़ने के लिए कंडिशनल स्टेटमेंट लिख सकते हैं. यहां पर विचार करने के लिए कुछ किनारे के मामले दिए गए हैं कि क्या Datastore ने कभी भी बातचीत आईडी नहीं देखा है या शॉपिंग कार्ट को यह आइटम पहली बार मिल रहा है. ऊपर बताए गए update_shopping_cart फ़ंक्शन का ही एक एक्सटेंशन है. इस बदलाव से शॉपिंग कार्ट में एक आइटम जुड़ जाता है, जिसे Google Datastore में रखता है.

निम्न स्निपेट आपके views.py में जोड़े गए पिछले फ़ंक्शन का एक्सटेंशन है. आप चाहें, तो यह अंतर जोड़ें या स्निपेट को कॉपी करके, update_shopping_cart फ़ंक्शन के मौजूदा वर्शन को बदलें.

bongeourmeal-codelab/step-2bopis/views.py

def update_shopping_cart(conversation_id, message):
    credentials = service_account.Credentials.from_service_account_file(
      SERVICE_ACCOUNT_LOCATION)
    inventory = get_inventory_data()

    cart_request = json.loads(message)
    cart_cmd = cart_request["action"]
    cart_item = cart_request["item_name"]

    item_name = inventory['food'][int(cart_item)]['name']

    client = datastore.Client(credentials=credentials)
    key = client.key('ShoppingCart', conversation_id)
    entity = datastore.Entity(key=key)
    result = client.get(key)

    if result is None:
        if cart_cmd == CMD_ADD_ITEM:
            entity.update({
                item_name: 1
            })

    else:
        if cart_cmd == CMD_ADD_ITEM:
            if result.get(item_name) is None:
                result[item_name] = 1
            else:
                result[item_name] = result[item_name] + 1

        entity.update(result)
    client.put(entity)

इस फ़ंक्शन को बाद में ऐसी स्थिति में काम करने के लिए इस्तेमाल किया जाएगा जहां cart_cmd में 'del-item' स्ट्रिंग शामिल हो CMD_DEL_ITEM में परिभाषित किया गया है.

दोनों को एक साथ जोड़ना

route_message फ़ंक्शन में प्लंबिंग जोड़ना न भूलें. इससे अगर आपको कार्ट में किसी आइटम को जोड़ने का मैसेज मिलता है, तो update_shopping_cart फ़ंक्शन को कॉल किया जाता है. आपको पूरे कोडलैब में इस्तेमाल किए जाने वाले कन्वेंशन का इस्तेमाल करके, आइटम जोड़ने के लिए कॉन्सटेंट तय करना होगा.

bongeourmeal-codelab/step-2bopis/views.py

...

CMD_DEL_ITEM = 'del-item'

...

def route_message(message, conversation_id):
    '''
    Routes the message received from the user to create a response.

    Args:
        message (str): The message text received from the user.
        conversation_id (str): The unique id for this user and agent.
    '''
    normalized_message = message.lower()

    if normalized_message == CMD_RICH_CARD:
        send_rich_card(conversation_id)
    elif normalized_message == CMD_CAROUSEL_CARD:
        send_carousel(conversation_id)
    elif normalized_message == CMD_SUGGESTIONS:
        send_message_with_suggestions(conversation_id)
    elif normalized_message == CMD_BUSINESS_HOURS_INQUIRY:
        send_message_with_business_hours(conversation_id)
    elif normalized_message == CMD_ONLINE_SHOPPING_INQUIRY:
        send_online_shopping_info_message(conversation_id)
    elif normalized_message == CMD_SHOW_PRODUCT_CATEGORY:
        send_product_catalog(conversation_id)
    elif CMD_ADD_ITEM in normalized_message or CMD_DEL_ITEM in normalized_message:
       update_shopping_cart(conversation_id, message)
    else:
        echo_message(message, conversation_id)

...

फ़िलहाल, हमारे पास आइटमों को शॉपिंग कार्ट में जोड़ने की सुविधा है. अगर आपने अपने बदलावों को Google App Engine में डिप्लॉय किया है, तो आपको GCP कंसोल में Google Datastore डैशबोर्ड में शॉपिंग कार्ट के बदलाव दिखेंगे. Google Datastore कंसोल के नीचे दिया गया स्क्रीनशॉट देखें. यहां एक इकाई का नाम बातचीत आईडी पर दिया जाता है. इसके बाद, इन्वेंट्री आइटम और शॉपिंग कार्ट में मौजूद आइटम की संख्या के साथ कुछ संबंध होते हैं.

619dc18a8136ea69.png

अगले सेक्शन में, हम शॉपिंग कार्ट में आइटम को लिस्ट करने का तरीका बताएंगे. शॉपिंग कार्ट समीक्षा प्रणाली में हमें कार्ट के सभी आइटम, उनकी मात्रा, और कार्ट से कोई आइटम निकालने का विकल्प दिखना चाहिए.

कार्ट में मौजूद आइटम की समीक्षा करना

शॉपिंग कार्ट में आइटम को सूची में दिखाना ही शॉपिंग कार्ट की स्थिति को समझ सकता है और यह जान सकता है कि हम किन आइटम को हटा सकते हैं.

चलिए, सबसे पहले "यह रहा आपका शॉपिंग कार्ट:" जैसा एक आसान मैसेज भेजते हैं. उसके बाद एक और मैसेज भेजते हैं, जिसमें एक रिच कार्ड कैरसेल के साथ, "एक को हटाएं" के लिए सुझाए गए जवाबों के साथ लिखा होता है या "एक जोड़ें" शामिल है. रिच कार्ड कैरसेल में, कार्ट में सेव किए गए आइटम की संख्या भी शामिल होनी चाहिए.

अपना फ़ंक्शन लिखने से पहले इस बात का ध्यान रखें: अगर शॉपिंग कार्ट में सिर्फ़ एक ही तरह का आइटम है, तो हम उसे कैरसेल के रूप में रेंडर नहीं कर सकते. रिच कार्ड के कैरसेल में कम से कम दो कार्ड होने चाहिए. वहीं दूसरी तरफ़, अगर कार्ट में कोई आइटम नहीं है, तो हम आपको एक सामान्य मैसेज दिखाना चाहते हैं, जिसमें लिखा है कि कार्ट खाली है.

इसे ध्यान में रखते हुए, आइए send_shopping_cart नाम का एक फ़ंक्शन तय करते हैं. यह फ़ंक्शन Google Datastore से कनेक्ट होता है और बातचीत आईडी के आधार पर ShoppingCart इकाई का अनुरोध करता है. ऐसा होने के बाद, हम get_inventory_data फ़ंक्शन को कॉल करेंगे और शॉपिंग कार्ट की स्थिति की रिपोर्ट देने के लिए एक रिच कार्ड कैरसेल का इस्तेमाल करेंगे. हमें किसी प्रॉडक्ट का आईडी नाम से भी लेना होगा और हम उस वैल्यू का पता लगाने के लिए, Google Datastore को देखने के लिए एक फ़ंक्शन की घोषणा कर सकते हैं. कैरसेल बनाया जा रहा है, इसलिए हम आइटम मिटाने या प्रॉडक्ट आईडी की मदद से आइटम जोड़ने के लिए, सुझाए गए जवाब जोड़ सकते हैं. नीचे दिया गया स्निपेट ये सभी कार्रवाइयां करता है. कोड को views.py में कहीं भी कॉपी करें.

bonjourmeal-codelab/step-2/bopis/views.py

...
def get_id_by_product_name(product_name):
  inventory = get_inventory_data()
  for item in inventory['food']:
    if item['name'] == product_name:
      return int(item['id'])
  return False


def send_shopping_cart(conversation_id):
  credentials = service_account.Credentials.from_service_account_file(
      SERVICE_ACCOUNT_LOCATION)

  # Retrieve the inventory data
  inventory = get_inventory_data()

  # Pull the data from Google Datastore
  client = datastore.Client(credentials=credentials)
  key = client.key('ShoppingCart', conversation_id)
  result = client.get(key)

  shopping_cart_suggestions = [
      BusinessMessagesSuggestion(
          reply=BusinessMessagesSuggestedReply(
              text='See total price', postbackData='show-cart-price')),
      BusinessMessagesSuggestion(
          reply=BusinessMessagesSuggestedReply(
              text='Empty the cart', postbackData='empty-cart')),
      BusinessMessagesSuggestion(
          reply=BusinessMessagesSuggestedReply(
              text='See the menu', postbackData=CMD_SHOW_PRODUCT_CATALOG)),
  ]

  if result is None or len(result.items()) == 0:
    message_obj = BusinessMessagesMessage(
        messageId=str(uuid.uuid4().int),
        representative=BOT_REPRESENTATIVE,
        text='There are no items in your shopping cart.',
        suggestions=shopping_cart_suggestions)

    send_message(message_obj, conversation_id)
  elif len(result.items()) == 1:

    for product_name, quantity in result.items():
      product_id = get_id_by_product_name(product_name)

      fallback_text = ('You have one type of item in the shopping cart')

      rich_card = BusinessMessagesRichCard(
          standaloneCard=BusinessMessagesStandaloneCard(
              cardContent=BusinessMessagesCardContent(
                  title=product_name,
                  description=f'{quantity} in cart.',
                  suggestions=[
                      BusinessMessagesSuggestion(
                          reply=BusinessMessagesSuggestedReply(
                              text='Remove one',
                              postbackData='{'+f'"action":"{CMD_DEL_ITEM}","item_name":"{product_id}"'+'}'))
                  ],
                  media=BusinessMessagesMedia(
                      height=BusinessMessagesMedia.HeightValueValuesEnum.MEDIUM,
                      contentInfo=BusinessMessagesContentInfo(
                          fileUrl=inventory['food'][product_id]
                          ['image_url'],
                          forceRefresh=False)))))

      message_obj = BusinessMessagesMessage(
          messageId=str(uuid.uuid4().int),
          representative=BOT_REPRESENTATIVE,
          richCard=rich_card,
          suggestions=shopping_cart_suggestions,
          fallback=fallback_text)

      send_message(message_obj, conversation_id)
  else:
    cart_carousel_items = []

    # Iterate through the cart and generate a carousel of items
    for product_name, quantity in result.items():
      product_id = get_id_by_product_name(product_name)

      cart_carousel_items.append(
          BusinessMessagesCardContent(
              title=product_name,
              description=f'{quantity} in cart.',
              suggestions=[
                  BusinessMessagesSuggestion(
                      reply=BusinessMessagesSuggestedReply(
                          text='Remove one',
                          postbackData='{'+f'"action":"{CMD_DEL_ITEM}","item_name":"{product_id}"'+'}'))
              ],
              media=BusinessMessagesMedia(
                  height=BusinessMessagesMedia.HeightValueValuesEnum.MEDIUM,
                  contentInfo=BusinessMessagesContentInfo(
                      fileUrl=inventory['food'][product_id]
                      ['image_url'],
                      forceRefresh=False))))

    rich_card = BusinessMessagesRichCard(
        carouselCard=BusinessMessagesCarouselCard(
            cardContents=cart_carousel_items,
            cardWidth=BusinessMessagesCarouselCard.CardWidthValueValuesEnum
            .MEDIUM))

    fallback_text = ''

    # Construct a fallback text for devices that do not support carousels
    for card_content in rich_card.carouselCard.cardContents:
      fallback_text += (
          card_content.title + '\n\n' + card_content.description + '\n\n' +
          card_content.media.contentInfo.fileUrl +
          '\n---------------------------------------------\n\n')

    message_obj = BusinessMessagesMessage(
        messageId=str(uuid.uuid4().int),
        representative=BOT_REPRESENTATIVE,
        richCard=rich_card,
        suggestions=shopping_cart_suggestions,
        fallback=fallback_text,
    )

    send_message(message_obj, conversation_id)

...

पक्का करें कि आपने views.py में सबसे ऊपर CMD_SHOW_CART पहले से तय कर दिया है और अगर उपयोगकर्ता 'कार्ट दिखाएं' वाला कोई मैसेज भेजता है, तो send_shopping_cart को कॉल करें.

bonjourmeal-codelab/step-2/bopis/views.py

...
def route_message(message, conversation_id):
    '''
    Routes the message received from the user to create a response.

    Args:
        message (str): The message text received from the user.
        conversation_id (str): The unique id for this user and agent.
    '''
    normalized_message = message.lower()

    if normalized_message == CMD_RICH_CARD:
        send_rich_card(conversation_id)
    elif normalized_message == CMD_CAROUSEL_CARD:
        send_carousel(conversation_id)
    elif normalized_message == CMD_SUGGESTIONS:
        send_message_with_suggestions(conversation_id)
    elif normalized_message == CMD_BUSINESS_HOURS_INQUIRY:
        send_message_with_business_hours(conversation_id)
    elif normalized_message == CMD_ONLINE_SHOPPING_INQUIRY:
        send_online_shopping_info_message(conversation_id)
    elif normalized_message == CMD_SHOW_PRODUCT_CATEGORY:
        send_product_catalog(conversation_id)
    elif CMD_ADD_ITEM in normalized_message or CMD_DEL_ITEM in normalized_message:
        update_shopping_cart(conversation_id, message)
    elif normalized_message == CMD_SHOW_CART:
        send_shopping_cart(conversation_id)
    else:
        echo_message(message, conversation_id)
...

34801776a97056ac.png

send_shopping_cart फ़ंक्शन में बताए गए लॉजिक के आधार पर, जब आप 'कार्ट दिखाएं' टाइप करेंगे, तो हमें या तो कार्ट में कुछ नहीं है, यह बताने वाला मैसेज, कार्ट में एक आइटम दिखाने वाला रिच कार्ड या कई आइटम दिखाने वाले कार्ड का कैरसेल मिलेगा. इसके अलावा, हमें तीन जवाब सुझाए गए हैं: "कुल कीमत देखें", "कार्ट खाली करें" और "मेन्यू देखें" लिखा होता है.

ऊपर दिए गए कोड बदलावों को डिप्लॉय करके यह जांच करें कि आपका शॉपिंग कार्ट उन आइटम को ट्रैक कर रहा है जिन्हें आपने जोड़ा है. साथ ही, ऊपर स्क्रीनशॉट में दिखाए गए तरीके से बातचीत वाले प्लैटफ़ॉर्म से कार्ट की समीक्षा कर सकते हैं. इस कमांड की मदद से, बदलावों को डिप्लॉय किया जा सकता है. ऐसा करने के लिए, आपको चरण-2 की उस डायरेक्ट्री में बदलाव करना होगा जहां बदलाव जोड़े जा रहे हैं.

$ gcloud app deploy

हम "कुल किराया देखें" विकल्प सुविधा को कार्ट से हटाने की सुविधा बनाने के बाद, अगले सेक्शन में. get_cart_price फ़ंक्शन, "शॉपिंग कार्ट देखें" की तरह काम करेगा सुविधा को इस तरह से इस्तेमाल करते हैं कि यह शॉपिंग कार्ट की कुल कीमत के बारे में जानने के लिए, Datastore में इन्वेंट्री.json फ़ाइल के डेटा को क्रॉस-रेफ़रंस करेगा. यह कोडलैब के अगले हिस्से में काम आएगा जहां हम पेमेंट के साथ काम करते हैं.

कार्ट से आइटम हटाना

आखिर में, हम कार्ट हटाने की सुविधा शुरू करके शॉपिंग कार्ट के व्यवहार को पूरा कर सकते हैं. मौजूदा update_shopping_cart फ़ंक्शन को नीचे दिए गए स्निपेट से बदलें.

borajourmeal-codelab/step-2/ bopis/views.py

def update_shopping_cart(conversation_id, message):
    credentials = service_account.Credentials.from_service_account_file(
      SERVICE_ACCOUNT_LOCATION)
    inventory = get_inventory_data()

    cart_request = json.loads(message)
    cart_cmd = cart_request["action"]
    cart_item = cart_request["item_name"]

    item_name = inventory['food'][int(cart_item)]['name']


    client = datastore.Client(credentials=credentials)
    key = client.key('ShoppingCart', conversation_id)
    entity = datastore.Entity(key=key)
    result = client.get(key)

    if result is None:
        if cart_cmd == CMD_ADD_ITEM:
            entity.update({
                item_name: 1
            })
        elif cart_cmd == CMD_DEL_ITEM:
            # The user is trying to delete an item from an empty cart. Pass and skip
            pass

    else:
        if cart_cmd == CMD_ADD_ITEM:
            if result.get(item_name) is None:
                result[item_name] = 1
            else:
                result[item_name] = result[item_name] + 1

        elif cart_cmd == CMD_DEL_ITEM:
            if result.get(item_name) is None:
                # The user is trying to remove an item that's no in the shopping cart. Pass and skip
                pass
            elif result[item_name] - 1 > 0:
                result[item_name] = result[item_name] - 1
            else:
                del result[item_name]

        entity.update(result)
    client.put(entity)

पुष्टि करने वाला मैसेज भेजना

जब कोई उपयोगकर्ता कार्ट में किसी आइटम को जोड़ता है, तो आपको उसकी कार्रवाई के बारे में बताने और उसके अनुरोध को प्रोसेस करने की पुष्टि करने वाला मैसेज भेजना होगा. इससे न सिर्फ़ उम्मीदें तय करने में मदद मिलती है, बल्कि बातचीत को आगे बढ़ाने में भी मदद मिलती है.

update_shopping_cart फ़ंक्शन को बढ़ाएं, ताकि यह बातचीत आईडी पर मैसेज भेजकर बता सके कि आइटम को जोड़ दिया गया है या हटा दिया गया है. साथ ही, उनके शॉपिंग कार्ट की समीक्षा करने या मेन्यू फिर से देखने के सुझाव भी दे सकता है.

bonjourmeal-codelab/step-2/bopis/views.py

def update_shopping_cart(conversation_id, message):

     # No changes to the function, except appending the following logic
     ...
   
    if cart_cmd == CMD_ADD_ITEM:
        message = 'Great! You\'ve added an item to the cart.'
    else:
        message = 'You\'ve removed an item from the cart.'

    message_obj = BusinessMessagesMessage(
        messageId=str(uuid.uuid4().int),
        representative=BOT_REPRESENTATIVE,
        text=message,
        suggestions=[
            BusinessMessagesSuggestion(
            reply=BusinessMessagesSuggestedReply(
                text='Review shopping cart',
                postbackData=CMD_SHOW_CART)
            ),
            BusinessMessagesSuggestion(
            reply=BusinessMessagesSuggestedReply(
                text='See menu again',
                postbackData=CMD_SHOW_PRODUCT_CATALOG)
            ),
            ])
    send_message(message_obj, conversation_id)

905a1f3d89893ba0.png

बस इतना ही! सभी सुविधाओं वाला शॉपिंग कार्ट अनुभव, जो उपयोगकर्ता को आइटम जोड़ने, आइटम हटाने, और कार्ट में आइटम की समीक्षा करने की सुविधा देता है.

अब अगर आपको Business Messages की बातचीत में शॉपिंग कार्ट की सुविधा देखनी है, तो अपने एजेंट से बात करने के लिए यह ऐप्लिकेशन डिप्लॉय करें. ऐसा करने के लिए, चरण-2 की डायरेक्ट्री में इस निर्देश को चलाया जा सकता है.

$ gcloud app deploy

5. पेमेंट पाने की तैयारी की जा रही है

सीरीज़ के अगले हिस्से में, पेमेंट प्रोसेस करने वाली कंपनी के साथ जुड़ने की तैयारी के लिए, हमें शॉपिंग कार्ट की कीमत जानने का तरीका चाहिए. आइए एक ऐसा फ़ंक्शन बनाएं जो Google Datastore में शॉपिंग कार्ट डेटा को क्रॉस रेफ़र करके, इन्वेंट्री से हर आइटम की कीमत को हासिल करके, और कार्ट में मौजूद हर आइटम की संख्या से कीमत को गुणा करके, हमारे लिए कीमत को फिर से हासिल करता है.

bonjourmeal-codelab/step-2/bopis/views.py

...
def get_cart_price(conversation_id):
    # Pull the data from Google Datastore
    credentials = service_account.Credentials.from_service_account_file(
    SERVICE_ACCOUNT_LOCATION)
    client = datastore.Client(credentials=credentials)
    key = client.key('ShoppingCart', conversation_id)
    entity = datastore.Entity(key=key)
    result = client.get(key)

    # Retrieve the inventory data
    inventory = get_inventory_data()
   
    # Start off with a total of 0 before adding up the total
    total_price = 0

    if len(result.items()) != 0:
      for product_name, quantity in result.items():
        total_price = total_price + float(
            inventory['food'][get_id_by_product_name(product_name)]['price']) * int(quantity)

    return total_price

...

और आखिर में, हम उस फ़ंक्शन का इस्तेमाल कर सकते हैं और उपयोगकर्ता को मैसेज भेज सकते हैं.

bonjourmeal-codelab/step-2/bopis/views.py

...

def send_shopping_cart_total_price(conversation_id):
    cart_price = get_cart_price(conversation_id)

    message_obj = BusinessMessagesMessage(
        messageId=str(uuid.uuid4().int),
        representative=BOT_REPRESENTATIVE,
        suggestions=[],
        text=f'Your cart\'s total price is ${cart_price}.')

    send_message(message_obj, conversation_id)
...

इन सभी को एक साथ जोड़ने के लिए, ऊपर दिए गए लॉजिक को ट्रिगर करने के लिए, route_message फ़ंक्शन और कॉन्सटेंट को अपडेट करें.

bonjourmeal-codelab/step-2/bopis/views.py

...
CMD_GET_CART_PRICE = 'show-cart-price'
...
def route_message(message, conversation_id):
    '''
    Routes the message received from the user to create a response.

    Args:
        message (str): The message text received from the user.
        conversation_id (str): The unique id for this user and agent.
    '''
    normalized_message = message.lower()

    if normalized_message == CMD_RICH_CARD:
        send_rich_card(conversation_id)
    elif normalized_message == CMD_CAROUSEL_CARD:
        send_carousel(conversation_id)
    elif normalized_message == CMD_SUGGESTIONS:
        send_message_with_suggestions(conversation_id)
    elif normalized_message == CMD_BUSINESS_HOURS_INQUIRY:
        send_message_with_business_hours(conversation_id)
    elif normalized_message == CMD_ONLINE_SHOPPING_INQUIRY:
        send_online_shopping_info_message(conversation_id)
    elif normalized_message == CMD_SHOW_PRODUCT_CATEGORY:
        send_product_catalog(conversation_id)
    elif CMD_ADD_ITEM in normalized_message or CMD_DEL_ITEM in normalized_message:
        update_shopping_cart(conversation_id, message)
    elif normalized_message == CMD_SHOW_CART:
        send_shopping_cart(conversation_id)
    elif normalized_message == CMD_GET_CART_PRICE:
        send_shopping_cart_total_price(conversation_id)
    else:
        echo_message(message, conversation_id)
...

यहां कुछ स्क्रीनशॉट दिए गए हैं. इनसे पता चलता है कि ऊपर दिए गए नियम से क्या हासिल होता है:

8feacf94ed0ac6c4.png

जब हम कोडलैब के अगले हिस्से में, पेमेंट प्रोसेस करने वाली कंपनी के साथ इंटिग्रेट करने के लिए तैयार हो जाएंगे, तो हम get_cart_price फ़ंक्शन को कॉल करेंगे, ताकि डेटा को पेमेंट प्रोसेस करने वाली कंपनी के पास भेजा जा सके और पेमेंट की प्रोसेस शुरू की जा सके.

Business Messages की बातचीत में, शॉपिंग कार्ट की इस सुविधा को फिर से आज़माया जा सकता है. इसके लिए, ऐप्लिकेशन को डिप्लॉय करें और अपने एजेंट से बातचीत करें.

$ gcloud app deploy

6. बधाई हो

बधाई हो, आपने Business Messages में शॉपिंग कार्ट इस्तेमाल करने का काम पूरा कर लिया है.

पूरे शॉपिंग कार्ट को खाली करने की सुविधा ऐसी है जिसके बारे में हमने इस कोडलैब में नहीं किया है. अगर आप चाहें, तो "कार्ट खाली करें" को पूरा करने के लिए, ऐप्लिकेशन की अवधि बढ़ाएं सुविधा. आपने जिस सोर्स कोड का क्लोन बनाया है उसके तीसरे चरण में इसका समाधान उपलब्ध है.

आने वाले समय में, हम पेमेंट प्रोसेस करने वाली किसी बाहरी कंपनी के साथ काम करेंगे, ताकि उपयोगकर्ता आपके ब्रैंड के साथ पेमेंट से जुड़ा लेन-देन कर सकें.

एक अच्छा शॉपिंग कार्ट कैसे बनता है?

किसी बातचीत में शॉपिंग कार्ट का अच्छा अनुभव किसी मोबाइल ऐप्लिकेशन या किसी दुकान में मिलने वाला अनुभव है. कोडलैब के इस तरीके में हमने कुछ सुविधाओं के बारे में जाना है. जैसे, आइटम जोड़ना, आइटम हटाना, और कार्ट की कीमत का हिसाब लगाना. आपके पास किसी आइटम को जोड़ने या हटाने के दौरान, किसी भी समय कार्ट में मौजूद सभी आइटम की कीमत देखने का विकल्प होता है. यह सुविधा असल दुनिया के शॉपिंग कार्ट से अलग होती है. इन खास सुविधाओं की मदद से, दर्शकों को बातचीत करने का आपका बेहतरीन अनुभव मिलेगा!

आगे क्या होगा?

जब आप तैयार हों, तब Business Messages में ज़्यादा मुश्किल इंटरैक्शन की सुविधा के बारे में जानने के लिए, यहां दिए गए कुछ विषयों को पढ़ें:

पहचान फ़ाइलें