मेन्यू फ़ीड और फ़ुलफ़िलमेंट कार्ट में मौजूद आइटम को मैप करना
जब खरीदार आपके मेन्यू फ़ीड से आइटम को कार्ट में जोड़ते हैं और पैसे चुकाते हैं, Google उन आइटम की कीमत की पुष्टि करने के लिए, उन्हें आपके फ़ुलफ़िलमेंट एंडपॉइंट पर भेजता है और उपलब्धता. कीमत और उपलब्धता की पुष्टि होने के बाद, खरीदार ये काम कर सकते हैं ऑर्डर करो. इस सेक्शन में बताया गया है कि मेन्यू फ़ीड आइटम को फ़ुलफ़िलमेंट कार्ट में मौजूद आइटम.
इस सेक्शन में मौजूद सैंपल, मेन्यू फ़ीड और कार्ट के स्ट्रिप-डाउन वर्शन हैं
स्कीमा चुनें. मेन्यू फ़ीड और
कार्ट ऑब्जेक्ट दिखाए जाते हैं. पूरे स्कीमा के लिए, Menu
और Cart
देखें.
Menu
फ़ीड के कार्ट में जोड़े गए आइटम, Cart
में भेजे जाते हैं
ऑब्जेक्ट सबमिट करें.
lineItems
में आसानMenuItem
कोLineItem
के तौर पर दिखाया जाता है अरे, जिसमेंofferId
चुना हुआ मेन्यू आइटम है और मेन्यू मेंoffer.id
है फ़ीड.- ज़रूरी
MenuItemOption
वालेMenuItem
को इस तरह दिखाया जाता है:lineItems
कलेक्शन मेंLineItem
है, जहांofferId
को चुना गया है मेन्यू फ़ीड से मेन्यू आइटम विकल्प काoffer.id
. LineItem
काAddOnMenuItem
FoodItemExtension
केoptions
कलेक्शन मेंFoodItemOption
. हर विकल्प में, चुने गए ऐड-ऑन मेन्यू से जुड़ा एकofferId
होता है मेन्यू फ़ीड से आइटम कोoffer.id
. ध्यान दें कि AddOnmenuItem में नेस्ट किए गए AddOnमेन्यूItem(s) जिन्हें हर एक के अंदर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
इस उदाहरण में एक या उससे ज़्यादा AddOnमेन्यू आइटम के साथ मेन्यू आइटम शामिल हैं.
मेन्यू फ़ीड में मेन्यू आइटम:
{ "@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
इस उदाहरण में, मेन्यू आइटम के विकल्पों वाला एक मेन्यू आइटम है, AddOnमेन्यू आइटम और नेस्ट किए गए AddOnमेन्यूआइटम
मेन्यू फ़ीड में मेन्यू आइटम:
{ "@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
का इस्तेमाल करता है. आप इसका इस्तेमाल कर सकते हैं
प्रोसेसिंग के दौरान हुई एक या ज़्यादा गड़बड़ियों की पहचान करने के लिए रिस्पॉन्स देता है.
गड़बड़ियों को ठीक करने के दो तरीके हैं:
- ठीक की जा सकने वाली गड़बड़ियां: सबमिट करने के लिए, उपयोगकर्ता को अपने कार्ट में बदलाव करने की ज़रूरत नहीं है
ऑर्डर. उदाहरण के लिए, अगर आपको लगता है कि
Cart
के किसी आइटम में कीमत में बदलाव हुआ है. जवाब देने के लिए, गड़बड़ी का मैसेजFoodOrderError
टाइप किया जा सकता हैPRICE_CHANGED
,correctedProposedOrder
औरpaymentOptions
के साथ. Google उपयोगकर्ता को बदलाव की सूचना देता है, लेकिन उपयोगकर्ता कोcorrectedProposedOrder
. अगर उपयोगकर्ता वापस जाकर अपने कार्ट में बदलाव करना चाहता है, तो चाहते हैं. आपको नयाCheckoutRequestMessage
याSubmitOrderRequestMessage
. - ठीक न की जा सकने वाली गड़बड़ियां: उपयोगकर्ता को इससे पहले अपने कार्ट में बदलाव करना ज़रूरी है
आदेश सबमिट कर रहे हैं. उदाहरण के लिए, अगर आपको लगता है कि रेस्टोरेंट
बंद है, तो आप
FoodOrderError
गड़बड़ी प्रकार केCLOSED
के साथ जवाब दे सकते हैं. Google, उपयोगकर्ता को इसकी सूचना देता है और नए वर्शन पर अपडेट करने के लिए इंटरैक्शन को मैनेज करता है रेस्टोरेंट. नई कीमत के लिए आपको नयाCheckoutRequestMessage
मिलेगा
आम तौर पर, कार्ट-लेवल की गड़बड़ियों को ठीक न कर पाना और आइटम-लेवल की गड़बड़ियां दिखाना
ठीक किया जा सकता है. गड़बड़ी के टाइप और उनके मतलब की पूरी सूची देखने के लिए, देखें
FoodOrderError
.
कीमत में हुए बदलावों को मैनेज करना
चेकआउट के दौरान कीमत में बदलाव होना
अगर खरीदार का चेकआउट प्रोसेस करते समय कीमत से जुड़ी कोई समस्या आती है तो ये काम करें:
CheckoutRequestMessage
के लिएCheckoutResponseMessage
जिसमेंFoodErrorExtension
शामिल हो, जैसे हैंडलिंग से जुड़ी गड़बड़ियां में बताया गया है.- गड़बड़ी के जवाब में, कीमत अपडेट करने के लिए
correctedProposedOrder.cart
का इस्तेमाल करें सही वैल्यू का इस्तेमाल करें. Google को सही ऑर्डर मिलता है और हो सकता है कि वह नया ऑर्डर जारी करेCheckoutRequestMessage
.
चेकआउट के बाद, Google असली उपयोगकर्ता को ऑर्डर की पुष्टि करने वाला पेज दिखाता है.
भले ही, ProposedOrder
को बदला गया हो या नहीं.
अगर प्रस्तावित आदेश को सही किया गया था, तो Google इन्हें अतिरिक्त चेतावनियां दिखा सकता है:
उपयोगकर्ता को बदलावों के बारे में सूचित करता है. अगर उपयोगकर्ता ऑर्डर देने के लिए सहमत होता है, तो वहां
चेकआउट के कोई अनुरोध नहीं होंगे. इस फ़्लो में, प्रॉडक्ट को सबमिट करने का क्रम जारी रहता है. इसमें
ठीक किया गया ProposedOrder
.
हालांकि, यह उपयोगकर्ता कभी भी अपना कार्ट बदल सकता है और अपने कार्ट को दोबारा संपादित कर सकता है. टास्क कब शुरू होगा
इस तरह से, Google एक नया CheckoutRequestMessage
भेजता है.
सबमिट ऑर्डर के दौरान कीमत में बदलाव
अगर ऑर्डर सबमिट करने की प्रोसेस पूरी करते समय कीमत से जुड़ी कोई समस्या आती है
(actions.intent.TRANSACTION_DECISION
इंटेंट ट्रिगर हुआ), जवाब न दें
ठीक करने के लिए कहें या कीमत को अपडेट करें. अगर प्रॉडक्ट की कीमत, मात्रा,
या SubmitOrderRequestMessage
में दी गई अन्य जानकारी, इससे मेल नहीं खाती
तो orderState
को REJECTED
पर सेट करके जवाब दें कि
आदेश अनुरोध के अनुसार नहीं किया जा सकता.
इसके बाद, अगर ऑर्डर और पेमेंट के तरीके की जानकारी मान्य है, तो orderState
को CREATED
पर सेट करें
या CONFIRMED
. साथ ही, ऑर्डर के आईडी को दिखाने के लिए actionOrderId
शामिल करें
आपका सिस्टम. बाद के अपडेट भेजते समय, इस आईडी का इस्तेमाल करना ज़रूरी है.
अगर आप भुगतान संसाधित नहीं कर पा रहे हैं और पहले ही
SubmitOrderRequestMessage
, तो आप
orderState
वाले AsyncOrderUpdateRequestMessage
को REJECTED
पर सेट किया गया, ताकि
उपयोगकर्ता को पता है कि ऑर्डर पूरा नहीं होगा.
ऑर्डर सबमिट करने के बाद कीमत बदल जाती है
अगर आपको लगता है कि कीमत में बदलाव हुआ है, तो
अपना आदेश सबमिट कर दिया है, तो आप AsyncOrderUpdateRequestMessage
जारी कर सकते हैं, जैसा कि
नई कीमत के साथ, एसिंक्रोनस ऑर्डर अपडेट को लागू करना लेख में बताया गया है.
एक साथ काम नहीं करने वाले ऑर्डर के अपडेट का इस्तेमाल करके कीमतें अपडेट करने के लिए:
lineItemUpdates[x].price
में कीमत बदलें. यह वैल्यू से, आइटम की कुल कीमत का पता चलता है. इसमें ऐड-ऑन और गुणा किए गए आइटम की कीमत भी शामिल होती है संख्या के हिसाब से. (ज़्यादा जानकारी के लिए,LineItem
में सेprice
फ़ील्ड.)lineItemUpdates[x].reason
में जानकारी डालें.lineItemUpdates[x].orderState
सेट करेंCONFIRMED
तक.
आप
AsyncOrderUpdateRequestMessage पर निर्भर करता है, जो आपके विवेक पर निर्भर करता है. अगर लेन-देन पूरा नहीं होता है
(शायद इसलिए क्योंकि कीमत में उतार-चढ़ाव बहुत ज़्यादा है), तो
निम्न सेटिंग के साथ AsyncOrderUpdateRequestMessage
Google को इस गड़बड़ी की जानकारी देने के लिए OrderUpdate
:
orderState
कोREJECTED
पर सेट करें.label
फ़ील्ड में गड़बड़ी के बारे में बताएं.
चेकआउट की पुष्टि करना
जैसा कि चरण 4: चेकआउट लागू करना में बताया गया है, आपकी
हर ग्राहक के आने पर, फ़ुलफ़िलमेंट एंडपॉइंट को पुष्टि करनी चाहिए
CheckoutRequestMessage
पर क्लिक करें और CheckoutResponseMessage
में जवाब दें.
यहां CheckoutResponseMessage
का एक उदाहरण दिया गया है, जिससे
सत्यापन:
इस्तेमाल का उदाहरण | लागू करने का तरीका |
---|---|
इस्तेमाल का पहला उदाहरण: पुष्टि हो गई है | वापसी की तारीख: 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
शामिल होना चाहिए.
इस्तेमाल का उदाहरण | लागू करने का तरीका |
---|---|
इस्तेमाल का पहला उदाहरण: डिलीवरी का पता न होने की वजह से पुष्टि नहीं हो सकी रेंज से बाहर हो या डिलीवरी के पते में कोई समस्या हो | FoodOrderError के साथ FoodErrorExtension को वापसी करें
गड़बड़ी प्रकार OUT_OF_SERVICE_AREA का. |
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
.
इस्तेमाल का उदाहरण | लागू करने का तरीका |
---|---|
इस्तेमाल का पहला उदाहरण: ऑर्डर की कम से कम वैल्यू की वजह से पुष्टि नहीं हो सकी मिलता नहीं है | FoodOrderError के साथ FoodErrorExtension को वापसी करें
गड़बड़ी प्रकार REQUIREMENTS_NOT_MET का. |
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
वापस करना है वह:
इसमें FoodOrderError
गड़बड़ी टाइप है. CLOSED
या NO_CAPACITY
,
क्रम से.
इस्तेमाल का उदाहरण | लागू करने का तरीका |
---|---|
इस्तेमाल का पहला उदाहरण: रेस्टोरेंट बंद होने की वजह से पुष्टि नहीं हो सकी या अब काम नहीं करता | FoodOrderError के साथ FoodErrorExtension को वापसी करें
गड़बड़ी प्रकार CLOSED का. |
इस्तेमाल का दूसरा उदाहरण: पुष्टि नहीं हो सकी, क्योंकि रेस्टोरेंट व्यस्त है और फ़िलहाल, ऑर्डर नहीं लिए जा रहे हैं | FoodOrderError के साथ FoodErrorExtension को वापसी करें
गड़बड़ी प्रकार NO_CAPACITY का. |
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
ऑर्डर पूरा करने पर लौटाए गए प्रॉडक्ट में FoodOrderError
की गड़बड़ी वाला मैसेज शामिल होना चाहिए
AVAILABILITY_CHANGED
या PRICE_CHANGED
.
इस्तेमाल का उदाहरण | लागू करने का तरीका |
---|---|
इस्तेमाल का पहला उदाहरण: पुष्टि नहीं हो सकी, क्योंकि कुछ मेन्यू आइटम और/या उनके कस्टमाइज़ेशन मान्य नहीं हैं या स्टॉक में नहीं हैं | correctedProposedOrder के साथ FoodErrorExtension को वापसी करें,
PaymentOptions और FoodOrderError की गड़बड़ी
AVAILABILITY_CHANGED . अमान्य आइटमों को यहां से निकाल दिया जाना चाहिए
CorrectedProposedOrder . |
इस्तेमाल का दूसरा उदाहरण: पुष्टि नहीं हो सकी, क्योंकि कुछ मेन्यू आइटम और/या उनके कस्टमाइज़ेशन मान्य नहीं हैं या स्टॉक में नहीं हैं. सही किया गया कार्ट अब कम से कम ऑर्डर वैल्यू की ज़रूरी शर्त पूरी नहीं करती है. | FoodOrderError के साथ FoodErrorExtension को वापसी करें
गड़बड़ी के टाइप AVAILABILITY_CHANGED और
REQUIREMENTS_NOT_MET . |
इस्तेमाल का तीसरा उदाहरण: पुष्टि नहीं हो सकी, क्योंकि कुछ मेन्यू आइटम और/या कस्टमाइज़ेशन मूल्य बदल गए हैं | correctedProposedOrder के साथ FoodErrorExtension को वापसी करें,
PaymentOptions और FoodOrderError की गड़बड़ी
PRICE_CHANGED . पुरानी कीमतें
CorrectedProposedOrder . |
इस्तेमाल का चौथा उदाहरण: पुष्टि नहीं हो सकी, क्योंकि कुछ मेन्यू आइटम और/या कस्टमाइज़ेशन मूल्य बदल गए हैं. सही किया गया कार्ट अब कम से कम ऑर्डर वैल्यू की शर्त | FoodOrderError के साथ FoodErrorExtension को वापसी करें
गड़बड़ी के टाइप PRICE_CHANGED और
REQUIREMENTS_NOT_MET . |
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
का एक उदाहरण दिया गया है, जिससे
सत्यापन:
इस्तेमाल का उदाहरण | लागू करने का तरीका |
---|---|
इस्तेमाल का पहला उदाहरण: ऑर्डर बना दिया गया है | CREATED ऑर्डर के साथ SubmitOrderResponseMessage
राज्य. इसमें actionOrderId ,
userVisibleId , orderManagementActions , और
estimatedFulfillmentTime . |
इस्तेमाल का दूसरा उदाहरण: पेमेंट से जुड़ी समस्याओं की वजह से ऑर्डर अस्वीकार कर दिया गया | REJECTED ऑर्डर के साथ SubmitOrderResponseMessage
राज्य. इसमें actionOrderId ,
userVisibleId , orderManagementActions , और
PAYMENT_DECLINED के टाइप का rejectionInfo . |
इस्तेमाल का तीसरा उदाहरण: उपयोगकर्ता के लिए, ऑर्डर को अस्वीकार कर दिया गया है और उसे 'प्रतिबंधित' के तौर पर फ़्लैग किया गया है | REJECTED ऑर्डर के साथ SubmitOrderResponseMessage
स्थिति. इसमें actionOrderId ,
userVisibleId , orderManagementActions , और
INELIGIBLE के टाइप का rejectionInfo . |
इस्तेमाल का चौथा उदाहरण: ऑर्डर अस्वीकार कर दिया गया है, क्योंकि उपयोगकर्ता की जानकारी अधूरा या अमान्य | REJECTED ऑर्डर के साथ SubmitOrderResponseMessage
राज्य. इसमें actionOrderId ,
userVisibleId , orderManagementActions , और
INELIGIBLE के टाइप का rejectionInfo . |
इस्तेमाल का पांचवा उदाहरण: ऑर्डर को अस्वीकार कर दिए जाने की वजह पता नहीं है | 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" } } } ] } } } ] } } }