אתם יכולים להוסיף תמיכה בתהליך ההזמנה כדי לאפשר למשתמשים לקבוע מראש מועד לאיסוף עצמי ולמשלוח של הזמנות ממסעדות. לפני שמטמיעים את התמיכה הזו בתהליך ההזמנה, צריך ליצור פיד מלאי שטחי פרסום של שירותים שבו מצוינות השעות שבהן המשתמשים יכולים לבצע הזמנות מראש, כפי שמתואר בסכימה של פיד המלאי (AdvanceServiceDeliveryHoursSpecification
).
משבצות להזמנות מראש
Google מציעה חלונות הזמנה מראש בחלוקות של 15 דקות, עד 7 ימים מראש, על סמך זמני האספקה של המסעדה או השירות (כפי שהם מוגדרים בAdvanceServiceDeliveryHoursSpecification
).
כדי לאחזר את המועדים המוצעים להזמנה מראש, משתמשים בערכים הבאים מהשדה fulfillmentPreference
של האובייקט FoodCartExtension
בקופה:
PickupInfo.pickupTimeIso8601
DeliveryInfo.deliveryTimeIso8601
הטמעת הזמנות מראש בקופה
בטבלה הבאה מפורטות הדרכים האפשריות להטמיע את התשובה של חברת השליחויות בזמן התשלום, כשמשתמשים מנסים לבצע הזמנות.
תרחיש | התנהגות הטיפול בהזמנות |
---|---|
ניתן למלא הזמנה מראש עבור המרווח הזמן המבוקש. | כדי לאשר את עגלת הקניות P0M ('בהקדם האפשרי') או FUTURE_SLOT , יוצרים ProposedOrder עם אותו חריץ. דוגמה לתגובה של תהליך התשלום שמאשרת מיקום מודעה מופיעה בקטע הקוד הזה. |
לא ניתן למלא את ההזמנה מראש לשקע הזמן המבוקש. | חברת השליחויות צריכה לבצע את הפעולות הבאות:
דוגמה לתגובה של תהליך התשלום עם הצעה למיקומי מודעות חלופיים מופיעה בקטע הקוד הזה. |
משבצות זמן חלופיות להשלמת הזמנות
בקופה, אם המועדים להזמנה מראש שהוצעו על ידי Google לא מתאימים, צוות התמיכה בשירותי המילוי יכול להציע חלופות באמצעות האובייקט CheckoutResponseMessage
.
כדי לציין מועדים חלופיים להזמנה מראש, צריך להשיב לבקשת התשלום באמצעות FoodErrorExtension
ולהגדיר את הערכים הבאים:
- בפרמטר
foodOrderErrors
, מציינים את סוג השגיאה (למשלUNAVAILABLE_SLOT
,NO_CAPACITY
אוCLOSED
). - בפרמטר
correctedProposedOrder
, מספקים ערכים חלופיים שלP0M
אוFUTURE_SLOT
באמצעותavailableFulfillmentOptions
.
התורים החלופיים צריכים להיות ל-7 הימים הבאים ממועד ביצוע ההזמנה, ולכלול את כל התורים שבהם ניתן למלא את עגלת הקניות שהמשתמש ביקש.
לדוגמה, נניח שהמבצעים המיוחדים לעסקיות זמינים רק בימים שני עד שישי, מ-11:00 עד 13:00. לאחר מכן המשתמש מנסה להוסיף לעגלת הקניות עסקיות לעסקיות, אבל השעה שנבחרה לא זמינה. במקרה כזה, צוות התמיכה בנושאי תמיכה בלקוחות צריך להשאיר את המבצעים של ארוחת הצהריים בעגלת הקניות, ולהציג רק את המועדים בין 11:00 ל-13:00 ב-7 הימים הבאים.
צריך להשמיט את האובייקט correctedProposedOrder.Cart.fulfillmentPreference
בתגובה.
אם אין זמינות, או אם המסעדה או השירות לא תומכים בהזמנות מראש, אין צורך לספק correctedProposedOrder
.
בדוגמאות שבהמשך מפורטות ההודעות בפורמט JSON שנשלחות בין חברת האספקה ל-Google במהלך תהליך התשלום והתשובות להזמנה מראש, כשהמסעדה או השירות זמינים לקבלת הזמנות מראש.
דוגמה: CheckoutRequest עם חלון זמן למסירה
בקטע הקוד הבא מוצגת דוגמה לבקשת תשלום עם חלון זמן למסירת הזמנה מראש.
{
"inputs": [
{
"intent": "actions.foodordering.intent.CHECKOUT",
"arguments": [
{
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.Cart",
"merchant": {
"id": "https://www.exampleprovider.com/merchant/id1",
"name": "Cucina Venti"
},
"lineItems": [
{
"name": "Sizzling Prawns Dinner",
"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": "16",
"nanos": 750000000
}
},
}
],
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
"fulfillmentPreference": {
"fulfillmentInfo": {
"delivery": {
// Deliver at 6:30PM.
"deliveryTimeIso8601": "2017-12-14T18:30:00-07:00"
}
}
},
"location": {
...
}
}
}
}
]
}
]
}
דוגמה: CheckoutResponse שמאשר את המועד
קטע הקוד הבא מציג דוגמה לתשובה של תהליך התשלום, שבה שירות המילוי מאשר את המועדים המוצעים להזמנה מראש.
{
"expectUserResponse": false,
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"checkoutResponse": {
"proposedOrder": {
"id": "sample_proposed_order_id_1",
"cart": {
"merchant": {
"id": "https://www.exampleprovider.com/merchant/id1",
"name": "Falafel Bite"
},
"lineItems": [
{
"name": "Sizzling Prawns Dinner",
"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": "16",
"nanos": 750000000
}
},
}
],
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
"fulfillmentPreference": {
"fulfillmentInfo": {
"delivery": {
// Same as the time in the request.
"deliveryTimeIso8601": "2017-12-14T18:30:00-07:00"
}
}
},
"location": {
...
}
}
},
"totalPrice": {
"type": "ESTIMATE",
"amount": {
// Represents $16.75
"currencyCode": "USD",
"units": "16",
"nanos": 750000000
}
},
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension",
// Send whole proposed order back.
"availableFulfillmentOptions": [
"fulfillmentInfo": {
"delivery": {
// Same as the time in the request.
"deliveryTimeIso8601": "2017-12-14T18:30:00-07:00"
}
}
]
}
},
"paymentOptions": {
...
}
}
}
}
]
}
}
}
דוגמה: CheckoutResponse עם משבצות חלופיות
קטע הקוד הבא מציג דוגמה לתשובה בתהליך התשלום, שבה שירותי המילוי מציגים חלופות למועדים חלופיים להזמנה מראש. חשוב לזכור להשמיט את האובייקט correctedProposedOrder.Cart.fulfillmentPreference
בתשובה.
{
"expectUserResponse": false,
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"error": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension",
"foodOrderErrors": [
{
"error": "UNAVAILABLE_SLOT", // Cart level error
"description": "The restaurant is closed."
}
],
"correctedProposedOrder": {
// Send whole original cart back,
// without the fulfillmentPreference.
"cart": {
...
},
"otherItems": {
...
},
"totalPrice": {
...
},
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension",
"availableFulfillmentOptions": [
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "2017-12-14T19:00:00-07:00"
}
},
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "2017-12-14T19:30:00-07:00"
}
},
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "2017-12-14T20:00:00-07:00"
}
}
]
}
},
"paymentOptions": {
...
}
}
}
}
]
}
}
}
הטמעת הזמנות מראש בשלב שליחת ההזמנה
אם יש בעיה בזמני ההזמנה מראש, צריך לציין את הסיבה (למשל UNAVAILABLE_SLOT
או UNKNOWN
) באובייקט RejectionInfo
ב-SubmitOrderResponseMessage
בזמן שליחת ההזמנה.
מעדכנים את המצב של ההזמנה מ-CREATED
ל-CONFIRMED
באובייקט OrderState
כשהספק מקבל את ההזמנה. צריך לכלול את חלון הזמן שנבחר באימייל האישור ששולחים למשתמש.
אם חברת ההזמנות שולחת את ההזמנה למסעדה מאוחר יותר, צריך לשלוח ל-Google עדכון באמצעות פעולת עדכון אסינכררונית של הזמנה.
באובייקט OrderUpdate
בתשובה לשליחת ההזמנה מהספק או בעדכונים אסינכרונים של ההזמנה, צריך לכלול את הערך estimatedFulfillmentTimeIso8601
עם הערך הבא:
- כשסטטוס ההזמנה הוא
CREATED
אוCONFIRMED
, מגדירים את הערך לשעת המסירה או האיסוף שהמשתמש קבע להזמנה מראש. - אם יש זמן אספקה משוער מדויק יותר מהמסעדה או מהשירות, צריך להגדיר את הערך כזמן האספקה המשוער או כזמן האיסוף.
דוגמה: שליחת בקשה להזמנה עם חלון זמן למסירה
קטע הקוד הבא מציג דוגמה לבקשת שליחת הזמנה עם ציון המועד שנקבע מראש להזמנה שהמשתמש בחר.
{
"inputs": [
{
"intent": "actions.intent.TRANSACTION_DECISION",
"arguments": [
{
"transactionDecisionValue": {
"order": {
"finalOrder": {
"cart": {
"notes": "Guest prefers their food to be hot when it is delivered.",
"merchant": {
"id": "https://www.exampleprovider.com/merchant/id1",
"name": "Cucina Venti"
},
"lineItems": [
{
"name": "Sizzling Prawns Dinner",
"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": "16",
"nanos": 750000000
}
}
}
],
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
"fulfillmentPreference": {
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "2017-12-14T18:30:00-07:00"
}
}
}
"contact": {
...
}
}
},
"totalPrice": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "USD",
"units": "16",
"nanos": 750000000
}
},
"id": "sample_final_order_id",
"extension": {
// Send whole proposed order back.
"availableFulfillmentOptions": [
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "2017-12-14T18:30:00-07:00"
}
]
}
},
"googleOrderId": "sample_google_order_id",
"orderDate": "2017-07-17T12:00:00Z",
"paymentInfo": {
...
}
}
}
}
]
}
]
}
דוגמה: SubmitOrderResponse לאישור ההזמנה
קטע הקוד הבא מציג דוגמה לתשובה על שליחת הזמנה, שבה שירות המילוי מאשר שהוא קיבל את ההזמנה מראש של המשתמש.
{
"expectUserResponse": false,
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"orderUpdate": {
"actionOrderId": "sample_action_order_id",
"orderState": {
"state": "CREATED",
"label": "Order placed"
},
"receipt": {
"userVisibleOrderId": "userVisibleId1234"
},
"updateTime": "2017-07-17T12:00:00Z",
"orderManagementActions": [
...
],
"infoExtension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension",
// Same as the user selected time.
"estimatedFulfillmentTimeIso8601": "2017-12-14T18:30:00-07:00"
}
}
}
}
]
}
}
}
דוגמה: SubmitOrderResponse שדוחה את ההזמנה כי משבצת הזמן לא זמינה
קטע הקוד הבא מציג דוגמה לתגובה להזמנה שהוגשה, שבה שירות המילוי שלכם דוחה הזמנה מראש של משתמש בגלל מקום פנוי לא זמין.
{
"expectUserResponse": false,
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"orderUpdate": {
"actionOrderId": "sample_action_order_id",
"orderState": {
"state": "REJECTED",
"label": "Unavailable slot"
},
"rejectionInfo": {
// Note that this UNAVAILABLE_SLOT is different from the enum
// with the same name proposed for FoodOrderError.
"state": "UNAVAILABLE_SLOT",
"label": "Unavailable slot"
},
"updateTime": "2017-07-17T12:00:00Z",
"orderManagementActions": [
...
]
}
}
}
]
}
}
}
דוגמאות להזמנות מראש
אפשר להשתמש בסוג AdvanceServiceDeliveryHoursSpecification
כדי לציין את שעות המסירה או האיסוף, כדי שהמשתמשים יוכלו לתזמן מראש את ההזמנה.
הערה: יש שני חלונות זמן נפרדים שצריך לציין לצורך ביצוע השירות: חלון ההזמנות, שמציין מתי המשתמשים יכולים לבצע הזמנה, וחלון הביצוע, שמציין מתי ההזמנה תבוצע. האובייקט
מגדיר מתי המשתמש יכול לבצע את ההזמנה. זמני הביצוע של הצאצאים (OpeningHoursSpecification
או ServiceDeliveryHoursSpecification
) קובעים מתי אפשר למלא את ההזמנה.AdvanceServiceDeliveryHoursSpecification
בדוגמה הבאה מוגדר שעות הפעילות של שירות לקבלת הזמנות מראש, עם מרווחים של 15 דקות בין זמנים זמינים.
{ "hoursAvailable": [ { "@type": "OpeningHoursSpecification", "opens": "T00:00:00", // Ordering available 24 hours "closes": "T23:59:59", "deliveryHours": [ { "@type": "ServiceDeliveryHoursSpecification", "opens": "T09:00:00", // ASAP orders b/w 9am and 8:59:59pm "closes": "T21:00:00", "deliveryLeadTime": { "value": "60", "unitCode": "MIN" } }, { "@type": "AdvanceServiceDeliveryHoursSpecification", "opens": "T10:00:00", // Delivery between 10AM and 7:59:59PM "closes": "T20:00:00", "serviceTimeInterval": "PT15M", // in slots spaced 15 minutes apart (ISO8601) "advanceBookingRequirement": { "minValue": 60, // The slot should be at least 60 mins away "maxValue": 8640, // but not more than 6 days away "unitCode": "MIN" } } ] } ] }
הדוגמה הבאה מראה איך אפשר לציין שהשירות פתוח להזמנות באותו יום בחג המולד, אבל סגור להזמנות מראש שתוזמנו לאותו יום. הדוגמה הזו תומכת בתרחישים הבאים:
- המשתמשים יכולים לבצע הזמנה ב-25 בדצמבר למשלוח באותו יום.
- המשתמשים יכולים לבצע הזמנה מראש ב-25 בדצמבר, עם משלוח מתוזמן ל-27 בדצמבר.
- משתמשים לא יכולים לבצע הזמנה מראש ב-22 בדצמבר למשלוח מתוזמן ל-25 בדצמבר.
{ "specialOpeningHoursSpecification": { "@type": "AdvanceServiceDeliveryHoursSpecification", "validFrom": "2018-12-25T00:00:00-07:00", "validThrough": "2018-12-26T00:00:00-07:00", "opens": "T00:00:00", // No advance ordering "closes": "T00:00:00" } }
בדוגמה הבאה מוסבר איך לציין שהשירות סגור להזמנות באותו יום או להזמנות מראש שתקובענה ליום חג המולד, אבל פתוח להזמנות מראש שתקובענה ליום מאוחר יותר. הדוגמה הזו תומכת בתרחישים הבאים:
- המשתמשים לא יכולים לבצע הזמנה ב-25 בדצמבר למשלוח באותו יום.
- המשתמשים יכולים לבצע הזמנה מראש ב-25 בדצמבר, עם משלוח מתוזמן ל-27 בדצמבר.
- משתמשים לא יכולים לבצע הזמנה מראש ב-22 בדצמבר למשלוח מתוזמן ל-25 בדצמבר.
{ "specialOpeningHoursSpecification": [ { "@type": "ServiceDeliveryHoursSpecification", "validFrom": "2018-12-25T00:00:00-07:00", "validThrough": "2018-12-26T00:00:00-07:00", "opens": "T00:00:00", // No ASAP ordering on Christmas "closes": "T00:00:00" }, { "@type": "AdvanceServiceDeliveryHoursSpecification", "validFrom": "2018-12-25T00:00:00-07:00", "validThrough": "2018-12-26T00:00:00-07:00", "opens": "T00:00:00", // Orders cannot be scheduled for Christmas "closes": "T00:00:00" } ] }
השירות לדוגמה הבא מקבל הזמנות מסביב לשעון ומבצע משלוחים בימים חול בין השעות 10:00 ל-14:59:59:
... { "@type": "OpeningHoursSpecification", "opens": "T00:00:00", "closes": "T23:59:59", "deliveryHours": { "@type": "AdvanceServiceDeliveryHoursSpecification", "opens": "T10:00:00", // Delivery starts at 10:00AM "closes": "T15:00:00", // Delivery ends at 3:00PM. Delivery from 10AM-2:59:59PM. "dayOfWeek": [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" ], "serviceTimeInterval": "PT15M", // in slots spaced 15 minutes apart "advanceBookingRequirement": { "minValue": 60, // The slot should be at least 60 mins away "maxValue": 8640, // but not more than 6 days away "unitCode": "MIN" } } } ...
בשירות לדוגמה הבא אפשר להזמין כל יום מ-8:00 עד 16:59:59, והלקוחות יכולים לבחור באפשרות של משלוח תוך שעה או באחד מהתורים:
... { "@type": "OpeningHoursSpecification", "opens": "T08:00:00", // Ordering opens at 8:00AM "closes": "T17:00:00", // Ordering closes at 5:00PM, last order at 4:59:59PM "deliveryHours": [ { "@type": "ServiceDeliveryHoursSpecification", "opens": "T08:00:00", "closes": "T17:00:00", "deliveryLeadTime": { "@type": "QuantitativeValue", "value": "60", // If no exact deliveryLeadTime, put a maximum time "unitCode": "MIN" } }, { "@type": "AdvanceServiceDeliveryHoursSpecification", "opens": "T08:00:00", "closes": "T17:00:00", "serviceTimeInterval": "PT15M", // in slots spaced 15 minutes apart "advanceBookingRequirement": { "minValue": 90, // The slot should be at least 90 mins away "maxValue": 8640, // but not more than 6 days away "unitCode": "MIN" } } ] } ...
בדוגמה הבאה מוצג מקרה שבו החנות פתוחה בימי חול מ-8:00 עד 16:59:59, אבל בסופי שבוע מ-8:00 עד 18:59. לא ניתן להזמין מוצרים מסביב לשעון.
... { // On weekdays, ordering open from 8AM-4:59:59PM. "@type": "OpeningHoursSpecification", "opens": "T08:00:00", "closes": "T17:00:00", "dayOfWeek": [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" ], "deliveryHours": [ { // Fulfillment between 8AM-4:59:59PM on weekdays. "@type": "AdvanceServiceDeliveryHoursSpecification", "opens": "T08:00:00", "closes": "T17:00:00", "dayOfWeek": [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" ], "serviceTimeInterval": "PT15M", "advanceBookingRequirement": { "minValue": 60, "maxValue": 8640, "unitCode": "MIN" } }, { // Fulfillment between 8AM-6:59:59PM on weekends (even for orders placed on a // weekday). "@type": "AdvanceServiceDeliveryHoursSpecification", "opens": "T08:00:00", "closes": "T19:00:00", "dayOfWeek": [ "Saturday", "Sunday" ], "serviceTimeInterval": "PT15M", "advanceBookingRequirement": { "minValue": 60, "maxValue": 8640, "unitCode": "MIN" } } ] }, { // On weekends, one can place orders upto 6:59:59PM. "@type": "OpeningHoursSpecification", "opens": "T08:00:00", "closes": "T19:00:00", "dayOfWeek": [ "Saturday", "Sunday" ], "deliveryHours": [ { // But fulfillment on weekdays is only till 4:59:59PM. "@type": "AdvanceServiceDeliveryHoursSpecification", "opens": "T08:00:00", "closes": "T17:00:00", "dayOfWeek": [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" ], "serviceTimeInterval": "PT15M", "advanceBookingRequirement": { "minValue": 60, "maxValue": 8640, "unitCode": "MIN" } }, { // Fulfillment on weekends is till 6:59:59PM. "@type": "AdvanceServiceDeliveryHoursSpecification", "opens": "T08:00:00", "closes": "T19:00:00", "dayOfWeek": [ "Saturday", "Sunday" ], "serviceTimeInterval": "PT15M", "advanceBookingRequirement": { "minValue": 60, "maxValue": 8640, "unitCode": "MIN" } } ] } ...