Speisekartenfeeds und Artikel im Warenkorb für die Auftragsausführung zuordnen
Wenn Kunden Artikel aus Ihrem Speisekartenfeed in den Einkaufswagen legen und bezahlen, Google sendet diese Artikel an Ihren Endpunkt für die Auftragsausführung, um den Preis zu überprüfen und Verfügbarkeit. Sobald die Preise und Verfügbarkeit geprüft wurden, kann der Kunde die Bestellung aufgeben. In diesem Abschnitt wird gezeigt, wie Sie Menü-Feedelemente Artikel im Einkaufswagen für die Auftragsausführung.
Beispiele in diesem Bereich sind reduzierte Versionen des Speisekartenfeeds und des Warenkorbs.
Schema. Nur Felder, die für die Zuordnung zwischen dem Speisekartenfeed und
wird das Warenkorbobjekt angezeigt. Vollständige Schemas finden Sie unter Menu
und Cart
.
Artikel im Menu
-Feed, die in den Einkaufswagen gelegt wurden, werden im Cart
gesendet.
für den Bezahlvorgang und die Auftragsübermittlung.
- Ein einfaches
MenuItem
wird alsLineItem
imlineItems
dargestellt. Array, wobeiofferId
dieoffer.id
des ausgewählten Menüpunkts im Menü ist Feed. - Ein
MenuItem
mit einem erforderlichenMenuItemOption
wird alsLineItem
imlineItems
-Array, wobeiofferId
ausgewählt istoffer.id
der Menüoption aus dem Feed. - Ein
AddOnMenuItem
einerLineItem
wird alsFoodItemOption
imoptions
-Array vonFoodItemExtension
. Jede Option hat einofferId
, das dem ausgewählten Add-on-Menü entspricht „offer.id
“ des Artikels aus dem Feed für die Speisekarte. Ein AddOnMenuItem kann auch verschachtelte AddOnMenuItem(s), die jeweils alssubOptions
dargestellt werden. Option.
In den folgenden Beispielen werden Menüelemente zwischen dem Menüfeed und der Auftragsausführung zugeordnet. Einkaufswagen.
JSON
Dieses Beispiel enthält eine Liste einfacher Menüelemente.
Speisekartenelemente in einem Menüfeed:
{ "@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" } ] } ] }
Speisekartenartikel, die einem Einkaufswagen für die Auftragsausführung zugeordnet wurden:
{ "@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
Dieses Beispiel enthält einen Menüpunkt mit einem oder mehreren AddOnMenuItems.
Speisekartenelemente in einem Menüfeed:
{ "@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" } ] } ] }
Speisekartenartikel, die einem Einkaufswagen für die Auftragsausführung zugeordnet wurden:
{ "@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
Dieses Beispiel enthält den Menüpunkt „AddOnMenuItems“, und verschachtelte AddOnMenuItems
Speisekartenelemente in einem Menüfeed:
{ "@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" } ] } ] } ] } ] } ] } } ] }
Speisekartenartikel, die einem Einkaufswagen für die Auftragsausführung zugeordnet wurden:
{ "@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" } ] } ] } } ] }
Fehlerbehebung
Wenn bei der Verarbeitung eines CheckoutRequestMessage
Probleme auftreten,
kann mit einer CheckoutResponseMessage
antworten, die ein
FoodErrorExtension
anstelle einer CheckoutResponse-Antwort. Sie können diese
, um einen oder mehrere Fehler zu identifizieren, die während der Verarbeitung aufgetreten sind.
Es gibt zwei Möglichkeiten, mit diesen Fehlern umzugehen:
- Behebbare Fehler: Der Nutzer muss seinen Warenkorb nicht bearbeiten, um die
Reihenfolge. Wenn Sie z. B. feststellen, dass ein Element in der
Cart
ein Preisänderung können Sie mit dem FehlertypFoodOrderError
antwortenPRICE_CHANGED
, zusammen mitcorrectedProposedOrder
undpaymentOptions
. Google informiert den Nutzer über die Änderung, lässt ihn aber mit demcorrectedProposedOrder
Der Nutzer kann auch zurückgehen und seinen Warenkorb bearbeiten, wenn erwünscht ist. Sie erhalten entweder ein neuesCheckoutRequestMessage
- oderSubmitOrderRequestMessage
- Nicht behebbare Fehler: Der Nutzer muss seinen Einkaufswagen vor dem
des Bestellens. Wenn Sie z. B. feststellen, dass das Restaurant
geschlossen wurde, können Sie mit einem
FoodOrderError
vom FehlertypCLOSED
antworten. Google informiert den Nutzer und verwaltet die Interaktion, um auf eine neue Restaurant. Sie erhalten ein neuesCheckoutRequestMessage
für ein neues Einkaufswagen.
Machen Sie Fehler auf Einkaufswagenebene im Allgemeinen nicht behebbar und Fehler auf Artikelebene.
wiederherstellbar sind. Eine vollständige Liste der Fehlertypen und ihrer Bedeutung finden Sie unter
FoodOrderError
Umgang mit Preisänderungen
Preisänderungen an der Kasse
Wenn während der Zahlungsabwicklung eines Kunden ein Preisproblem auftritt führen Sie folgende Schritte aus:
- Antworten Sie auf die
CheckoutRequestMessage
mit einemCheckoutResponseMessage
, dieFoodErrorExtension
enthält, wie wie unter Umgang mit Fehlern beschrieben. - Verwenden Sie in der Fehlerantwort
correctedProposedOrder.cart
, um den Preis zu aktualisieren. auf den richtigen Wert. Google erhält die korrigierte Bestellung und kann eine neueCheckoutRequestMessage
Nach dem Bezahlvorgang zeigt Google dem Endnutzer eine Bestellbestätigungsseite an.
unabhängig davon, ob ProposedOrder
geändert wurde oder nicht.
Wurde die vorgeschlagene Bestellung korrigiert, zeigt Google möglicherweise zusätzliche Warnungen an
die Nutzenden über die Änderungen informieren. Wenn der Nutzer der Bestellung zustimmt, wird
gibt es keine Bezahlanfragen mehr. Der Ablauf fährt mit dem Senden
der Bestellung fort, wobei
das korrigierte Objekt ProposedOrder
.
Der Nutzer kann seine Meinung jedoch jederzeit ändern und seinen Warenkorb bearbeiten. Wann?
Einkaufswagen auf diese Weise aktualisiert, sendet Google ein neues CheckoutRequestMessage
.
Preisänderungen während des Absendens der Bestellung
Wenn bei der Bearbeitung der Bestellung ein Preisproblem auftritt
(Der Intent actions.intent.TRANSACTION_DECISION
wurde ausgelöst), nicht antworten
oder aktualisieren Sie den Preis in Ihrer Antwort. Wenn die Preise, Mengen,
oder andere Details im SubmitOrderRequestMessage
entsprechen nicht den
für Ihre Daten verwenden möchten, setzen Sie orderState
auf REJECTED
, um anzugeben, dass die
kann nicht wie gewünscht aufgegeben werden.
Wenn die Bestell- und Zahlungsdetails gültig sind, setze dann orderState
auf CREATED
.
oder CONFIRMED
. Fügen Sie außerdem ein actionOrderId
ein, das die Bestell-ID darstellt.
in Ihrem System. Diese ID muss beim Senden nachfolgender Updates verwendet werden.
Falls Sie die Zahlung nicht bearbeiten können und die
SubmitOrderRequestMessage
, Sie können eine
AsyncOrderUpdateRequestMessage
mit orderState
auf REJECTED
gesetzt, um
Nutzende wissen, dass die Bestellung nicht bearbeitet werden kann.
Preisänderungen nach dem Absenden der Bestellung
Wenn Sie feststellen, dass sich ein Preis geändert hat,
Bestellung aufgegeben hat, können Sie ein AsyncOrderUpdateRequestMessage
ausstellen,
beschrieben, mit dem neuen Preis, wie unter Asynchrone Bestellaktualisierungen implementieren beschrieben.
So aktualisieren Sie Preise mithilfe asynchroner Bestellaktualisierungen:
- Ändere den Preis in
lineItemUpdates[x].price
. Dieses Der Wert entspricht den Gesamtkosten des Artikels, einschließlich Add-ons und multipliziert um die Menge zu dividieren. (Weitere Informationen finden Sie in der Beschreibung derprice
-Feld vonLineItem
.) - Geben Sie eine Erklärung in
lineItemUpdates[x].reason
ein. lineItemUpdates[x].orderState
festlegen anCONFIRMED
.
Sie können vor oder nach dem Absenden der
AsyncOrderUpdateRequestMessage, nach Ihrem Ermessen. Wenn die Transaktion fehlschlägt
(möglicherweise weil das Preisdelta zu hoch ist), senden Sie eine
AsyncOrderUpdateRequestMessage mit den folgenden Einstellungen im
OrderUpdate
, um Google über den Fehler zu informieren:
- Setzen Sie
orderState
aufREJECTED
. - Beschreiben Sie den Fehler im Feld
label
.
Überprüfung des Bezahlvorgangs
Wie in Schritt 4: Google Checkout implementieren beschrieben, wird Ihr
Endpunkt für die Auftragsausführung sollte eine Validierung für jeden eingehenden
CheckoutRequestMessage
und antworte mit CheckoutResponseMessage
.
Hier ein Beispiel für einen CheckoutResponseMessage
für eine erfolgreiche
Validierung:
Anwendungsfall | Implementierung |
---|---|
Anwendungsfall 1: Validierung erfolgreich | Rückflug CheckoutResponse . Es muss
ProposedOrder und PaymentOptions .
ProposedOrder enthält Steuern, Gebühren und den Gesamtpreis des
Einkaufswagen. |
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 } } } } } ] } } }
Überprüfung der Lieferadresse
Der Endpunkt für die Auftragsausführung sollte die in den einzelnen
CheckoutRequestMessage
Wenn es ein Problem mit der Lieferadresse gibt, weil sie z. B. außerhalb des
des Lieferservice die CheckoutResponseMessage
, die von Ihrem
Die Auftragsausführung sollte eine FoodOrderError
des entsprechenden Typs enthalten.
Anwendungsfall | Implementierung |
---|---|
Anwendungsfall 1:Validierung fehlgeschlagen, da die Lieferadresse abgelaufen ist oder es gibt ein Problem mit der Lieferadresse | FoodErrorExtension mit FoodOrderError zurückgeben
Fehlertyp 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." } ] } } } ] } } }
Validierung des Mindestbestellwerts
Ihr Endpunkt für die Auftragsausführung sollte den Mindestbestellwert der einzelnen
CheckoutRequestMessage
Wenn der Mindestbestellwert nicht erreicht wird, wird die CheckoutResponseMessage
von der Auftragsausführung zurückgegebene FoodOrderError
-Fehlertyp enthalten
REQUIREMENTS_NOT_MET
Anwendungsfall | Implementierung |
---|---|
Anwendungsfall 1:Validierung fehlgeschlagen, da der Mindestbestellwert ist nicht erfüllt | FoodErrorExtension mit FoodOrderError zurückgeben
Fehlertyp 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." } ] } } } ] } } }
Validierung des Bestellfensters
Der Endpunkt für die Auftragsausführung sollte alle Faktoren validieren, die sich auf die
Bestellfenster für jedes CheckoutRequestMessage
-Element.
Das ist beispielsweise der Fall, wenn das Restaurant geschlossen ist oder keine Bestellungen mehr im
sollte die CheckoutResponseMessage
, die von der Auftragsausführung zurückgegeben wird,
FoodOrderError
vom Fehlertyp CLOSED
oder NO_CAPACITY
enthalten,
.
Anwendungsfall | Implementierung |
---|---|
Anwendungsfall 1:Validierung fehlgeschlagen, weil das Restaurant geschlossen oder nicht mehr unterstützt | FoodErrorExtension mit FoodOrderError zurückgeben
Fehlertyp CLOSED . |
Anwendungsfall 2:Die Validierung ist fehlgeschlagen, weil das Restaurant beschäftigt und Nimmt derzeit keine Bestellungen an | FoodErrorExtension mit FoodOrderError zurückgeben
Fehlertyp 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." } ] } } } ] } } }
Validierung der Warenkorbartikel
Der Endpunkt für die Auftragsausführung sollte jeweils die Preise und die Verfügbarkeit validieren.
Artikel im Einkaufswagen, der in einem CheckoutRequestMessage
enthalten ist.
Wenn sich die Verfügbarkeit oder die Preise geändert haben, werden die CheckoutResponseMessage
von der Auftragsausführung zurückgegebene FoodOrderError
-Fehlertyp enthalten
AVAILABILITY_CHANGED
bzw. PRICE_CHANGED
.
Anwendungsfall | Implementierung |
---|---|
Anwendungsfall 1: Die Validierung ist fehlgeschlagen, weil einige Menüelemente und/oder Ihre Anpassungen sind ungültig oder nicht auf Lager | FoodErrorExtension mit correctedProposedOrder zurückgeben,
PaymentOptions und FoodOrderError mit Fehlertyp
AVAILABILITY_CHANGED Ungültige Elemente müssen entfernt werden aus
CorrectedProposedOrder |
Anwendungsfall 2: Validierung fehlgeschlagen, da einige Menüelemente und/oder Ihre Anpassungen sind ungültig oder nicht auf Lager. Der korrigierte Einkaufswagen den Mindestbestellwert nicht mehr erfüllt. | FoodErrorExtension mit FoodOrderError zurückgeben
der Fehlertypen AVAILABILITY_CHANGED und
REQUIREMENTS_NOT_MET . |
Anwendungsfall 3: Die Validierung ist fehlgeschlagen, weil ein Menüpunkt und/oder Anpassung der Preise hat sich geändert | FoodErrorExtension mit correctedProposedOrder zurückgeben,
PaymentOptions und FoodOrderError mit Fehlertyp
PRICE_CHANGED Veraltete Preise müssen in
CorrectedProposedOrder |
Anwendungsfall 4:Die Validierung ist fehlgeschlagen, weil ein Menüelement und/oder Anpassungspreise haben sich geändert. Der korrigierte Warenkorb entspricht nicht mehr den Mindestbestellwert | FoodErrorExtension mit FoodOrderError zurückgeben
der Fehlertypen PRICE_CHANGED und
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 } } ] } } } ] } } }
Bestellbestätigung senden
Wie in Schritt 7: „Bestellung senden“ implementiert beschrieben,
Endpunkt für die Auftragsausführung sollte eine Validierung für jeden eingehenden
SubmitOrderRequestMessage
und antworten Sie mit einem
SubmitOrderResponseMessage
Hier ein Beispiel für einen SubmitOrderResponseMessage
für eine erfolgreiche
Validierung:
Anwendungsfall | Implementierung |
---|---|
Anwendungsfall 1: Auftrag wurde erstellt | Ein SubmitOrderResponseMessage mit CREATED -Bestellung
Bundesstaat. Es muss actionOrderId haben,
userVisibleId , orderManagementActions und
estimatedFulfillmentTime . |
Anwendungsfall 2:Bestellung wird aufgrund von Zahlungsproblemen abgelehnt | Ein SubmitOrderResponseMessage mit REJECTED -Bestellung
Bundesstaat. Es muss actionOrderId haben,
userVisibleId , orderManagementActions und
rejectionInfo vom Typ PAYMENT_DECLINED . |
Anwendungsfall 3:Bestellung wird abgelehnt, da Nutzer als gesperrt gekennzeichnet ist | Ein SubmitOrderResponseMessage mit REJECTED -Bestellung
Status. Es muss actionOrderId haben,
userVisibleId , orderManagementActions und
rejectionInfo vom Typ INELIGIBLE . |
Anwendungsfall 4:Bestellung wird abgelehnt, da Nutzerinformationen unvollständig oder ungültig | Ein SubmitOrderResponseMessage mit REJECTED -Bestellung
Bundesstaat. Es muss actionOrderId haben,
userVisibleId , orderManagementActions und
rejectionInfo vom Typ INELIGIBLE . |
Anwendungsfall 5:Bestellung aus unbekanntem Grund abgelehnt | Ein SubmitOrderResponseMessage mit REJECTED -Bestellung
Bundesstaat. Es muss actionOrderId haben,
userVisibleId , orderManagementActions und
rejectionInfo vom Typ 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" } } } ] } } } ] } } }