نقشهبرداری فیدهای منو و اقلام سبد خرید
وقتی مشتریان مواردی را از فید منوی شما به سبد خرید خود اضافه میکنند و بررسی میکنند، Google آن موارد را به نقطه پایانی شما ارسال میکند تا قیمت و در دسترس بودن آنها را تأیید کند. پس از تایید قیمت و در دسترس بودن، مشتری می تواند سفارش را ثبت کند. این بخش نحوه نگاشت آیتم های خوراک منو به اقلام سبد خرید را نشان می دهد.
نمونههای موجود در این بخش، نسخههای پاکشده فید منو و طرح سبد خرید هستند. فقط فیلدهای مربوط به نشان دادن نگاشت بین خوراک منو و شی سبد خرید نشان داده می شوند. برای طرحوارههای کامل، Menu
و Cart
را ببینید.
موارد موجود در فید Menu
که به یک سبد خرید اضافه می شوند در شیء Cart
هم برای تسویه حساب و هم برای ارسال سفارش ارسال می شوند.
- یک
MenuItem
ساده بهعنوانLineItem
در آرایهlineItems
نشان داده میشود کهofferId
گزینهoffer.id
مورد انتخابی منو در فید Menu است. - یک
MenuItem
با یکMenuItemOption
مورد نیاز بهعنوان یکLineItem
در آرایهlineItems
نشان داده میشود کهofferId
گزینه گزینه گزینه منویoffer.id
از فید Menu است. - یک
AddOnMenuItem
از یکLineItem
به عنوان یکFoodItemOption
در آرایهoptions
FoodItemExtension
نشان داده می شود. هر گزینه دارای یکofferId
است که باoffer.id
آیتم منوی افزودنی انتخاب شده از فید Menu مطابقت دارد. توجه داشته باشید که یک 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
که حاوی یک FoodErrorExtension
به جای CheckoutResponse است، پاسخ دهید. می توانید از این پاسخ برای شناسایی یک یا چند خطا که در حین پردازش رخ داده است استفاده کنید.
2 راه برای رسیدگی به خطاها وجود دارد:
- خطاهای قابل بازیابی: کاربر برای ارسال سفارش نیازی به ویرایش سبد خرید خود ندارد. به عنوان مثال، اگر تشخیص دهید که یک کالا در
Cart
دارای تغییر قیمت است، میتوانید باFoodOrderError
از نوع خطاPRICE_CHANGED
، همراه باcorrectedProposedOrder
وpaymentOptions
پاسخ دهید. Google کاربر را از تغییر مطلع میکند، اما به کاربر اجازه میدهد تا باcorrectedProposedOrder
سفارش ارسال کند. کاربر همچنین می تواند در صورت تمایل برگردد و سبد خرید خود را ویرایش کند. شما یا یکCheckoutRequestMessage
یا یکSubmitOrderRequestMessage
دریافت خواهید کرد. - خطاهای غیر قابل جبران: کاربر موظف است قبل از ارسال سفارش، سبد خرید خود را ویرایش کند. برای مثال، اگر تشخیص دادید که رستوران بسته است، میتوانید با خطای
FoodOrderError
از نوعCLOSED
پاسخ دهید. گوگل به کاربر اطلاع می دهد و تعامل را برای به روز رسانی به یک رستوران جدید مدیریت می کند. شما یکCheckoutRequestMessage
جدید برای یک سبد خرید دریافت خواهید کرد.
به طور کلی، خطاهای سطح سبد خرید را غیرقابل بازیابی و خطاهای سطح مورد را قابل بازیابی کنید. برای فهرست کامل انواع خطا و معانی آنها، FoodOrderError
را ببینید.
مدیریت تغییرات قیمت
قیمت در هنگام تسویه حساب تغییر می کند
اگر هنگام پردازش درخواست تسویه حساب مشتری با مشکل قیمت مواجه شدید، موارد زیر را انجام دهید:
- همانطور که در Handling errors توضیح داده شده است، با یک
CheckoutResponseMessage
حاوی یکFoodErrorExtension
بهCheckoutRequestMessage
پاسخ دهید. - در پاسخ به خطا، از
correctedProposedOrder.cart
برای به روز رسانی قیمت به مقدار صحیح استفاده کنید. Google سفارش اصلاح شده را دریافت می کند و ممکن است یکCheckoutRequestMessage
جدید صادر کند.
پس از پرداخت، گوگل یک صفحه تایید سفارش را به کاربر نهایی نمایش می دهد، صرف نظر از اینکه ProposedOrder
تغییر کرده است یا خیر.
اگر سفارش پیشنهادی تصحیح شد، ممکن است Google اخطارهای بیشتری برای اطلاع کاربر از تغییرات نشان دهد. در صورت موافقت کاربر با ثبت سفارش، دیگر درخواست پرداخت وجود نخواهد داشت. این جریان به ارسال سفارش ادامه میدهد، با ProposedOrder
اصلاحشده.
با این حال، کاربر همیشه می تواند نظر خود را تغییر دهد و دوباره سبد خرید خود را ویرایش کند. وقتی سبد خرید آنها به این روش بهروزرسانی میشود، Google یک CheckoutRequestMessage
جدید ارسال میکند.
تغییر قیمت در حین ارسال سفارش
اگر هنگام پردازش ارسال سفارش با مشکل قیمت مواجه شدید (هدف actions.intent.TRANSACTION_DECISION
فعال شد)، با خطا پاسخ ندهید یا قیمت را در پاسخ خود بهروزرسانی نکنید. اگر قیمتها، مقادیر یا سایر جزئیات موجود در SubmitOrderRequestMessage
با دادههای شما مطابقت ندارد، با orderState
که روی REJECTED
تنظیم شده است پاسخ دهید تا نشان دهید که سفارش نمیتواند طبق درخواست انجام شود.
سپس، اگر جزئیات سفارش و پرداخت معتبر هستند، orderState
را روی CREATED
یا CONFIRMED
تنظیم کنید. همچنین، یک actionOrderId
برای نشان دادن شناسه سفارش در سیستم خود قرار دهید. این شناسه باید هنگام ارسال به روز رسانی های بعدی استفاده شود.
اگر نمیتوانید پرداخت را پردازش کنید و قبلاً SubmitOrderRequestMessage
را ارسال کردهاید، میتوانید یک AsyncOrderUpdateRequestMessage
با orderState
تنظیم شده روی REJECTED
ارسال کنید تا به کاربر اطلاع دهید که سفارش انجام نمیشود.
تغییر قیمت پس از ارسال سفارش
اگر تشخیص دادید که قیمتی نسبت به قیمتی که هنگام ارسال سفارش مشتری استفاده میشد تغییر کرده است، میتوانید یک AsyncOrderUpdateRequestMessage
، همانطور که در اجرای بهروزرسانیهای سفارش ناهمزمان توضیح داده شده است، با قیمت جدید صادر کنید.
برای بهروزرسانی قیمتها با استفاده از بهروزرسانیهای سفارش ناهمگام:
- قیمت را در
lineItemUpdates[ x ].price
تغییر دهید. این مقدار هزینه کل کالا را منعکس می کند، از جمله افزودنی ها و ضرب در مقدار. (برای اطلاعات بیشتر به توضیحات قسمتprice
LineItem
مراجعه کنید.) - توضیحی را در
lineItemUpdates[ x ].reason
وارد کنید. -
lineItemUpdates[ x ].orderState
را رویCONFIRMED
تنظیم کنید.
میتوانید بنا به صلاحدید خود، قبل یا بعد از ارسال AsyncOrderUpdateRequestMessage، ابزار پرداخت را شارژ کنید. اگر تراکنش با شکست مواجه شد (احتمالاً به دلیل بالا بودن دلتای قیمت)، یک AsyncOrderUpdateRequestMessage با تنظیمات زیر در OrderUpdate
ارسال کنید تا Google را از شکست مطلع کنید:
-
orderState
را رویREJECTED
تنظیم کنید. - خرابی را در قسمت
label
توضیح دهید.
اعتبار سنجی پرداخت
همانطور که در مرحله 4 بحث شد: اجرای Checkout ، نقطه پایانی شما باید اعتبارسنجی را در هر 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: اعتبارسنجی ناموفق بود زیرا آدرس تحویل خارج از محدوده است یا مشکلی در آدرس تحویل وجود دارد | بازگشت FoodErrorExtension با FoodOrderError از نوع خطا 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
باشد.
مورد استفاده | نحوه پیاده سازی |
---|---|
استفاده از مورد 1: اعتبارسنجی انجام نشد زیرا حداقل مقدار سفارش برآورده نشده است | بازگشت FoodErrorExtension با FoodOrderError از نوع خطا 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
باشد.
مورد استفاده | نحوه پیاده سازی |
---|---|
مورد استفاده 1: اعتبارسنجی انجام نشد زیرا رستوران بسته شده یا دیگر پشتیبانی نمیشود | بازگشت FoodErrorExtension با FoodOrderError از نوع خطا CLOSED . |
مورد استفاده 2: اعتبارسنجی انجام نشد زیرا رستوران شلوغ است و در حال حاضر سفارش نمیگیرد | بازگشت FoodErrorExtension با FoodOrderError از نوع خطا 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
باشد.
مورد استفاده | نحوه پیاده سازی |
---|---|
مورد استفاده 1: اعتبارسنجی ناموفق بود زیرا برخی از موارد منو و/یا سفارشیسازیهای آنها معتبر نیستند یا موجود نیستند | FoodErrorExtension با correctedProposedOrder ، PaymentOptions و FoodOrderError از نوع خطا AVAILABILITY_CHANGED برگردانید. موارد نامعتبر باید از CorrectedProposedOrder حذف شوند. |
استفاده از مورد 2: اعتبارسنجی ناموفق بود زیرا برخی از موارد منو و/یا سفارشیسازیهای آنها معتبر نیستند یا موجودی ندارند. سبد خرید اصلاح شده دیگر با حداقل مقدار سفارش مورد نیاز نیست. | بازگشت FoodErrorExtension با FoodOrderError از انواع خطاهای AVAILABILITY_CHANGED و REQUIREMENTS_NOT_MET . |
مورد استفاده 3: اعتبارسنجی ناموفق بود زیرا برخی از موارد منو و/یا قیمتهای سفارشیسازی تغییر کردهاند | FoodErrorExtension با correctedProposedOrder ، PaymentOptions و FoodOrderError از نوع خطا PRICE_CHANGED برگردانید. قیمت های قدیمی باید در CorrectedProposedOrder به روز شوند. |
مورد استفاده 4: اعتبارسنجی ناموفق بود زیرا برخی از آیتمهای منو و/یا قیمتهای سفارشیسازی تغییر کردهاند. سبد خرید اصلاح شده دیگر با حداقل مقدار سفارش مورد نیاز نیست | بازگشت FoodErrorExtension با FoodOrderError از انواع خطا 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
برای اعتبارسنجی موفقیت آمیز آمده است:
مورد استفاده | نحوه پیاده سازی |
---|---|
مورد استفاده 1: سفارش با موفقیت ایجاد شد | یک SubmitOrderResponseMessage با وضعیت سفارش CREATED . باید actionOrderId ، userVisibleId ، orderManagementActions و estimatedFulfillmentTime باشد. |
مورد استفاده 2: سفارش به دلیل مشکلات پرداخت رد می شود | یک SubmitOrderResponseMessage با وضعیت سفارش REJECTED . باید actionOrderId ، userVisibleId ، orderManagementActions و rejectionInfo از نوع PAYMENT_DECLINED داشته باشد. |
مورد استفاده 3: سفارش رد می شود زیرا کاربر به عنوان ممنوع علامت گذاری شده است | یک SubmitOrderResponseMessage با وضعیت سفارش REJECTED . باید actionOrderId , userVisibleId , orderManagementActions و rejectionInfo از نوع INELIGIBLE داشته باشد . |
مورد استفاده 4: سفارش رد می شود زیرا اطلاعات کاربر ناقص یا نامعتبر است | یک SubmitOrderResponseMessage با وضعیت سفارش REJECTED . باید actionOrderId , userVisibleId , orderManagementActions و rejectionInfo از نوع INELIGIBLE داشته باشد . |
مورد استفاده 5: سفارش به دلیل نامعلوم رد می شود | یک SubmitOrderResponseMessage با وضعیت سفارش REJECTED . باید actionOrderId , userVisibleId , orderManagementActions و rejectionInfo از نوع UNKNOWN داشته باشد . |
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" } } } ] } } } ] } } }