Sie können bei der Auftragsausführung Nutzer bei der Abholung und bei der
Essensbestellungen im Voraus zu liefern. Bevor Sie diese Unterstützung in
Auftragsausführung einen Feed mit Dienstleistungsinventar erstellen, in dem die Öffnungszeiten der Nutzer angegeben sind.
Vorabbestellungen, wie im Inventarfeed-Schema beschrieben,
(AdvanceServiceDeliveryHoursSpecification
)
Slots für Vorabbestellungen
Google schlägt Slots für Vorbestellungen im 15-Minuten-Takt mit einer Dauer von bis zu 7 Tagen vor.
basierend auf den Ausführungszeiten für ein Restaurant oder eine Dienstleistung (wie in
AdvanceServiceDeliveryHoursSpecification
)
Um die vorgeschlagenen Slots für Vorbestellungen abzurufen, verwenden Sie die folgenden Werte aus der
fulfillmentPreference
des FoodCartExtension
-Objekts an der Kasse:
PickupInfo.pickupTimeIso8601
DeliveryInfo.deliveryTimeIso8601
Vorabbestellungen an der Kasse implementieren
In der folgenden Tabelle sind die möglichen Methoden zur Implementierung der Reaktion an der Kasse, wenn Nutzer versuchen, Bestellungen aufzugeben.
Szenario | Auftragsausführung |
---|---|
Eine Vorabbestellung kann für den gewünschten Slot ausgeführt werden. | Akzeptieren Sie die P0M („so bald wie möglich“) oder
FUTURE_SLOT -Warenkorb, indem Sie einen ProposedOrder mit dem
im selben Slot aus. Ein Beispiel für eine Checkout-Antwort, die einen Zeitblock akzeptiert, finden Sie unter
dieses Code-Snippet. |
Vorabbestellung kann für den angeforderten Slot nicht ausgeführt werden. | Die Auftragsausführung sollte folgende Voraussetzungen erfüllen:
<ph type="x-smartling-placeholder">
Ein Beispiel für eine Checkout-Antwort, in der alternative Slots vorgeschlagen werden, finden Sie unter dieses Code-Snippet. |
Alternative Slots für die Auftragsabwicklung
Wenn die von Google vorgeschlagenen Zeitfenster für Vorbestellungen nicht geeignet sind, werden Ihre
Die Auftragsausführung kann mithilfe der CheckoutResponseMessage
Alternativen vorschlagen
-Objekt enthält.
Wenn Sie alternative Zeitfenster für Vorabbestellungen angeben möchten, antworten Sie auf die Zahlungsanforderung mit einem
FoodErrorExtension
und legen Sie die folgenden Werte fest:
- Geben Sie im Parameter
foodOrderErrors
den Fehlertyp an, z. B.UNAVAILABLE_SLOT
,NO_CAPACITY
oderCLOSED
). - Geben Sie im Parameter
correctedProposedOrder
die AlternativeP0M
oderFUTURE_SLOT
-Werte überavailableFulfillmentOptions
.
Die alternativen Slots sollten für die nächsten 7 Tage ab dem Zeitpunkt der Bestellung verfügbar sein -Platzierung und schließen Sie alle Anzeigenflächen ein, in denen der angeforderte Warenkorb des Nutzers erfüllt werden kann.
Angenommen, Mittagsangebote sind nur von Montag bis Freitag erhältlich. von 11:00 bis 13:00 Uhr. Die Nutzenden versuchen dann, Mittagsangebote in den Warenkorb zu legen, der ausgewählte Slot nicht verfügbar ist. In diesem Fall sollte die Auftragsausführung Bewahren Sie die Mittagsangebote im Warenkorb auf und geben Sie nur die Zeitblöcke von 11:00 bis 13:00 Uhr zurück für die nächsten 7 Tage
Lassen Sie das Objekt correctedProposedOrder.Cart.fulfillmentPreference
weg.
in Ihrer Antwort.
Wenn keine freien Termine verfügbar sind oder das Restaurant oder der Service
Vorbestellungen unterstützt, müssen Sie keine
correctedProposedOrder
In den folgenden Beispielen sehen Sie die JSON-Nachrichten zwischen Ihrer Auftragsausführung und Google während der Bestell- und Antwortabwicklung bei Vorabbestellungen, wenn der Restaurant oder Service für Vorbestellungen zur Verfügung.
Beispiel: CheckoutRequest mit Lieferslot
Das folgende Snippet zeigt ein Beispiel für eine Direktkauf-Anfrage mit einer Vorabbestellung die für den Auslieferungs-Slot verwendet werden.
{
"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": {
...
}
}
}
}
]
}
]
}
Beispiel: CheckoutResponse, die den Slot akzeptiert
Das folgende Snippet zeigt ein Beispiel für eine Checkout-Antwort, bei der Ihre Auftragsausführung die vorgeschlagenen Slots für Vorabbestellungen akzeptiert.
{
"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": {
...
}
}
}
}
]
}
}
}
Beispiel: CheckoutResponse mit alternativen Slots
Das folgende Snippet zeigt ein Beispiel für eine Checkout-Antwort, bei der Ihre Auftragsausführung
schlägt alternative Zeitfenster für Vorbestellungen vor. Das Feld
Das correctedProposedOrder.Cart.fulfillmentPreference
-Objekt sollte in weggelassen werden.
Ihre Antwort.
{
"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": {
...
}
}
}
}
]
}
}
}
Vorabbestellungen beim Aufgeben der Bestellung implementieren
Wenn bei der Einreichung der Bestellung ein Problem mit den Slots für Vorausbestellungen auftritt,
SubmitOrderResponseMessage
sollte den Grund angeben (z. B.
UNAVAILABLE_SLOT
oder UNKNOWN
) im RejectionInfo
-Objekt.
Aktualisieren Sie den Status der Bestellung von CREATED
auf CONFIRMED
in der
Das Objekt OrderState
, wenn die Bestellung vom Anbieter angenommen wird. Fügen Sie die
Zeitraum in der Bestätigungs-E-Mail an den Nutzer.
Wenn die Bestellung später an das Restaurant gesendet wird, senden Sie Google eine mit der asynchronen Auftragsaktualisierungsaktion aktualisieren.
Im Objekt OrderUpdate
der Antwort auf die Aufgabe Ihrer Auftragsausführung oder
nachfolgende asynchrone Bestellaktualisierungen enthalten, fügen Sie
estimatedFulfillmentTimeIso8601
mit folgendem Wert:
- Wenn der Bestellstatus
CREATED
oderCONFIRMED
ist, setze den Wert auf den Liefer- oder Abholzeit, die der Nutzer für seine Vorbestellung festgelegt hat. - Wenn eine genauere voraussichtliche Lieferdauer vom Restaurant vorliegt oder einen Service anbieten, legen Sie den Wert auf die voraussichtliche Liefer- oder Abholzeit fest.
Beispiel: „SubmitOrderRequest“ mit Lieferslot
Das folgende Snippet zeigt ein Beispiel für eine Bestellanforderung, bei der das die den Nutzer ausgewählt haben.
{
"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": {
...
}
}
}
}
]
}
]
}
Beispiel: „SubmitOrderResponse“ zum Annehmen der Bestellung
Das folgende Snippet zeigt ein Beispiel für eine Antwort auf eine Bestellung, bei der Ihre Die Auftragsausführung bestätigt, dass die Vorbestellung des Nutzers angenommen wurde.
{
"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"
}
}
}
}
]
}
}
}
Beispiel: „SubmitOrderResponse“, mit der die Bestellung abgelehnt wird, weil der Slot nicht verfügbar ist
Das folgende Snippet zeigt ein Beispiel für eine Antwort auf eine Bestellung, bei der Ihre Die Auftragsausführung lehnt die Vorbestellung eines Nutzers aufgrund eines nicht verfügbaren Slots ab.
{
"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": [
...
]
}
}
}
]
}
}
}
Beispiele für Vorabbestellungen
Mit dem Typ AdvanceServiceDeliveryHoursSpecification
können Sie
die Liefer- oder Abholzeiten, damit Nutzer ihre Bestellung im Voraus planen können.
Hinweis : Es gibt zwei separate Zeitfenster, die Sie angeben müssen.
für die Auftragsausführung: das Bestellfenster, das angibt, wann Nutzer ein Produkt platzieren können
Bestellung und das Zeitfenster für die Auftragsausführung, das angibt, wann die Bestellung ausgeführt wird. Die
Das
-Objekt definiert, wann der Nutzer
die Bestellung aufgeben kann. Die Dauer der untergeordneten Auftragsausführung (OpeningHoursSpecification
)
oder ServiceDeliveryHoursSpecification
) definieren, wann die Reihenfolge
erfüllt sind.AdvanceServiceDeliveryHoursSpecification
Im folgenden Beispiel werden die Öffnungszeiten eines Dienstes für die Annahme von Vorbestellungen mit 15-minütigen Betriebsintervallen.
{ "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" } } ] } ] }
Das folgende Beispiel zeigt, wie Sie angeben können, dass der Dienst Bestellungen am selben Tag am 1. Weihnachtstag, jedoch geschlossen an diesem Tag. In diesem Beispiel werden folgende Szenarien unterstützt:
- Nutzer können am 25. Dezember eine Bestellung aufgeben, die am selben Tag geliefert wird.
- Nutzer können bis zum 25. Dezember eine Bestellung im Voraus aufgeben und eine Lieferung planen für den 27. Dezember.
- Nutzer können am 22. Dezember keine Vorbestellung aufgeben, deren Lieferung geplant ist am 25. Dezember.
{ "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" } }
Das folgende Beispiel zeigt, wie Sie angeben können, dass der Dienst für Bestellungen am selben Tag oder Vorbestellungen, die für Weihnachten geplant sind, aber offen für erweiterte Bestellungen, die für einen späteren Tag geplant sind. In diesem Beispiel wird Folgendes unterstützt: Szenarien:
- Nutzer können bis zum 25. Dezember keine Bestellung mit Lieferung am selben Tag aufgeben.
- Nutzer können bis zum 25. Dezember eine Bestellung im Voraus aufgeben und eine Lieferung planen für den 27. Dezember.
- Nutzer können am 22. Dezember keine Vorbestellung aufgeben, deren Lieferung geplant ist am 25. Dezember.
{ "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" } ] }
Der folgende Beispieldienst nimmt Bestellungen rund um die Uhr an und liefert An Wochentagen von 10:00 bis 14:59:59 Uhr:
... { "@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" } } } ...
Der folgende Beispieldienst nimmt Bestellungen täglich von 8:00 bis 16:59:59 Uhr an und können Kunden sich entweder für eine Lieferung innerhalb einer Stunde entscheiden oder eine der Slots:
... { "@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" } } ] } ...
Im folgenden Beispiel ist der Laden von 8:00 bis 16:59:59 Uhr am wochentags, an Wochenenden jedoch von 8:00 bis 18:59 Uhr. Bestellungen werden nicht rund um die Uhr angenommen.
... { // 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" } } ] } ...