1. ভূমিকা


শেষ আপডেট: ২০২০-১০-৩০
বিজনেস মেসেজে একটি শপিং কার্ট তৈরি করা!
এটি একটি সিরিজের দ্বিতীয় কোডল্যাব যার লক্ষ্য হল স্টোরে অনলাইনে পিকআপ করে কেনাকাটা করা। অনেক ই-কমার্স যাত্রায়, ব্যবহারকারীদের অর্থপ্রদানকারী গ্রাহকে রূপান্তরিত করার সাফল্যের জন্য একটি শপিং কার্ট গুরুত্বপূর্ণ ভূমিকা পালন করে। শপিং কার্ট আপনার গ্রাহকদের আরও ভালভাবে বোঝার এবং তাদের আগ্রহের অন্যান্য আইটেমগুলির বিষয়ে পরামর্শ দেওয়ার একটি উপায়। এই কোডল্যাবে, আমরা শপিং কার্টের অভিজ্ঞতা তৈরি এবং অ্যাপ্লিকেশনটি গুগল অ্যাপ ইঞ্জিনে স্থাপন করার উপর ফোকাস করব।
একটি ভালো শপিং কার্ট কী হতে পারে?
শপিং কার্ট একটি সফল অনলাইন শপিং অভিজ্ঞতার চাবিকাঠি। দেখা যাচ্ছে, বিজনেস মেসেজ কেবল একজন সম্ভাব্য গ্রাহকের সাথে পণ্যের উপর প্রশ্নোত্তরের সুবিধা প্রদানেই ভালো নয়, বরং এটি কথোপকথনের মধ্যে অর্থপ্রদান সম্পূর্ণ করা পর্যন্ত পুরো শপিং অভিজ্ঞতাকে সহজতর করতে পারে।

একটি ভালো শপিং কার্টের পাশাপাশি, একটি ভালো শপিং অভিজ্ঞতা ব্যবহারকারীদের বিভাগ অনুসারে আইটেম ব্রাউজ করার সুযোগ দেয় এবং ব্যবসা প্রতিষ্ঠানকে ক্রেতার আগ্রহের অন্যান্য পণ্য সুপারিশ করার সুযোগ দেয়। শপিং কার্টে আরও আইটেম যোগ করার পর, ব্যবহারকারী তাদের সম্পূর্ণ কার্ট পর্যালোচনা করতে পারেন এবং চেক আউট করার আগে আইটেমগুলি সরাতে বা আরও আইটেম যোগ করতে সক্ষম হন।
তুমি কী তৈরি করবে
কোডল্যাব সিরিজের এই অংশে, আপনি কাল্পনিক কোম্পানি, বনজোর মিলের জন্য প্রথম অংশে তৈরি ডিজিটাল এজেন্টটি প্রসারিত করতে যাচ্ছেন, যাতে ব্যবহারকারীরা আইটেমগুলির একটি ক্যাটালগ ব্রাউজ করতে পারেন এবং একটি শপিং কার্টে আইটেম যুক্ত করতে পারেন।
এই কোডল্যাবে, আপনার অ্যাপটি
- Business Messages-এর মধ্যে প্রশ্নের একটি ক্যাটালগ দেখান
- ব্যবহারকারীদের আগ্রহ থাকতে পারে এমন আইটেমগুলির পরামর্শ দিন
- শপিং কার্টের বিষয়বস্তু পর্যালোচনা করুন এবং মোট মূল্যের সারসংক্ষেপ তৈরি করুন।

তুমি কি শিখবে
- গুগল ক্লাউড প্ল্যাটফর্মের অ্যাপ ইঞ্জিনে কীভাবে একটি ওয়েব অ্যাপ্লিকেশন স্থাপন করবেন
- শপিং কার্টের অবস্থা বাঁচাতে কীভাবে একটি স্থায়ী স্টোরেজ ব্যবস্থা ব্যবহার করবেন
এই কোডল্যাবটি এই কোডল্যাব সিরিজের প্রথম অংশ থেকে ডিজিটাল এজেন্টকে সম্প্রসারিত করার উপর দৃষ্টি নিবদ্ধ করে।
তোমার যা লাগবে
- একটি GCP প্রকল্প যা Business Messages-এর সাথে ব্যবহারের জন্য নিবন্ধিত এবং অনুমোদিত হয়েছে
- কীভাবে করবেন তার নির্দেশাবলীর জন্য আমাদের ডেভেলপার সাইটটি দেখুন
- আপনার GCP প্রোজেক্টের জন্য তৈরি করা একটি পরিষেবা অ্যাকাউন্ট JSON ক্রেডেনশিয়াল ফাইল
- একটি Android 5+ ডিভাইস অথবা Google Maps অ্যাপ সহ একটি iOS ডিভাইস
- ওয়েব অ্যাপ্লিকেশন প্রোগ্রামিং এর অভিজ্ঞতা
- একটি ইন্টারনেট সংযোগ!
2. সেট আপ করা
এই কোডল্যাব ধরে নিচ্ছে যে আপনি আপনার প্রথম এজেন্ট তৈরি করেছেন এবং কোডল্যাবের প্রথম অংশ সম্পন্ন করেছেন। তাই, আমরা বিজনেস মেসেজ এবং বিজনেস কমিউনিকেশন API সক্রিয় করার, পরিষেবা অ্যাকাউন্ট কী তৈরি করার, একটি অ্যাপ্লিকেশন স্থাপন করার, অথবা বিজনেস কমিউনিকেশন কনসোলে আপনার ওয়েবহুক সেট আপ করার মূল বিষয়গুলি নিয়ে আলোচনা করব না। তা সত্ত্বেও, আমরা একটি নমুনা অ্যাপ্লিকেশন ক্লোন করব যাতে নিশ্চিত করা যায় যে আপনার অ্যাপ্লিকেশনটি আমরা যা তৈরি করছি তার সাথে সামঞ্জস্যপূর্ণ, এবং আমরা গুগল ক্লাউড প্ল্যাটফর্মে ডেটাস্টোরের API সক্ষম করব যাতে শপিং কার্ট সম্পর্কিত ডেটা ধরে রাখা যায়।
GitHub থেকে অ্যাপ্লিকেশন ক্লোন করা
একটি টার্মিনালে, নিম্নলিখিত কমান্ডটি ব্যবহার করে আপনার প্রকল্পের কার্যকরী ডিরেক্টরিতে জ্যাঙ্গো ইকো বট নমুনা ক্লোন করুন:
$ 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
গুগল ডেটাস্টোর এপিআই সক্ষম করুন
এই কোডল্যাবের ১ম অংশে, আপনি Business Messages API, Business communications API এবং Cloud Build API সক্ষম করেছেন।
এই কোডল্যাবের জন্য, যেহেতু আমরা গুগল ডেটাস্টোরের সাথে কাজ করব, তাই আমাদের এই APIটিও সক্ষম করতে হবে:
- গুগল ক্লাউড কনসোলে গুগল ডেটাস্টোর এপিআই খুলুন।
- নিশ্চিত করুন যে আপনি সঠিক GCP প্রকল্পের সাথে কাজ করছেন।
- সক্রিয় করুন ক্লিক করুন।
নমুনা আবেদন স্থাপন করা
টার্মিনালে, নমুনার ধাপ-২ ডিরেক্টরিতে যান।
নমুনা স্থাপনের জন্য টার্মিনালে নিম্নলিখিত কমান্ডগুলি চালান:
$ gcloud config set project PROJECT_ID*
$ gcloud app deploy
- PROJECT_ID হল সেই প্রকল্পের আইডি যা আপনি API গুলিতে নিবন্ধন করতে ব্যবহার করেছিলেন।
শেষ কমান্ডের আউটপুটে ডিপ্লয় করা অ্যাপ্লিকেশনের URL টি লক্ষ্য করুন:
Deployed service [default] to [https://PROJECT_ID.appspot.com]
আপনি যে কোডটি ব্যবহার করেছেন তাতে Business Messages থেকে বার্তা গ্রহণের জন্য একটি ওয়েবহুক সহ একটি ওয়েব অ্যাপ্লিকেশন রয়েছে। কোডল্যাবের প্রথম অংশ থেকে আমরা যা কিছু করেছি তার সবকিছুই এতে রয়েছে। যদি আপনি ইতিমধ্যে এটি না করে থাকেন, তাহলে অনুগ্রহ করে আপনার ওয়েবহুক কনফিগার করুন ।
এই অ্যাপ্লিকেশনটি কিছু সাধারণ প্রশ্নের উত্তর দেবে, যেমন Bonjour Meal-এর ব্যবসার সময় সম্পর্কে জিজ্ঞাসা করা একজন ব্যবহারকারীর। আপনার মোবাইল ডিভাইসে এটি পরীক্ষা করা উচিত, বিজনেস কমিউনিকেশনস কনসোলের এজেন্ট তথ্য থেকে আপনি যে পরীক্ষামূলক URLগুলি পেতে পারেন তার মাধ্যমে। পরীক্ষামূলক URLগুলি আপনার মোবাইল ডিভাইসে বিজনেস মেসেজ অভিজ্ঞতা চালু করবে এবং আপনি সেখানে আপনার এজেন্টের সাথে যোগাযোগ শুরু করতে পারবেন।
৩. পণ্য ক্যাটালগ
একটি ইনভেন্টরি সিস্টেম
বেশিরভাগ ক্ষেত্রে, আপনি একটি অভ্যন্তরীণ API এর মাধ্যমে একটি ব্র্যান্ডের ইনভেন্টরির সাথে সরাসরি সংহত করতে পারেন। অন্যান্য ক্ষেত্রে, আপনি একটি ওয়েব পৃষ্ঠা স্ক্র্যাপ করতে পারেন অথবা আপনার নিজস্ব ইনভেন্টরি ট্র্যাকিং সিস্টেম তৈরি করতে পারেন। আমাদের লক্ষ্য একটি ইনভেন্টরি সিস্টেম তৈরি করা নয়; আমরা আমাদের এজেন্টের জন্য ছবি এবং পণ্যের তথ্য ধারণকারী একটি সাধারণ স্ট্যাটিক ফাইল ব্যবহার করব। এই বিভাগে, আমরা এই স্ট্যাটিক ফাইল থেকে তথ্য সংগ্রহ করব, সেই তথ্য কথোপকথনে তুলে ধরব এবং ব্যবহারকারীকে শপিং কার্টে যোগ করার জন্য উপলব্ধ আইটেমগুলি ব্রাউজ করার অনুমতি দেব।
স্ট্যাটিক ইনভেন্টরি ফাইলটি দেখতে এরকম:
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
}
]
}
এই ফাইলটি পড়ার জন্য পাইথন অ্যাপ্লিকেশনটি ব্যবহার করা যাক!
আমাদের মজুদ থেকে পড়া
ইনভেন্টরিটি হল "inventory.json" নামক একটি স্ট্যাটিক ফাইল যা ./resources ডিরেক্টরিতে পাওয়া যায়। JSON ফাইলের বিষয়বস্তু পড়ার জন্য এবং তারপর এটি কথোপকথনে উপস্থাপন করার জন্য আমাদের views.py তে কিছু পাইথন লজিক যোগ করতে হবে। আসুন একটি ফাংশন তৈরি করি যা JSON ফাইল থেকে ডেটা পড়ে এবং উপলব্ধ পণ্যের তালিকা ফেরত দেয়।
এই ফাংশনের সংজ্ঞাটি views.py-এর যেকোনো জায়গায় স্থাপন করা যেতে পারে।
bonjourmeal-codelab/step-2/bopis/views.py
...
def get_inventory_data():
f = open(INVENTORY_FILE)
inventory = json.load(f)
return inventory
...
এর ফলে আমাদের মজুদ থেকে তথ্য পড়ার জন্য যা প্রয়োজন তা পাওয়া উচিত। এখন আমাদের এই পণ্যের তথ্য আলোচনায় তুলে ধরার একটি উপায় প্রয়োজন।
পণ্যের ক্যাটালগের উপরিভাগ তৈরি করা
এই কোডল্যাবের সহজতার জন্য, আমাদের কাছে একটি সাধারণ পণ্য ক্যাটালগ রয়েছে যা একটি একক রিচ কার্ড ক্যারোজেলের মাধ্যমে ব্যবসায়িক বার্তা কথোপকথনে সমস্ত ইনভেন্টরি আইটেম উপস্থাপন করে।
পণ্য ক্যাটালগ দেখার জন্য, আমরা একটি প্রস্তাবিত উত্তর তৈরি করতে যাচ্ছি যার মধ্যে "Show Menu" এবং postbackData " show-product-catalog " লেখা থাকবে। ব্যবহারকারীরা যখন প্রস্তাবিত উত্তরে ট্যাপ করবেন এবং আপনার ওয়েব অ্যাপ্লিকেশন পোস্টব্যাক ডেটা পাবে, তখন আমরা রিচ কার্ড ক্যারোজেল পাঠাবো। views.py এর উপরে এই প্রস্তাবিত উত্তরের জন্য একটি নতুন ধ্রুবক যোগ করা যাক।
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" বার্তাটি পাঠান এবং আপনি এইরকম দেখতে পণ্যগুলির একটি ক্যারোজেল দেখতে পাবেন।

যদি আপনি "আইটেম যোগ করুন" এ ট্যাপ করেন, তাহলে আসলে কিছুই ঘটে না, কেবল এজেন্ট প্রস্তাবিত উত্তর থেকে পোস্টব্যাক ডেটা প্রতিধ্বনিত করে। পরবর্তী বিভাগে, আমরা পণ্য ক্যাটালগ ব্যবহার করব এবং শপিং কার্ট তৈরি করতে এটি ব্যবহার করব যেখানে আইটেমটি যোগ করা হবে।
আপনার তৈরি করা পণ্যের ক্যাটালগটি বিভিন্ন উপায়ে প্রসারিত করা যেতে পারে। আপনার কাছে বিভিন্ন পানীয় মেনু বিকল্প, অথবা নিরামিষ বিকল্প থাকতে পারে। ক্যারোসেল বা সাজেশন চিপ ব্যবহার করা ব্যবহারকারীদের মেনু বিকল্পগুলির মধ্য দিয়ে তাদের পছন্দের পণ্যগুলির একটি সেটে পৌঁছানোর একটি দুর্দান্ত উপায়। এই কোডল্যাবের একটি এক্সটেনশন হিসাবে, পণ্য ক্যাটালগ সিস্টেমটি প্রসারিত করার চেষ্টা করুন যাতে ব্যবহারকারী মেনুতে খাবার থেকে আলাদাভাবে পানীয় দেখতে পারেন, অথবা এমনকি নিরামিষ বিকল্পগুলি নির্দিষ্ট করতে সক্ষম হন।
৪. শপিং কার্ট
কোডল্যাবের এই বিভাগে, আমরা পূর্ববর্তী বিভাগ থেকে শপিং কার্টের কার্যকারিতা তৈরি করব যা আমাদের উপলব্ধ পণ্যগুলি ব্রাউজ করার সুযোগ দেয়।
অনেক কিছুর মধ্যে, মূল শপিং কার্ট অভিজ্ঞতা ব্যবহারকারীদের কার্টে আইটেম যোগ করতে, কার্ট থেকে আইটেম সরাতে, কার্টে প্রতিটি আইটেমের সংখ্যা ট্র্যাক রাখতে এবং কার্টে আইটেম পর্যালোচনা করতে দেয়।
শপিং কার্টের অবস্থা ট্র্যাক করার অর্থ হল আমাদের ওয়েব অ্যাপ্লিকেশনে ডেটা ধরে রাখতে হবে। পরীক্ষা-নিরীক্ষা এবং স্থাপনার সহজতার জন্য, আমরা ডেটা ধরে রাখতে Google Cloud Platform-এ Google Datastore ব্যবহার করব। ব্যবহারকারী এবং ব্যবসার মধ্যে কথোপকথন আইডি স্থির থাকে, তাই আমরা ব্যবহারকারীদের শপিং কার্ট আইটেমগুলির সাথে যুক্ত করতে এটি ব্যবহার করতে পারি।
চলুন শুরু করি গুগল ডেটাস্টোরের সাথে সংযোগ স্থাপন করে এবং কথোপকথন আইডিটি দেখা মাত্রই তা ধরে রাখি।
ডেটাস্টোরের সাথে সংযোগ স্থাপন করা হচ্ছে
যখনই শপিং কার্টের সাথে কোনও ইন্টারঅ্যাকশন সম্পাদিত হবে, উদাহরণস্বরূপ, যখন কোনও ব্যবহারকারী কোনও আইটেম যোগ করছেন বা মুছে ফেলছেন, তখন আমরা Google Datastore-এর সাথে সংযোগ স্থাপন করব। Google Datastore-এর সাথে ইন্টারঅ্যাক্ট করার জন্য এই ক্লায়েন্ট লাইব্রেরি ব্যবহার সম্পর্কে আপনি অফিসিয়াল ডকুমেন্টেশনে আরও জানতে পারবেন।
নিম্নলিখিত স্নিপেটটি শপিং কার্ট আপডেট করার জন্য একটি ফাংশন সংজ্ঞায়িত করে। ফাংশনটি নিম্নলিখিত ইনপুট নেয়: conversation_id এবং message . message এ JSON থাকে যা ব্যবহারকারী কী পদক্ষেপ নিতে চান তা বর্ণনা করে, যা ইতিমধ্যেই আপনার ক্যারোজেলে পণ্য ক্যাটালগ প্রদর্শন করে। ফাংশনটি একটি Google Datastore ক্লায়েন্ট তৈরি করে এবং অবিলম্বে একটি ShoppingCart সত্তা আনে, যেখানে কী হল কথোপকথন ID।
নিচের ফাংশনটি আপনার 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)
কার্টে একটি আইটেম যোগ করার জন্য এই ফাংশনটি প্রসারিত করা যাক।
কার্টে আইটেম যোগ করা হচ্ছে
যখন ব্যবহারকারী পণ্য ক্যারোজেল থেকে প্রস্তাবিত একটি আইটেম যোগ করার পদক্ষেপে ট্যাপ করেন, তখন পোস্টব্যাকডেটাতে JSON থাকে যা ব্যবহারকারী যে পদক্ষেপ নিতে চান তা বর্ণনা করে। JSON অভিধানে দুটি কী রয়েছে, "অ্যাকশন" এবং "আইটেম_নাম" এবং এই JSON অভিধানটি আপনার ওয়েবহুকে পাঠানো হয়। "আইটেম_নাম" ক্ষেত্রটি হল অনন্য শনাক্তকারী যা inventory.json-এ থাকা আইটেমের সাথে সম্পর্কিত।
একবার আমাদের কাছে কার্ট কমান্ড এবং বার্তা থেকে কার্ট আইটেম পার্স হয়ে গেলে, আমরা আইটেমটি যোগ করার জন্য শর্তসাপেক্ষ বিবৃতি লিখতে পারি। এখানে কিছু গুরুত্বপূর্ণ বিষয় বিবেচনা করতে হবে যদি ডেটাস্টোর কখনও কথোপকথন আইডি না দেখে থাকে অথবা শপিং কার্ট যদি প্রথমবারের মতো এই আইটেমটি গ্রহণ করে। উপরে সংজ্ঞায়িত update_shopping_cart কার্যকারিতার একটি এক্সটেনশন নিচে দেওয়া হল। এই পরিবর্তনটি শপিং কার্টে একটি আইটেম যোগ করে যা Google Datastore দ্বারা স্থায়ী থাকে।
নিচের স্নিপেটটি আপনার views.py তে যোগ করা পূর্ববর্তী ফাংশনের একটি এক্সটেনশন। পার্থক্যটি যোগ করতে দ্বিধা করবেন না, অথবা স্নিপেটটি কপি করে update_shopping_cart ফাংশনের বিদ্যমান সংস্করণটি প্রতিস্থাপন করতে দ্বিধা করবেন না।
bonjourmeal-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 CMD_DEL_ITEM এ সংজ্ঞায়িত 'del-item' স্ট্রিং থাকে।
একসাথে বেঁধে রাখা
route_message ফাংশনে প্লাম্বিং যোগ করতে ভুলবেন না যাতে আপনি যদি কার্টে কোনও আইটেম যোগ করার জন্য একটি বার্তা পান যা update_shopping_cart ফাংশন নামে পরিচিত। কোডল্যাব জুড়ে আমরা যে কনভেনশন ব্যবহার করি তা ব্যবহার করে আইটেম যোগ করার জন্য আপনাকে একটি ধ্রুবকও নির্ধারণ করতে হবে।
bonjourmeal-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 কনসোলের নীচের স্ক্রিনশটটি দেখুন, একটি একক সত্তা রয়েছে যা Conversation ID-এর নাম অনুসারে নামকরণ করা হয়েছে এবং তারপরে শপিং কার্টে থাকা ইনভেন্টরি আইটেম এবং সেই আইটেমগুলির পরিমাণের সাথে কিছু সম্পর্ক রয়েছে।

পরবর্তী বিভাগে, আমরা শপিং কার্টে থাকা আইটেমগুলির তালিকা তৈরি করার একটি উপায় তৈরি করব। শপিং কার্ট পর্যালোচনা প্রক্রিয়াটি আমাদের কার্টে থাকা সমস্ত আইটেম, সেই আইটেমগুলির পরিমাণ এবং কার্ট থেকে কোনও আইটেম সরানোর বিকল্প দেখাবে।
কার্টে থাকা জিনিসপত্র পর্যালোচনা করা হচ্ছে
শপিং কার্টে থাকা জিনিসপত্রের তালিকা তৈরি করলেই আমরা শপিং কার্টের অবস্থা বুঝতে পারব এবং কোন জিনিসগুলো আমরা সরিয়ে ফেলতে পারি তা জানতে পারব।
প্রথমে "এই তোমার শপিং কার্ট:" এর মতো একটি বন্ধুত্বপূর্ণ বার্তা পাঠাই, তারপরে আরেকটি বার্তা আসবে যেখানে "একটি সরান" বা "একটি যোগ করুন" এর জন্য প্রস্তাবিত উত্তর সহ একটি রিচ কার্ড ক্যারোজেল থাকবে। রিচ কার্ড ক্যারোজেলে কার্টে সংরক্ষিত আইটেমের পরিমাণও তালিকাভুক্ত করা উচিত।
আমাদের ফাংশনটি লেখার আগে কিছু বিষয় জেনে রাখা উচিত: যদি শপিং কার্টে শুধুমাত্র এক ধরণের আইটেম থাকে, তাহলে আমরা এটিকে ক্যারোজেল হিসেবে রেন্ডার করতে পারব না। রিচ কার্ড ক্যারোজেলে কমপক্ষে দুটি কার্ড থাকতে হবে। অন্যদিকে, যদি কার্টে কোনও আইটেম না থাকে, তাহলে আমরা একটি সহজ বার্তা দিতে চাই যাতে বলা হয় যে কার্টটি খালি।
এই বিষয়টি মাথায় রেখে, আসুন send_shopping_cart নামক একটি ফাংশন সংজ্ঞায়িত করি। এই ফাংশনটি Google Datastore এর সাথে সংযোগ স্থাপন করে এবং Conversation ID এর উপর ভিত্তি করে একটি 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 সংজ্ঞায়িত করা আছে কিনা তা নিশ্চিত করুন এবং ব্যবহারকারী যদি '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)
...

send_shopping_cart ফাংশনে আমরা যে যুক্তি ব্যবহার করেছি তার উপর ভিত্তি করে, যখন আপনি 'show-cart' টাইপ করবেন, তখন আমরা হয় একটি বার্তা পাব যেখানে বলা হবে কার্টে কিছুই নেই, একটি রিচ কার্ড যেখানে কার্টে একটি আইটেম দেখানো হবে, অথবা একাধিক আইটেম দেখানো কার্ডের একটি ক্যারোসেল পাবেন। অতিরিক্তভাবে, আমাদের কাছে তিনটি প্রস্তাবিত উত্তর রয়েছে: "মোট মূল্য দেখুন", "কার্ট খালি করুন" এবং "মেনু দেখুন"।
উপরের কোড পরিবর্তনগুলি ব্যবহার করে পরীক্ষা করুন যে আপনার শপিং কার্ট আপনার যোগ করা আইটেমগুলি ট্র্যাক করছে এবং উপরের স্ক্রিনশটগুলিতে দেখানো কথোপকথনের পৃষ্ঠ থেকে আপনি কার্টটি পর্যালোচনা করতে পারেন। আপনি thep step-2 ডিরেক্টরি থেকে চালানো এই কমান্ডের মাধ্যমে পরিবর্তনগুলি ব্যবহার করতে পারেন যেখানে আপনি আপনার পরিবর্তনগুলি যোগ করছেন।
$ gcloud app deploy
কার্ট থেকে কোনও আইটেম সরানোর কার্যকারিতা তৈরি করার পর আমরা পরবর্তী বিভাগে "মোট মূল্য দেখুন" বৈশিষ্ট্যটি তৈরি করব। get_cart_price ফাংশনটি "শপিং কার্ট দেখুন" বৈশিষ্ট্যের মতোই আচরণ করবে, অর্থাৎ এটি ডেটাস্টোরের ডেটা inventory.json ফাইলের সাথে ক্রস-রেফারেন্স করবে এবং শপিং কার্টের মোট মূল্য তৈরি করবে। কোডল্যাবের পরবর্তী অংশের জন্য এটি কার্যকর হবে যেখানে আমরা পেমেন্টের সাথে একীভূত করব।
কার্ট থেকে জিনিসপত্র সরানো হচ্ছে
অবশেষে, আমরা কার্টটি সরানোর কার্যকারিতা প্রবর্তন করে শপিং কার্টের আচরণটি সম্পূর্ণ করতে পারি। বিদ্যমান update_shopping_cart ফাংশনটি নিম্নলিখিত স্নিপেট দিয়ে প্রতিস্থাপন করুন।
bonjourmeal-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)

এতেই সব ঠিক হয়ে যাবে! একটি সম্পূর্ণ বৈশিষ্ট্যযুক্ত শপিং কার্ট অভিজ্ঞতা যা ব্যবহারকারীকে কার্টে আইটেম যোগ করতে, আইটেম অপসারণ করতে এবং আইটেম পর্যালোচনা করতে সক্ষম করে।
এই মুহুর্তে, যদি আপনি Business Messages কথোপকথনে শপিং কার্টের কার্যকারিতা দেখতে চান, তাহলে আপনার এজেন্টের সাথে যোগাযোগ করার জন্য অ্যাপ্লিকেশনটি ব্যবহার করুন। আপনি ধাপ-২ ডিরেক্টরিতে এই কমান্ডটি চালিয়ে তা করতে পারেন।
$ gcloud app deploy
৫. পেমেন্টের জন্য প্রস্তুতি নেওয়া
সিরিজের পরবর্তী অংশে একটি পেমেন্ট প্রসেসরের সাথে একীভূত করার প্রস্তুতির জন্য, আমাদের শপিং কার্টের দাম পাওয়ার একটি উপায় প্রয়োজন। আসুন এমন একটি ফাংশন তৈরি করি যা গুগল ডেটাস্টোরে শপিং কার্টের ডেটা ক্রস রেফারেন্স করে, ইনভেন্টরি থেকে প্রতিটি আইটেমের দাম পুনরুদ্ধার করে এবং কার্টে প্রতিটি আইটেমের পরিমাণ দিয়ে দামকে গুণ করে আমাদের জন্য দাম পুনরুদ্ধার করে।
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)
...
উপরের যুক্তিটি কী অর্জন করে তা দেখানোর জন্য এখানে কিছু স্ক্রিনশট দেওয়া হল:

কোডল্যাবের পরবর্তী অংশে যখন আমরা পেমেন্ট প্রসেসরের সাথে ইন্টিগ্রেট করার জন্য প্রস্তুত হব, তখন আমরা পেমেন্ট প্রসেসরে ডেটা পাস করার জন্য get_cart_price ফাংশনটি কল করব এবং পেমেন্ট প্রবাহ শুরু করব।
আবার, আপনি অ্যাপ্লিকেশনটি ব্যবহার করে এবং আপনার এজেন্টের সাথে যোগাযোগ করে Business Messages কথোপকথনে এই শপিং কার্ট কার্যকারিতাটি চেষ্টা করে দেখতে পারেন।
$ gcloud app deploy
৬. অভিনন্দন
অভিনন্দন, আপনি Business Messages-এর মধ্যে একটি শপিং কার্ট অভিজ্ঞতা সফলভাবে তৈরি করেছেন।
এই কোডল্যাবে আমরা যে বিষয়টি নিয়ে আলোচনা করিনি তা হল সম্পূর্ণ শপিং কার্ট খালি করার বৈশিষ্ট্য। আপনি যদি চান, তাহলে "কার্ট খালি করুন" বৈশিষ্ট্যটি পূরণ করার জন্য অ্যাপ্লিকেশনটি প্রসারিত করার চেষ্টা করুন। সমাধানটি আপনার ক্লোন করা সোর্স কোডের ধাপ-৩-এ উপলব্ধ।
ভবিষ্যতের একটি বিভাগে, আমরা একটি বহিরাগত পেমেন্ট প্রসেসরের সাথে একীভূত করব যাতে আপনার ব্যবহারকারীরা আপনার ব্র্যান্ডের সাথে একটি পেমেন্ট লেনদেন সম্পন্ন করতে সক্ষম হন।
একটি ভালো শপিং কার্ট কী হতে পারে?
কথোপকথনে একটি ভালো শপিং কার্টের অভিজ্ঞতা মোবাইল অ্যাপ বা কোনও ফিজিক্যাল স্টোরের মতো নয়। এই কোডল্যাবে আমরা আইটেম যোগ করতে, আইটেম সরাতে এবং কার্টের দাম গণনা করতে সক্ষম হওয়া এই কয়েকটি বৈশিষ্ট্যই অন্বেষণ করেছি। বাস্তব জগতের শপিং কার্টের থেকে আলাদা কিছু হল, আপনি যখন আইটেম যোগ করেন বা আইটেম সরান তখন যেকোনো মুহূর্তে কার্টে থাকা সমস্ত আইটেমের দাম দেখতে পাওয়া যায়। এই ধরণের উচ্চ-মূল্যবান বৈশিষ্ট্যগুলি আপনার কথোপকথনের বাণিজ্য অভিজ্ঞতাকে আলাদা করে তুলবে!
এরপর কী?
যখন আপনি প্রস্তুত হবেন, তখন Business Messages-এ আপনি যে জটিল মিথস্ক্রিয়াগুলি অর্জন করতে পারেন সেগুলি সম্পর্কে জানতে নিম্নলিখিত কয়েকটি বিষয় পরীক্ষা করে দেখুন:
রেফারেন্স ডক্স
- প্রস্তাবিত উত্তর
- ব্যবসায়িক বার্তা বার্তা রেফারেন্স ডকুমেন্ট
- রিচকার্ডের জন্য JSON সংজ্ঞা