ম্যাপিং মেনু ফিড এবং পূর্ণতা কার্ট আইটেম
যখন গ্রাহকরা তাদের কার্টে আপনার মেনু ফিড থেকে আইটেমগুলি যোগ করে এবং চেক আউট করে, তখন Google সেই আইটেমগুলিকে তাদের মূল্য এবং উপলব্ধতা যাচাই করার জন্য আপনার পরিপূরক এন্ডপয়েন্টে পাঠায়। একবার মূল্য এবং প্রাপ্যতা যাচাই করা হলে, গ্রাহক অর্ডার দিতে পারেন। এই বিভাগটি ব্যাখ্যা করে কিভাবে মেনু ফিড আইটেমগুলি পূরণের কার্ট আইটেমগুলিতে ম্যাপ করতে হয়৷
এই বিভাগে নমুনাগুলি মেনু ফিড এবং কার্ট স্কিমার স্ট্রাইপ-ডাউন সংস্করণ। মেনু ফিড এবং কার্ট অবজেক্টের মধ্যে ম্যাপিং চিত্রিত করার জন্য শুধুমাত্র প্রাসঙ্গিক ক্ষেত্রগুলি দেখানো হয়েছে। সম্পূর্ণ স্কিমার জন্য, Menu
এবং Cart
দেখুন।
একটি কার্টে যোগ করা Menu
ফিডের আইটেমগুলি চেকআউট এবং অর্ডার জমা দেওয়ার জন্য Cart
অবজেক্টে পাঠানো হয়।
- একটি সাধারণ
MenuItem
lineItems
অ্যারেতে একটিLineItem
হিসাবে উপস্থাপন করা হয় যার মধ্যেofferId
হল মেনু ফিডে নির্বাচিত মেনু আইটেমেরoffer.id
। - একটি প্রয়োজনীয়
MenuItemOption
সহ একটিMenuItem
lineItems
অ্যারেতে একটিLineItem
হিসাবে উপস্থাপন করা হয় যারofferId
হল মেনু ফিড থেকে নির্বাচিত মেনু আইটেম বিকল্পেরoffer.id
। - একটি
LineItem
একটিAddOnMenuItem
কেFoodItemExtension
এরoptions
অ্যারেতে একটিFoodItemOption
হিসেবে উপস্থাপন করা হয়। প্রতিটি বিকল্পের একটিofferId
থাকে যা মেনু ফিড থেকে নির্বাচিত অ্যাড-অন মেনু আইটেমেরoffer.id
এর সাথে মিলে যায়। মনে রাখবেন যে একটি AddOnMenuItem-এ নেস্ট করা AddOnMenuItem(গুলি) থাকতে পারে যেগুলি প্রতিটি বিকল্পের মধ্যেsubOptions
হিসাবে উপস্থাপিত হয়।
নিম্নলিখিত উদাহরণগুলি মেনু ফিড এবং পূর্ণতা কার্টের মধ্যে ম্যাপ মেনু আইটেম।
JSON
এই উদাহরণে সাধারণ মেনু আইটেমগুলির একটি তালিকা রয়েছে।
একটি মেনু ফিডে মেনু আইটেম:
{ "@type": "Menu", "@id": "menu_id", "hasMenuItem": [ { "@type": "MenuItem", "@id": "menuitem_id_1", "offers": [ { "@type": "Offer", "@id": "menuitem_offer_id_1", "price": "p_1", "priceCurrency": "USD" } ] }, { "@type": "MenuItem", "@id": "menuitem_id_2", "offers": [ { "@type": "Offer", "@id": "menuitem_offer_id_2", "price": "p_2", "priceCurrency": "USD" } ] } ] }
মেনু আইটেম একটি পূরণ কার্ট ম্যাপ করা হয়েছে:
{ "@type": "Cart", "lineItems": [ { "offerId": "menuitem_offer_id_1", "price": { "amount": { "currencyCode": "USD", "units": "dollar(q_1*p_1)", "nanos": "cent(q_1*p_1)" } }, "quantity": "q_1" }, { "offerId": "menuitem_offer_id_2", "price": { "amount": { "currencyCode": "USD", "units": "dollar(q_2*p_2)", "nanos": "cent(q_2*p_2)" } }, "quantity": "q_2" } ] }
JSON
এই উদাহরণে এক বা একাধিক AddOnMenuItems সহ একটি মেনু আইটেম রয়েছে৷
একটি মেনু ফিডে মেনু আইটেম:
{ "@type": "Menu", "@id": "menu_id", "hasMenuItem": [ { "@type": "MenuItem", "@id": "menuitem_id_1", "offers": [ { "@type": "Offer", "@id": "menuitem_offer_id_1", "price": "p_1", "priceCurrency": "USD" } ], "menuAddOn": [ { "@type": "MenuAddOnSection", "@id": "menuaddon_section_id_1", "hasMenuItem": [ { "@type": "AddOnMenuItem", "@id": "menuitem_addon_id_1", "offers": [ { "@type": "Offer", "@id": "menuitem_addon_offer_id_1", "price": "addon_p_1", "priceCurrency": "USD" } ] }, { "@type": "AddOnMenuItem", "@id": "menuitem_addon_id_2", "offers": [ { "@type": "Offer", "@id": "menuitem_addon_offer_id_2", "price": "addon_p_2", "priceCurrency": "USD" } ] } ] } ] }, { "@type": "MenuItem", "@id": "menuitem_id_2", "offers": [ { "@type": "Offer", "@id": "menuitem_offer_id_2", "price": "p_2", "priceCurrency": "USD" } ] } ] }
মেনু আইটেম একটি পূরণ কার্ট ম্যাপ করা হয়েছে:
{ "@type": "Cart", "lineItems": [ { "offerId": "menuitem_offer_id_1", "price": { "amount": { "currencyCode": "USD", "units": "dollar(q_1*(p_1 + addon_q_1*addon_p_1 + addon_q_2*addon_p_2))", "nanos": "cent(q_1*(p_1 + addon_q_1*addon_p_1 + addon_q_2*addon_p_2))" } }, "quantity": "q_1", "extension": { "@type": "FoodItemExtension", "options": [ { "offerId": "menuitem_addon_offer_id_1", "price": { "currencyCode": "USD", "units": "dollar(addon_q_1*addon_p_1)", "nanos": "cent(addon_q_1*addon_p_1)" }, "quantity": "addon_q_1" }, { "offerId": "menuitem_addon_offer_id_2", "price": { "currencyCode": "USD", "units": "dollar(addon_q_2*addon_p_2)", "nanos": "cent(addon_q_2*addon_p_2)" }, "quantity": "addon_q_2" } ] } }, { "offerId": "menuitem_offer_id_2", "price": { "amount": { "currencyCode": "USD", "units": "dollar(q_2*p_2)", "nanos": "cent(q_2*p_2)" } }, "quantity": "q_2" } ] }
JSON
এই উদাহরণে মেনু আইটেম বিকল্প, AddOnMenuItems এবং নেস্ট করা AddOnMenuItems সহ একটি মেনু আইটেম রয়েছে
একটি মেনু ফিডে মেনু আইটেম:
{ "@type": "MenuItem", "@id": "menuitem_id_1", "hasMenuItemOptions": [ { "@type": "MenuItemOption", "value": { "@type": "PropertyValue", "name": "OPTION", "value": "Large", "offers": [ { "@type": "Offer", "@id": "menuitem_option_offer_id_1", "price": "p_1", "priceCurrency": "USD" } ], "menuAddOn": [ { "@type": "AddOnMenuSection", "@id": "menuitem_option_addon_section_id_1", "hasMenuItem": [ { "@type": "AddOnMenuItem", "@id": "menuitem_option_addon_id_1", "offers": [ { "@type": "Offer", "@id": "menuitem_option_addon_offer_id_1", "price": "addon_p_1", "priceCurrency": "USD" } ] }, { "@type": "AddOnMenuItem", "@id": "menuitem_option_addon_id_2", "offers": [ { "@type": "Offer", "@id": "menuitem_option_addon_offer_id_2", "price": "addon_p_2", "priceCurrency": "USD" } ], "menuAddOn": [ { "@type": "AddOnMenuSection", "@id": "menuitem_option_subaddon_section_id_1", "hasMenuItem": [ { "@type": "AddOnMenuItem", "@id": "menuitem_option_subaddon_id_1", "offers": [ { "@type": "Offer", "@id": "menuitem_option_subaddon_offer_id_1", "price": "subaddon_p_1", "priceCurrency": "USD" } ] } ] } ] } ] } ] } } ] }
মেনু আইটেম একটি পূরণ কার্ট ম্যাপ করা হয়েছে:
{ "@type": "Cart", "lineItems": [ { "offerId": "menuitem_option_offer_id_1", "price": { "amount": { "currencyCode": "USD", "units": "dollar(q_1*(p_1 + addon_q_1*addon_p_1 + addon_q_2*(addon_p_2 + subaddon_q_1*subaddon_p_1)))", "nanos": "cent(q_1*(p_1 + addon_q_1*addon_p_1 + addon_q_2*(addon_p_2 + subaddon_q_1*subaddon_p_1)))" } }, "quantity": "q_1", "extension": { "@type": "FoodItemExtension", "options": [ { "offerId": "menuitem_option_addon_offer_id_1", "price": { "currencyCode": "USD", "units": "dollar(addon_q_1*addon_p_1)", "nanos": "cent(addon_q_1*addon_p_1)" }, "quantity": "addon_q_1" }, { "offerId": "menuitem_option_addon_offer_id_2", "price": { "currencyCode": "USD", "units": "dollar(addon_q_2*(addon_p_2 + subaddon_q_1*subaddon_p_1))", "nanos": "cent(addon_q_2*(addon_p_2 + subaddon_q_1*subaddon_p_1))" }, "quantity": "addon_q_2", "subOptions": [ { "offerId": "menuitem_option_subaddon_offer_id_1", "price": { "currencyCode": "USD", "units": "dollar(subaddon_q_1*subaddon_p_1)", "nanos": "cent(subaddon_q_1*subaddon_p_1)" }, "quantity": "subaddon_q_1" } ] } ] } } ] }
হ্যান্ডলিং ত্রুটি
আপনি যদি একটি CheckoutRequestMessage
প্রক্রিয়া করার সময় সমস্যার সম্মুখীন হন, তাহলে আপনি CheckoutResponseMessage
এর সাথে প্রতিক্রিয়া জানাতে পারেন যাতে একটি CheckoutResponse এর পরিবর্তে একটি FoodErrorExtension
রয়েছে৷ প্রক্রিয়াকরণের সময় ঘটে যাওয়া এক বা একাধিক ত্রুটি সনাক্ত করতে আপনি এই প্রতিক্রিয়াটি ব্যবহার করতে পারেন।
ত্রুটিগুলি পরিচালনা করার 2টি উপায় রয়েছে:
- পুনরুদ্ধারযোগ্য ত্রুটি: অর্ডার জমা দেওয়ার জন্য ব্যবহারকারীকে তাদের কার্ট সম্পাদনা করতে হবে না। উদাহরণস্বরূপ, যদি আপনি নির্ধারণ করেন যে
Cart
একটি আইটেমের মূল্য পরিবর্তন হয়েছে, তাহলে আপনিcorrectedProposedOrder
এবংpaymentOptions
সাথেPRICE_CHANGED
ত্রুটির ধরনের একটিFoodOrderError
দিয়ে প্রতিক্রিয়া জানাতে পারেন। Google ব্যবহারকারীকে পরিবর্তন সম্পর্কে অবহিত করে কিন্তু ব্যবহারকারীকেcorrectedProposedOrder
দিয়ে জমা দিতে দেয়। ব্যবহারকারী চাইলে ফিরে যেতে এবং তাদের কার্ট সম্পাদনা করতে পারেন। আপনি হয় একটি নতুনCheckoutRequestMessage
অথবা একটিSubmitOrderRequestMessage
পাবেন। - পুনরুদ্ধারযোগ্য ত্রুটি: ব্যবহারকারীকে অর্ডার জমা দেওয়ার আগে তাদের কার্ট সম্পাদনা করতে হবে। উদাহরণস্বরূপ, যদি আপনি নির্ধারণ করেন যে রেস্তোরাঁটি বন্ধ, আপনি
CLOSED
ধরনের ত্রুটিরFoodOrderError
দিয়ে প্রতিক্রিয়া জানাতে পারেন। Google ব্যবহারকারীকে জানায় এবং একটি নতুন রেস্তোরাঁয় আপডেট করার জন্য ইন্টারঅ্যাকশন পরিচালনা করে। আপনি একটি নতুন কার্টের জন্য একটি নতুনCheckoutRequestMessage
পাবেন৷
সাধারণভাবে, কার্ট-স্তরের ত্রুটিগুলি পুনরুদ্ধারযোগ্য এবং আইটেম-স্তরের ত্রুটিগুলি পুনরুদ্ধারযোগ্য করুন৷ ত্রুটির ধরন এবং তাদের অর্থের সম্পূর্ণ তালিকার জন্য, FoodOrderError
দেখুন।
হ্যান্ডলিং মূল্য পরিবর্তন
চেকআউটের সময় মূল্য পরিবর্তন হয়
গ্রাহকের চেকআউট অনুরোধ প্রক্রিয়া করার সময় আপনি যদি দামের সমস্যার সম্মুখীন হন, তাহলে নিম্নলিখিতগুলি করুন:
-
CheckoutRequestMessage
এ একটিCheckoutResponseMessage
এর সাথে সাড়া দিন যাতে একটিFoodErrorExtension
রয়েছে, যেমন হ্যান্ডলিং ত্রুটিতে বর্ণিত হয়েছে। - ত্রুটির প্রতিক্রিয়াতে, সঠিক মানের মূল্য আপডেট করতে
correctedProposedOrder.cart
ব্যবহার করুন। Google সঠিক অর্ডার পায় এবং একটি নতুনCheckoutRequestMessage
জারি করতে পারে।
চেকআউটের পরে, ProposedOrder
পরিবর্তন করা হয়েছে কিনা তা নির্বিশেষে Google শেষ ব্যবহারকারীকে একটি অর্ডার নিশ্চিতকরণ পৃষ্ঠা প্রদর্শন করে।
প্রস্তাবিত অর্ডার সংশোধন করা হলে, পরিবর্তনগুলি ব্যবহারকারীকে জানানোর জন্য Google অতিরিক্ত সতর্কতা দেখাতে পারে৷ ব্যবহারকারী যদি অর্ডার দিতে সম্মত হন, তাহলে আর কোনো চেকআউট অনুরোধ থাকবে না। সংশোধিত ProposedOrder
সহ, জমা দেওয়ার আদেশ অব্যাহত রয়েছে।
যাইহোক, ব্যবহারকারী সবসময় তাদের মন পরিবর্তন করতে পারে এবং তাদের কার্ট আবার সম্পাদনা করতে পারে। যখন তাদের কার্ট এইভাবে আপডেট হয়, তখন Google একটি নতুন CheckoutRequestMessage
পাঠায়।
সাবমিট অর্ডারের সময় দাম পরিবর্তন হয়
অর্ডার জমা দেওয়ার প্রক্রিয়া করার সময় যদি আপনি একটি মূল্য সমস্যার সম্মুখীন হন ( actions.intent.TRANSACTION_DECISION
অভিপ্রায় ট্রিগার করা হয়েছিল), তবে কোনও ত্রুটির সাথে সাড়া দেবেন না বা আপনার প্রতিক্রিয়াতে মূল্য আপডেট করবেন না৷ যদি SubmitOrderRequestMessage
এ দাম, পরিমাণ বা অন্যান্য বিবরণ আপনার ডেটার সাথে মেলে না, তাহলে orderState
-এ REJECTED
সেট করে সাড়া দিন যাতে অনুরোধ অনুযায়ী অর্ডার দেওয়া যাবে না।
তারপর, অর্ডার এবং পেমেন্টের বিশদ বৈধ হলে, orderState
CREATED
বা CONFIRMED
সেট করুন। এছাড়াও, আপনার সিস্টেমে অর্ডারের আইডি উপস্থাপন করতে একটি actionOrderId
অন্তর্ভুক্ত করুন। পরবর্তী আপডেট পাঠানোর সময় এই আইডিটি ব্যবহার করতে হবে।
আপনি যদি অর্থপ্রদান প্রক্রিয়া করতে অক্ষম হন এবং ইতিমধ্যেই SubmitOrderRequestMessage
পাঠিয়ে থাকেন, তাহলে আপনি একটি AsyncOrderUpdateRequestMessage
পাঠাতে পারেন যাতে orderState
REJECTED
সেট করা থাকে যাতে ব্যবহারকারীকে জানানো হয় যে অর্ডারটি যাবে না।
অর্ডার সাবমিট করার পর দাম পরিবর্তন হয়
আপনি যদি নির্ধারণ করেন যে একজন গ্রাহক যখন তাদের অর্ডার জমা দেন তখন ব্যবহৃত মূল্য থেকে একটি মূল্য পরিবর্তিত হয়েছে, আপনি একটি AsyncOrderUpdateRequestMessage
ইস্যু করতে পারেন, যেমনটি নতুন মূল্যের সাথে অ্যাসিঙ্ক্রোনাস অর্ডার আপডেট বাস্তবায়নে বর্ণিত হয়েছে৷
অ্যাসিঙ্ক অর্ডার আপডেট ব্যবহার করে দাম আপডেট করতে:
-
lineItemUpdates[ x ].price
। এই মান অ্যাড-অন সহ আইটেমের মোট খরচ প্রতিফলিত করে এবং পরিমাণ দ্বারা গুণিত হয়। (আরও তথ্যের জন্য,LineItem
price
ক্ষেত্রের বিবরণ দেখুন।) -
lineItemUpdates[ x ].reason
এ একটি ব্যাখ্যা লিখুন। -
lineItemUpdates[ x ].orderState
কেCONFIRMED
সেট করুন।
আপনি আপনার বিবেচনার ভিত্তিতে AsyncOrderUpdateRequestMessage পাঠানোর আগে বা পরে অর্থপ্রদানের উপকরণ চার্জ করার চেষ্টা করতে পারেন। যদি লেনদেন ব্যর্থ হয় (সম্ভবত মূল্য ডেল্টা খুব বেশি হওয়ার কারণে), Google-কে ব্যর্থতার বিষয়ে জানাতে OrderUpdate
এ নিম্নলিখিত সেটিংস সহ একটি AsyncOrderUpdateRequestMessage পাঠান:
-
orderState
REJECTED
সেট করুন। -
label
ক্ষেত্রে ব্যর্থতা বর্ণনা করুন।
চেকআউট বৈধতা
ধাপ 4-এ যেমন আলোচনা করা হয়েছে: চেকআউট প্রয়োগ করুন , আপনার পূর্ণতা শেষ পয়েন্টটি প্রতিটি আগত CheckoutRequestMessage
এ বৈধতা সঞ্চালন করবে এবং একটি CheckoutResponseMessage
এর সাথে প্রতিক্রিয়া জানাবে।
এখানে একটি সফল বৈধতার জন্য CheckoutResponseMessage
এর একটি উদাহরণ রয়েছে:
কেস ব্যবহার করুন | কিভাবে বাস্তবায়ন করা যায় |
---|---|
কেস 1 ব্যবহার করুন: বৈধতা সফল হয়েছে | রিটার্ন CheckoutResponse । এতে অবশ্যই ProposedOrder এবং PaymentOptions থাকতে হবে। ProposedOrder ট্যাক্স, ফি এবং কার্টের মোট মূল্য অন্তর্ভুক্ত রয়েছে। |
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "checkoutResponse": { "proposedOrder": { "id": "sample_proposed_order_id_1", "otherItems": [ { "name":"New customer discount", "price": { "type":"ESTIMATE", "amount": { "currencyCode":"USD", "units":"-5", "nanos": -500000000 } }, "type": "DISCOUNT" }, { "name": "Delivery fee", "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "3", "nanos": 500000000 } }, "type": "DELIVERY" }, { "name": "Tax", "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "1", "nanos": 500000000 } }, "type": "TAX" } ], "cart": { "merchant": { "id": "https://www.exampleprovider.com/merchant/id1", "name": "Falafel Bite" }, "lineItems": [ { "name": "Pita Chips", "type": "REGULAR", "id": "sample_item_offer_id_1", "offerId": "https://www.exampleprovider.com/menu/item/offer/id1", "quantity": 1, "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "2", "nanos": 750000000 } }, "subLines": [ { "note": "Notes for this item." } ], "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension", "options": [ { "id": "sample_addon_offer_id_1", "offerId": "https://www.exampleprovider.com/menu/item/addon/offer/id1", "name": "Honey Mustard", "price": { "currencyCode": "USD" }, "quantity": 1 }, { "id": "sample_addon_offer_id_2", "offerId": "https://www.exampleprovider.com/menu/item/addon/offer/id2", "name": "BBQ Sauce", "price": { "currencyCode": "USD", "nanos": 500000000 }, "quantity": 1 } ] } }, { "name": "Chicken Shwarma Wrap", "type": "REGULAR", "id": "sample_item_offer_id_2", "offerId": "https://www.exampleprovider.com/menu/item/offer/id2", "quantity": 1, "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "8" } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension" } }, { "name": "Greek Salad", "type": "REGULAR", "id": "sample_item_offer_id_3", "offerId": "https://www.exampleprovider.com/menu/item/offer/id3", "quantity": 1, "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "9", "nanos": 990000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension" } }, { "name": "Prawns Biryani", "type": "REGULAR", "id": "sample_item_offer_id_4", "offerId": "https://www.exampleprovider.com/menu/item/offer/id4", "quantity": 1, "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "15", "nanos": 990000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension" } } ], "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension", "fulfillmentPreference": { "fulfillmentInfo": { "delivery": { "deliveryTimeIso8601": "P90M" } } }, "location": { "coordinates": { "latitude": 37.788783, "longitude": -122.41384 }, "formattedAddress": "1350 CHARLESTON ROAD, MOUNTAIN VIEW, CA, United States", "zipCode": "94043", "city": "Mountain View", "postalAddress": { "regionCode": "US", "postalCode": "94043", "administrativeArea": "CA", "locality": "Mountain View", "addressLines": [ "1350 Charleston Road" ] }, "notes": "Gate code is #111" } } }, "totalPrice": { "type": "ESTIMATE", "amount": { // Represents $36.73 "currencyCode": "USD", "units": "36", "nanos": 730000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension", "availableFulfillmentOptions": [ { "fulfillmentInfo": { "delivery": { "deliveryTimeIso8601": "P90M" } }, "expiresAt": "2017-07-17T12:30:00Z" } ] } }, "paymentOptions": { "googleProvidedOptions": { "tokenizationParameters": { "tokenizationType": "PAYMENT_GATEWAY", "parameters": { "gateway": "stripe", "stripe:publishableKey": "pk_live_stripe_client_key", "stripe:version": "2017-04-06" } }, "supportedCardNetworks": [ "AMEX", "DISCOVER", "MASTERCARD", "JCB", "VISA" ], "prepaidCardDisallowed": true } } } } } ] } } }
ডেলিভারি ঠিকানা বৈধতা
আপনার পূর্ণতা শেষ পয়েন্ট প্রতিটি CheckoutRequestMessage
এ থাকা বিতরণ ঠিকানা যাচাই করা উচিত।
যদি ডেলিভারির ঠিকানায় কোনো সমস্যা থাকে, যেমন এটি ডেলিভারি পরিষেবার সীমার বাইরে, আপনার পূর্ণতা দ্বারা ফিরে আসা CheckoutResponseMessage
টিতে উপযুক্ত ধরনের একটি FoodOrderError
থাকতে হবে।
কেস ব্যবহার করুন | কিভাবে বাস্তবায়ন করা যায় |
---|---|
কেস 1 ব্যবহার করুন: বৈধতা ব্যর্থ হয়েছে কারণ ডেলিভারির ঠিকানা সীমার বাইরে বা ডেলিভারি ঠিকানার সাথে একটি সমস্যা রয়েছে৷ | OUT_OF_SERVICE_AREA ধরনের ত্রুটির FoodOrderError সহ FoodErrorExtension রিটার্ন করুন। |
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "error": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension", "foodOrderErrors": [ { "error": "OUT_OF_SERVICE_AREA", "description": "Sorry, the restaurant cannot deliver to your address." } ] } } } ] } } }
ন্যূনতম অর্ডার মান বৈধতা
আপনার পূর্ণতা শেষ পয়েন্ট প্রতিটি CheckoutRequestMessage
এর ন্যূনতম অর্ডার মান যাচাই করা উচিত।
ন্যূনতম অর্ডার মান পূরণ না হলে, আপনার পূর্ণতা দ্বারা প্রত্যাবর্তিত CheckoutResponseMessage
একটি FoodOrderError
টাইপের REQUIREMENTS_NOT_MET
থাকা উচিত।
কেস ব্যবহার করুন | কিভাবে বাস্তবায়ন করা যায় |
---|---|
কেস 1 ব্যবহার করুন: সর্বনিম্ন অর্ডার মান পূরণ না হওয়ায় বৈধতা ব্যর্থ হয়েছে৷ | REQUIREMENTS_NOT_MET ত্রুটির প্রকারের FoodOrderError সহ FoodErrorExtension রিটার্ন করুন। |
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "error": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension", "foodOrderErrors": [ { "error": "REQUIREMENTS_NOT_MET", "description": "The cart subtotal must be over $20." } ] } } } ] } } }
অর্ডার উইন্ডো বৈধতা
প্রতিটি CheckoutRequestMessage
এর অর্ডারিং উইন্ডোকে প্রভাবিত করতে পারে এমন যেকোন কারণকে আপনার পরিপূর্ণতা শেষ পয়েন্টটি যাচাই করা উচিত।
উদাহরণস্বরূপ, যদি রেস্তোরাঁটি বন্ধ থাকে বা এই মুহুর্তে আর অর্ডার নিচ্ছে না, তাহলে আপনার পূর্ণতা দ্বারা ফিরে আসা CheckoutResponseMessage
যথাক্রমে CLOSED
বা NO_CAPACITY
ধরনের ত্রুটির একটি FoodOrderError
থাকা উচিত৷
কেস ব্যবহার করুন | কিভাবে বাস্তবায়ন করা যায় |
---|---|
কেস 1 ব্যবহার করুন: বৈধতা ব্যর্থ হয়েছে কারণ রেস্টুরেন্টটি বন্ধ বা আর সমর্থিত নয় | FoodOrderError এরর টাইপ CLOSED সহ FoodErrorExtension রিটার্ন করুন। |
কেস 2 ব্যবহার করুন: বৈধতা ব্যর্থ হয়েছে কারণ রেস্টুরেন্টটি ব্যস্ত এবং এই মুহূর্তে অর্ডার নিচ্ছে না | NO_CAPACITY ধরনের ত্রুটির FoodOrderError সহ FoodErrorExtension রিটার্ন করুন। |
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "error": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension", "foodOrderErrors": [ { "error": "CLOSED", "description": "The restaurant is closed." } ] } } } ] } } }
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "error": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension", "foodOrderErrors": [ { "error": "NO_CAPACITY", "description": "Sorry, the restaurant is busy at the moment." } ] } } } ] } } }
কার্ট আইটেম বৈধতা
আপনার পূর্ণতা শেষ পয়েন্ট একটি CheckoutRequestMessage
এ থাকা প্রতিটি কার্ট আইটেমের মূল্য এবং প্রাপ্যতা যাচাই করা উচিত।
যদি প্রাপ্যতা বা মূল্য পরিবর্তিত হয়ে থাকে, তাহলে আপনার পূর্ণতা দ্বারা ফিরে আসা CheckoutResponseMessage
যথাক্রমে AVAILABILITY_CHANGED
বা PRICE_CHANGED
ধরনের ত্রুটির একটি FoodOrderError
থাকা উচিত।
কেস ব্যবহার করুন | কিভাবে বাস্তবায়ন করা যায় |
---|---|
কেস 1 ব্যবহার করুন: বৈধকরণ ব্যর্থ হয়েছে কারণ কিছু মেনু আইটেম এবং/অথবা তাদের কাস্টমাইজেশন বৈধ নয় বা স্টক নেই | AVAILABILITY_CHANGED ত্রুটির প্রকারের correctedProposedOrder , PaymentOptions এবং FoodOrderError সহ FoodErrorExtension রিটার্ন করুন। CorrectedProposedOrder থেকে অবৈধ আইটেম অপসারণ করতে হবে। |
কেস 2 ব্যবহার করুন: বৈধকরণ ব্যর্থ হয়েছে কারণ কিছু মেনু আইটেম এবং/অথবা তাদের কাস্টমাইজেশন বৈধ নয় বা স্টক নেই। সংশোধন করা কার্ট আর ন্যূনতম অর্ডার মান প্রয়োজনীয়তা পূরণ করে না। | AVAILABILITY_CHANGED এবং REQUIREMENTS_NOT_MET ত্রুটির প্রকারের FoodOrderError সহ FoodErrorExtension ফেরত দিন। |
কেস 3 ব্যবহার করুন: বৈধকরণ ব্যর্থ হয়েছে কারণ কিছু মেনু আইটেম এবং/অথবা কাস্টমাইজেশন মূল্য পরিবর্তিত হয়েছে | PRICE_CHANGED ত্রুটির প্রকারের correctedProposedOrder , PaymentOptions এবং FoodOrderError সহ FoodErrorExtension ফেরত দিন। পুরানো দাম অবশ্যই CorrectedProposedOrder আপডেট করতে হবে। |
কেস 4 ব্যবহার করুন: বৈধকরণ ব্যর্থ হয়েছে কারণ কিছু মেনু আইটেম এবং/অথবা কাস্টমাইজেশন মূল্য পরিবর্তিত হয়েছে। সংশোধন করা কার্ট আর ন্যূনতম অর্ডার মান প্রয়োজনীয়তা পূরণ করে না | PRICE_CHANGED এবং REQUIREMENTS_NOT_MET ত্রুটির প্রকারের FoodOrderError সহ FoodErrorExtension ফেরত দিন। |
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "error": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension", "foodOrderErrors": [ { "error": "AVAILABILITY_CHANGED", "id": "sample_item_offer_id_1", "description": "The item is no longer available." }, { "error": "AVAILABILITY_CHANGED", "id": "sample_item_offer_id_2", "description": "The item is no longer available." } ], "correctedProposedOrder": { "id": "sample_corrected_proposed_order_id_1", "otherItems": [ { "name":"New customer discount", "price": { "type":"ESTIMATE", "amount": { "currencyCode":"USD", "units":"-5", "nanos": -500000000 } }, "type": "DISCOUNT" }, { "name": "Delivery fee", "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "3", "nanos": 500000000 } }, "type": "DELIVERY" }, { "name": "Tax", "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "1", "nanos": 500000000 } }, "type": "TAX" } ], "cart": { "merchant": { "id": "https://www.exampleprovider.com/merchant/id1", "name": "Falafel Bite" }, "lineItems": [ { "name": "Greek Salad", "type": "REGULAR", "id": "sample_item_offer_id_3", "offerId": "https://www.exampleprovider.com/menu/item/offer/id3", "quantity": 1, "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "9", "nanos": 990000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension" } }, { "name": "Prawns Biryani", "type": "REGULAR", "id": "sample_item_offer_id_4", "offerId": "https://www.exampleprovider.com/menu/item/offer/id4", "quantity": 1, "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "15", "nanos": 990000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension" } } ], "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension", "fulfillmentPreference": { "fulfillmentInfo": { "delivery": { "deliveryTimeIso8601": "P90M" } } }, "location": { "coordinates": { "latitude": 37.788783, "longitude": -122.41384 }, "formattedAddress": "1350 CHARLESTON ROAD, MOUNTAIN VIEW, CA, United States", "zipCode": "94043", "city": "Mountain View", "postalAddress": { "regionCode": "US", "postalCode": "94043", "administrativeArea": "CA", "locality": "Mountain View", "addressLines": [ "1350 Charleston Road" ] }, "notes": "Gate code is #111" } } }, "totalPrice": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "36", "nanos": 730000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension", "availableFulfillmentOptions": [ { "fulfillmentInfo": { "delivery": { "deliveryTimeIso8601": "P90M" } }, "expiresAt": "2017-07-17T12:30:00Z" } ] } }, "paymentOptions": { "googleProvidedOptions": { "tokenizationParameters": { "tokenizationType": "PAYMENT_GATEWAY", "parameters": { "gateway": "stripe", "stripe:publishableKey": "pk_live_stripe_client_key", "stripe:version": "2017-04-06" } }, "supportedCardNetworks": [ "AMEX", "DISCOVER", "MASTERCARD", "JCB", "VISA" ], "prepaidCardDisallowed": true } } } } } ] } } }
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "error": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension", "foodOrderErrors": [ { "error": "REQUIREMENTS_NOT_MET", "description": "The cart subtotal must be over $20." }, { "error": "AVAILABILITY_CHANGED", "id": "cart_lineitem_id" "description": "cart_lineitem_id is no longer available." } ] } } } ] } } }
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "error": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension", "foodOrderErrors": [ { "error": "PRICE_CHANGED", "id": "sample_item_offer_id_1", "description": "The price has changed.", "updatedPrice": { "currencyCode": "USD", "units": "2", "nanos": 750000000 } }, { "error": "PRICE_CHANGED", "id": "sample_item_offer_id_2", "description": "The price has changed.", "updatedPrice": { "currencyCode": "USD", "units": "8" } } ], "correctedProposedOrder": { "id": "sample_corrected_proposed_order_id_1", "otherItems": [ { "name":"New customer discount", "price": { "type":"ESTIMATE", "amount": { "currencyCode":"USD", "units":"-5", "nanos": -500000000 } }, "type": "DISCOUNT" }, { "name": "Delivery fee", "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "3", "nanos": 500000000 } }, "type": "DELIVERY" }, { "name": "Tax", "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "1", "nanos": 500000000 } }, "type": "TAX" } ], "cart": { "merchant": { "id": "https://www.exampleprovider.com/merchant/id1", "name": "Falafel Bite" }, "lineItems": [ { "name": "Pita Chips", "type": "REGULAR", "id": "sample_item_offer_id_1", "offerId": "https://www.exampleprovider.com/menu/item/offer/id1", "quantity": 1, "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "2", "nanos": 750000000 } }, "subLines": [ { "note": "Notes for this item." } ], "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension", "options": [ { "id": "sample_addon_offer_id_1", "offerId": "https://www.exampleprovider.com/menu/item/addon/offer/id1", "name": "Honey Mustard", "price": { "currencyCode": "USD" }, "quantity": 1 }, { "id": "sample_addon_offer_id_2", "offerId": "https://www.exampleprovider.com/menu/item/addon/offer/id2", "name": "BBQ Sauce", "price": { "currencyCode": "USD", "nanos": 500000000 }, "quantity": 1 } ] } }, { "name": "Chicken Shwarma Wrap", "type": "REGULAR", "id": "sample_item_offer_id_2", "offerId": "https://www.exampleprovider.com/menu/item/offer/id2", "quantity": 1, "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "8" } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension" } }, { "name": "Greek Salad", "type": "REGULAR", "id": "sample_item_offer_id_3", "offerId": "https://www.exampleprovider.com/menu/item/offer/id3", "quantity": 1, "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "9", "nanos": 990000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension" } }, { "name": "Prawns Biryani", "type": "REGULAR", "id": "sample_item_offer_id_4", "offerId": "https://www.exampleprovider.com/menu/item/offer/id4", "quantity": 1, "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "15", "nanos": 990000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension" } } ], "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension", "fulfillmentPreference": { "fulfillmentInfo": { "delivery": { "deliveryTimeIso8601": "P90M" } } }, "location": { "coordinates": { "latitude": 37.788783, "longitude": -122.41384 }, "formattedAddress": "1350 CHARLESTON ROAD, MOUNTAIN VIEW, CA, United States", "zipCode": "94043", "city": "Mountain View", "postalAddress": { "regionCode": "US", "postalCode": "94043", "administrativeArea": "CA", "locality": "Mountain View", "addressLines": [ "1350 Charleston Road" ] }, "notes": "Gate code is #111" } } }, "totalPrice": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "36", "nanos": 730000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension", "availableFulfillmentOptions": [ { "fulfillmentInfo": { "delivery": { "deliveryTimeIso8601": "P90M" } }, "expiresAt": "2017-07-17T12:30:00Z" } ] } }, "paymentOptions": { "googleProvidedOptions": { "tokenizationParameters": { "tokenizationType": "PAYMENT_GATEWAY", "parameters": { "gateway": "stripe", "stripe:publishableKey": "pk_live_stripe_client_key", "stripe:version": "2017-04-06" } }, "supportedCardNetworks": [ "AMEX", "DISCOVER", "MASTERCARD", "JCB", "VISA" ], "prepaidCardDisallowed": true } } } } } ] } } }
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "error": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension", "foodOrderErrors": [ { "error": "REQUIREMENTS_NOT_MET", "description": "The cart subtotal must be over $20." }, { "error": "PRICE_CHANGED", "id": "cart_lineitem_id" "description": "cart_lineitem_id price has been updated." "updatedPrice": { "currencyCode": "USD", "units": "2", "nanos": 750000000 } } ] } } } ] } } }
অর্ডার বৈধতা জমা দিন
ধাপ 7-এ যেমন আলোচনা করা হয়েছে: সাবমিট অর্ডার বাস্তবায়ন করুন , আপনার পূর্ণতা শেষ পয়েন্টটি প্রতিটি আগত SubmitOrderRequestMessage
এ বৈধতা সঞ্চালন করবে এবং একটি SubmitOrderResponseMessage
এর সাথে প্রতিক্রিয়া জানাবে।
এখানে একটি সফল বৈধতার জন্য SubmitOrderResponseMessage
এর একটি উদাহরণ রয়েছে:
কেস ব্যবহার করুন | কিভাবে বাস্তবায়ন করা যায় |
---|---|
কেস 1 ব্যবহার করুন: অর্ডার সফলভাবে তৈরি করা হয়েছে | CREATED অর্ডার স্টেট সহ একটি SubmitOrderResponseMessage . এতে অবশ্যই actionOrderId , userVisibleId , orderManagementActions , এবং estimatedFulfillmentTime থাকতে হবে। |
কেস 2 ব্যবহার করুন: অর্থপ্রদানের সমস্যার কারণে অর্ডার প্রত্যাখ্যান করা হয়েছে | REJECTED আদেশের অবস্থা সহ একটি SubmitOrderResponseMessage । এতে অবশ্যই actionOrderId , userVisibleId , orderManagementActions এবং PAYMENT_DECLINED ধরনের rejectionInfo থাকতে হবে। |
কেস 3 ব্যবহার করুন: ব্যবহারকারীকে নিষিদ্ধ হিসাবে পতাকাঙ্কিত করার জন্য আদেশ প্রত্যাখ্যান করা হয়েছে | REJECTED অর্ডার স্থিতি সহ একটি SubmitOrderResponseMessage . এতে অবশ্যই actionOrderId , userVisibleId , orderManagementActions , এবং INELIGIBLE টাইপের rejectionInfo থাকতে হবে। |
কেস 4 ব্যবহার করুন: অর্ডার প্রত্যাখ্যান করা হয়েছে কারণ ব্যবহারকারীর তথ্য অসম্পূর্ণ বা অবৈধ | REJECTED আদেশের অবস্থা সহ একটি SubmitOrderResponseMessage । এতে অবশ্যই actionOrderId , userVisibleId , orderManagementActions , এবং INELIGIBLE টাইপের rejectionInfo থাকতে হবে। |
কেস 5 ব্যবহার করুন: অজানা কারণে অর্ডার প্রত্যাখ্যান করা হয়েছে | REJECTED আদেশের অবস্থা সহ একটি SubmitOrderResponseMessage । এতে অবশ্যই actionOrderId , userVisibleId , orderManagementActions এবং UNKNOWN টাইপের rejectionInfo থাকতে হবে। |
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "CREATED", "label": "Order received" }, "updateTime": "2017-05-10T02:30:00.000Z", "orderManagementActions": [ { "type": "CUSTOMER_SERVICE", "button": { "title": "Contact customer service", "openUrlAction": { "url": "mailto:support@example.com" } } }, { "type": "EMAIL", "button": { "title": "Email restaurant", "openUrlAction": { "url": "mailto:person@example.com" } } }, { "type": "CALL", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "VIEW_DETAILS", "button": { "title": "View order", "openUrlAction": { "url": "https://orderview.partner.com?orderid=sample_action_order_id" } } } ] } } } ] } } }
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "REJECTED", "label": "Order rejected" }, "updateTime": "2017-05-10T02:30:00.000Z", "rejectionInfo": { "type": "PAYMENT_DECLINED", "reason": "Insufficient funds" }, "orderManagementActions": [ { "type": "CUSTOMER_SERVICE", "button": { "title": "Contact customer service", "openUrlAction": { "url": "mailto:support@example.com" } } }, { "type": "EMAIL", "button": { "title": "Email restaurant", "openUrlAction": { "url": "mailto:person@example.com" } } }, { "type": "CALL", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "VIEW_DETAILS", "button": { "title": "View order", "openUrlAction": { "url": "https://orderview.partner.com?orderid=sample_action_order_id" } } } ] } } } ] } } }
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "REJECTED", "label": "Order rejected" }, "updateTime": "2017-05-10T02:30:00.000Z", "rejectionInfo": { "type": "INELIGIBLE", "reason": "Sorry, we are not able to take orders from this user" }, "orderManagementActions": [ { "type": "CUSTOMER_SERVICE", "button": { "title": "Contact customer service", "openUrlAction": { "url": "mailto:support@example.com" } } }, { "type": "EMAIL", "button": { "title": "Email restaurant", "openUrlAction": { "url": "mailto:person@example.com" } } }, { "type": "CALL", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "VIEW_DETAILS", "button": { "title": "View order", "openUrlAction": { "url": "https://orderview.partner.com?orderid=sample_action_order_id" } } } ] } } } ] } } }
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "REJECTED", "label": "Order rejected" }, "updateTime": "2017-05-10T02:30:00.000Z", "rejectionInfo": { "type": "INELIGIBLE", "reason": "Sorry, the phone number must not be blank" }, "orderManagementActions": [ { "type": "CUSTOMER_SERVICE", "button": { "title": "Contact customer service", "openUrlAction": { "url": "mailto:support@example.com" } } }, { "type": "EMAIL", "button": { "title": "Email restaurant", "openUrlAction": { "url": "mailto:person@example.com" } } }, { "type": "CALL", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "VIEW_DETAILS", "button": { "title": "View order", "openUrlAction": { "url": "https://orderview.partner.com?orderid=sample_action_order_id" } } } ] } } } ] } } }
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "REJECTED", "label": "Order rejected" }, "updateTime": "2017-05-10T02:30:00.000Z", "rejectionInfo": { "type": "UNKNOWN", "reason": "Sorry, there is something wrong with this order." }, "orderManagementActions": [ { "type": "CUSTOMER_SERVICE", "button": { "title": "Contact customer service", "openUrlAction": { "url": "mailto:support@example.com" } } }, { "type": "EMAIL", "button": { "title": "Email restaurant", "openUrlAction": { "url": "mailto:person@example.com" } } }, { "type": "CALL", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "VIEW_DETAILS", "button": { "title": "View order", "openUrlAction": { "url": "https://orderview.partner.com?orderid=sample_action_order_id" } } } ] } } } ] } } }