מיפוי של פידים בתפריט מיפוי ואת הפריטים בעגלת הקניות
כשלקוחות מוסיפים פריטים מפיד התפריט לעגלת הקניות ומבצעים תשלום, Google שולחת את הפריטים האלה לנקודת הקצה של מילוי ההזמנות כדי לאמת את המחיר שלהם זמינות. אחרי אימות התמחור והזמינות, הלקוח יוכל לבצע את ההזמנה. בקטע הזה מוסבר איך למפות את האפשרויות בפיד של התפריט אל פריטים בעגלת הקניות.
קטעים לדוגמה בקטע הזה הם גרסאות שהוסרו מפיד התפריט ומעגלת הקניות.
של Google. רק שדות שרלוונטיים להמחשת המיפוי בין פיד התפריט לבין
מוצג האובייקט Cart. לסכימות מלאות, ראו Menu
וCart
.
פריטים בפיד Menu
שנוספים לעגלת קניות נשלחים דרך Cart
.
שלנו, גם לתשלום וגם לשליחת הזמנה.
MenuItem
פשוט מיוצג בתורLineItem
בlineItems
מערך שבוofferId
הוא ה-offer.id
של האפשרות שנבחרה בתפריט שבפיד.MenuItem
עםMenuItemOption
חובה מיוצג בתורLineItem
במערךlineItems
כאשרofferId
נבחר אפשרותoffer.id
של האפשרות בתפריט מהפיד.AddOnMenuItem
שלLineItem
מיוצג בתורFoodItemOption
במערךoptions
שלFoodItemExtension
. לכל אפשרות יש שדהofferId
שתואם לתפריט התוספים שנבחרoffer.id
של הפריט בפיד התפריט. לתשומת ליבכם: AddOnתפריטItem יכול לכלול גם תוספים מקוננים מסוג 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
בדוגמה הזו יש פריט בתפריט עם תוסף אחד או יותר AddOnSyncItems.
אפשרויות בתפריט בפיד של תפריטים:
{ "@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
הדוגמה הזו מכילה אפשרות בתפריט עם אפשרויות בתפריט, AddOnOptionsItemItems, ו-AddOnתפריטItems בתצוגת עץ
אפשרויות בתפריט בפיד של תפריטים:
{ "@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
. Google מיידעת את המשתמש ומנהלת את האינטראקציה כדי לעדכן אותו מסעדה. נשלח לךCheckoutRequestMessage
חדש עבור בעגלת הקניות.
באופן כללי, שגיאות ברמת עגלת הקניות יהיו בלתי ניתנות לשחזור ושגיאות ברמת הפריט.
אפשר לשחזר. רשימה מלאה של סוגי השגיאות והמשמעות שלהם זמינה במאמר
FoodOrderError
טיפול בשינויים במחירים
שינויים במחירים במהלך התשלום בקופה
אם נתקלתם בבעיה במחיר במהלך עיבוד התשלום של לקוח לבצע את הפעולות הבאות:
- להשיב ל-
CheckoutRequestMessage
עםCheckoutResponseMessage
שמכילFoodErrorExtension
, כמו מתוארות במאמר טיפול בשגיאות. - בתשובת השגיאה, משתמשים בפונקציה
correctedProposedOrder.cart
כדי לעדכן את המחיר לערך הנכון. Google תקבל את ההזמנה המתוקנת ועשויה להנפיק הזמנה חדשהCheckoutRequestMessage
בסיום התשלום, Google מציגה למשתמש הקצה דף אישור הזמנה,
בין אם ProposedOrder
השתנה או לא.
אם הזמנה מסוג ProposedOrder תוקנה, Google עשויה להציג אזהרות נוספות עבור
להודיע למשתמש על השינויים. אם המשתמש מסכים לבצע את ההזמנה,
לא יהיו יותר בקשות תשלום. התהליך ממשיך לסדר את השליחה באמצעות
ProposedOrder
המתוקן.
עם זאת, המשתמש תמיד יכול לשנות את דעתו ולערוך שוב את עגלת הקניות. מתי
את עדכוני עגלת הקניות באופן הזה, Google תשלח CheckoutRequestMessage
חדש.
שינויים במחיר במהלך שליחת ההזמנה
אם נתקלתם בבעיה במחיר במהלך הטיפול בשליחת הזמנה
(כוונת ה-Intent actions.intent.TRANSACTION_DECISION
הופעלה), אין להשיב
כולל שגיאה או לעדכן את המחיר בתשובה. אם המחירים, הכמויות,
או פרטים אחרים ב-SubmitOrderRequestMessage
לא תואמים
של הנתונים שלך, עליך להשיב כשorderState
מוגדר כ-REJECTED
כדי לציין
לא ניתן לבצע את ההזמנה כפי שהתבקש.
לאחר מכן, אם פרטי ההזמנה והתשלום תקינים, צריך להגדיר לפרמטר orderState
את הערך CREATED
או CONFIRMED
. צריך לכלול גם actionOrderId
לייצוג מזהה ההזמנה
במערכת שלך. חובה להשתמש במזהה הזה כששולחים עדכונים נוספים.
אם לא הצלחת לעבד את התשלום וכבר שלחת
SubmitOrderRequestMessage
, אפשר לשלוח
AsyncOrderUpdateRequestMessage
עם orderState
מוגדר ל-REJECTED
כדי לאפשר
המשתמש יודע שההזמנה לא תבוצע.
המחיר ישתנה אחרי שליחת ההזמנה
אם קובעים שמחיר מסוים השתנה מהמחיר שבו נעשה שימוש כשלקוח
שלח את ההזמנה שלו, תוכלו להנפיק AsyncOrderUpdateRequestMessage
, כמו
שמתואר ביישום של עדכוני הזמנות אסינכרוניים, עם המחיר החדש.
כדי לעדכן מחירים באמצעות עדכוני הזמנות אסינכרוניים:
- משנים את המחיר ב
lineItemUpdates[x].price
. הזה value משקף את העלות הכוללת של הפריט, כולל תוספים ומכפיל בכמות. (למידע נוסף, עיינו בתיאור שדהprice
שלLineItem
). - צריך להזין הסבר ב
lineItemUpdates[x].reason
. - הגדרה של
lineItemUpdates[x].orderState
אלCONFIRMED
.
ניתן לנסות לחייב את אמצעי התשלום לפני או אחרי שליחת אמצעי התשלום
AsyncOrderUpdateRequestMessage, לפי שיקול דעתכם. אם העסקה נכשלה
(אולי בגלל שמחיר דלתא גבוה מדי), שלח
AsyncOrderUpdateRequestMessage עם ההגדרות הבאות ב-
OrderUpdate
כדי להודיע ל-Google על התקלה:
- מגדירים את
orderState
להיותREJECTED
. - צריך לתאר את הכשל בשדה
label
.
אימות דף התשלום
כפי שצוין בשלב 4: הטמעת Google 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" } } } ] } } } ] } } }