Nach dem Checkout-Aufruf sieht sich der Nutzer den aktualisierten Einkaufswagen mit Steuern, Versandkosten, Rabatten und anderen Gebühren an, die du zurückgibst. Der Nutzer bestätigt und sendet die Bestellung. Google sendet dann eine JSON-Anfrage mit den Informationen zur Bestellung an Ihren Endpunkt für die Auftragsausführung. Ihr Webdienst muss diese Bestellung empfangen, verarbeiten und Google mit dem Status der Bestellung antworten.
In diesem Abschnitt wird das von Google gesendete Format der Bestellanfrage (SubmitOrderRequestMessage
) und das Format der von dir bereitgestellten Antwortnachricht (SubmitOrderResponseMessage
) beschrieben.
Weitere Informationen zum Lebenszyklus der Auftragsausführung finden Sie in der Übersicht zur Auftragsausführung.
Implementierung der Auftragsausführung
Der Webdienst für Bestellungen – Ende-zu-Ende, den Sie für die Verwendung mit Bestellungen – Ende-zu-Ende erstellen, muss einen URL-Endpunkt zum Empfang von Bestellnachrichten von Google enthalten. Für die Auftragsverarbeitung erhält Ihr Webservice eine SubmitOrderRequestMessage
im JSON-Format als POST-Anfrage von Google. Diese Anfrage enthält eine Kundenbestellung, einschließlich Steuern, Gebühren und Zahlungsinformationen. Wenn Ihr Webdienst eine Anfrage zum Einreichen einer Bestellung erhält, muss er Folgendes tun:
- Prüfen, ob die Transaktion zulässig ist, z. B. Kartenbestätigung oder Betrugserkennung
- Erstellen Sie einen Auftrag in Ihrem System.
- Autorisieren Sie die Zahlungsmethode und rufen Sie gegebenenfalls die Charge API Ihres Zahlungsabwicklers auf.
- Gib den Status der Bestellung an:
CREATED
,CONFIRMED
oderREJECTED
.
Nach der Bearbeitung der Bestellung muss dein Fulfillment-Code eine Antwort in Form einer SubmitOrderResponseMessage
-JSON-Nachricht an Google zurückgeben.
Weitere Informationen zu den Anforderungen an die Implementierung des End-to-End-Fulfillment-Webdienstes für Bestellungen finden Sie in der Übersicht über die Auftragsausführung.
Nachricht mit Bestellanfrage
Wenn ein Kunde während des End-to-End-Bestellvorgangs eine Bestellung aufgibt, sendet Google eine Anfrage an Ihren Webservice mit einer JSON-Nachricht namens SubmitOrderRequestMessage
, die die folgenden Daten enthält:
- Intent: Das Feld
inputs[0].intent
jedes Anfragetexts zum Senden einer Bestellung enthält den Stringwertactions.intent.TRANSACTION_DECISION
. - Bestellung:Das Feld
inputs[0].arguments[0].transactionDecisionValue
einer Anfrage zum Senden einer Bestellung enthält einOrder
-Objekt, das die zu platzierende Bestellung des Kunden zusammen mit Zahlungsdetails darstellt. - Sandbox-Flag:Das Feld
isInSandbox
einer Bestellanfrage gibt an, ob für die Transaktion Sandbox-Zahlungen verwendet werden.
Beispiel für eine Bestellanfrage
Folgendes ist ein SubmitOrderRequestMessage
-Beispiel.
JSON
{ "user": {}, "conversation": { "conversationId": "CTKbKfUlHCyDEdcz_5PBJTtf" }, "inputs": [ { "intent": "actions.intent.TRANSACTION_DECISION", "arguments": [ { "transactionDecisionValue": { "order": { "finalOrder": { "cart": { "merchant": { "id": "restaurant/Restaurant/QWERTY", "name": "Tep Tep Chicken Club" }, "lineItems": [ { "name": "Spicy Fried Chicken", "type": "REGULAR", "id": "299977679", "quantity": 2, "price": { "type": "ESTIMATE", "amount": { "currencyCode": "AUD", "units": "39", "nanos": 600000000 } }, "offerId": "MenuItemOffer/QWERTY/scheduleId/496/itemId/143", "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension" } } ], "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension", "fulfillmentPreference": { "fulfillmentInfo": { "delivery": { "deliveryTimeIso8601": "P0M" } } }, "location": { "coordinates": { "latitude": -33.8376441, "longitude": 151.0868736 }, "formattedAddress": "Killoola St, 1, Concord West NSW 2138", "zipCode": "2138", "city": "Concord West", "postalAddress": { "regionCode": "AU", "postalCode": "2138", "administrativeArea": "NSW", "locality": "Concord West", "addressLines": [ "Killoola St", "1" ] } }, "contact": { "displayName": "Hab Sy", "email": "hab9878.sy@gmail.com", "phoneNumber": "+61000000000", "firstName": "Hab", "lastName": "Sy" } } }, "otherItems": [ { "name": "Delivery fee", "type": "DELIVERY", "price": { "type": "ESTIMATE", "amount": { "currencyCode": "AUD", "units": "3", "nanos": 500000000 } } }, { "name": "Subtotal", "type": "SUBTOTAL", "price": { "type": "ESTIMATE", "amount": { "currencyCode": "AUD", "units": "39", "nanos": 600000000 } } } ], "totalPrice": { "type": "ESTIMATE", "amount": { "currencyCode": "AUD", "units": "43", "nanos": 100000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension" } }, "googleOrderId": "01412971004192156198", "orderDate": "2020-10-22T09:02:06.173Z", "paymentInfo": { "displayName": "Pay when you get your food", "paymentType": "ON_FULFILLMENT" } } } } ] } ], "directActionOnly": true, "isInSandbox": true }
Bestellantwort
Nachdem eine Anfrage eingegangen ist, verarbeitet Ihr End-to-End-Webdienst für Bestellungen die Anfrage und sendet eine SubmitOrderResponseMessage
zurück, die die folgenden Daten enthält:
OrderUpdate
: Ein Objekt mit dem Status der Bestellung und allen nach der Bestellung verfügbaren Aktionen für den Nutzer, z. B. den Kontakt mit dem Support und die Anzeige von Bestelldetails. Sie definieren diese im FeldfinalResponse.richResponse.items[0].structuredResponse.orderUpdate
der Antwort.
Feld für Bestellaktualisierung
Wenn Ihr Webdienst eine SubmitOrderResponseMessage
sendet, enthält sie ein OrderUpdate
-Feld mit den folgenden Feldern:
actionOrderId
: Die eindeutige ID der Bestellung, mit der die Bestellung in Ihrem System eindeutig identifiziert und beim Senden nachfolgender Bestellaktualisierungen darauf verwiesen wird.orderState
: EinOrderState
-Objekt, das den Status der Bestellung darstellt.orderManagementActions
: Aktionen nach der Bestellung, die dem Nutzer zur Verfügung stehen, z. B. den Kundensupport kontaktieren und Bestelldetails ansehen.totalPrice
: Der Gesamtpreis der Bestellung. Dies ist optional. Senden Sie diese Informationen nur, wenn sich der Gesamtpreis der Bestellung nach dem Senden der Bestellung geändert hat.
Bestellungen können einen der folgenden Status haben:
CREATED
: Die Bestellung wurde über Ihren Auftragsausführungsendpunkt erfolgreich verarbeitet, aber der Anbieter hat sie noch nicht bestätigt.CONFIRMED
: Die Bestellung wurde über Ihren Auftragsausführungsendpunkt erfolgreich verarbeitet und der Anbieter hat sie bestätigt.REJECTED
: Es ist ein Problem aufgetreten und Ihr Fulfillment-Endpunkt konnte die Bestellung nicht erstellen oder bestätigen. Das kann auch an Problemen mit der Zahlung liegen.
Wenn Sie für eine Bestellung den Status REJECTED
festlegen, geben Sie den Grund im Feld rejectionInfo
von OrderUpdate
an. Verwenden Sie FoodOrderUpdateExtension.FoodOrderErrors
-Werte in Verbindung mit rejectionInfo
vom Typ UNKNOWN
und geben Sie eine Beschreibung an.
Beispiel für eine Bestellantwort
Folgendes ist ein SubmitOrderResponseMessage
-Beispiel.
JSON
{ "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "orderUpdate": { "actionOrderId": "1603357328160", "orderState": { "state": "CONFIRMED", "label": "Pending" }, "updateTime": "2020-10-22T02:02:08-07:00", "orderManagementActions": [ { "type": "CUSTOMER_SERVICE", "button": { "title": "Call customer service", "openUrlAction": { "url": "tel:+61234561000" } } }, { "type": "VIEW_DETAILS", "button": { "title": "View order details", "openUrlAction": { "url": "https://partner.com/view/orderstatus" } } } ], "receipt": { "userVisibleOrderId": "BXZ-1603357328" } } } } ] } } }
Anfrage fehlgeschlagen
Wenn eine Einreichungsanfrage fehlschlägt, muss SubmitOrderResponseMessage
den OrderState.state
auf REJECTED
setzen. Die Antwort muss außerdem RejectionInfo enthalten, das ein RejectionType
-Objekt zur Beschreibung des Fehlertyps enthält.
Beispiel für eine fehlgeschlagene Antwort
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" } } } ] } } } ] } } }
Implementierung der Bestellung einreichen
Führen Sie die folgenden Schritte aus, um die API zum Einreichen von Bestellungen zu implementieren.
Validierung
- Führen Sie wie unter Kasse einrichten beschrieben Prüfungen für den Dienst, den Warenkorb und die Werbung durch.
- Gib RejectionInfo mit einem der folgenden Typen zurück, falls erforderlich:
RejectionInfoType | Anwendungsfall |
---|---|
UNAVAILABLE_SLOT |
Die Lieferzeit ist nicht mehr gültig. |
PROMO_USER_INELIGIBLE |
Verwende die E-Mail-Adresse im Kontakt-Objekt in der Anfrage, um die Berechtigung des Nutzers für das Angebot zu prüfen. Siehe Beispiel unter „Bestellung mit Angeboten senden“ implementieren. |
INELIGIBLE |
|
PAYMENT_DECLINED |
Die Zahlung kann nicht verarbeitet werden. Das kann beispielsweise an einem unzureichenden Guthaben liegen. |
UNKNOWN |
Bei allen anderen Validierungsfehlern |
Legen Sie OrderState.state
auf REJECTED
fest, wenn Validierungsfehler auftreten. Optional können Sie mit der FoodOrderUpdateExtension einen bestimmten Ablehnungsgrund angeben.foodOrderErrors
Beispiele finden Sie unter Bestellbestätigung senden.
Zahlung verarbeiten
- Berechnen Sie den
totalPrice
, indem Sie den Einkaufswagenpreis, die Gebühren, den Rabatt, die Steuern und das Trinkgeld addieren.totalPrice
muss mit demtotalPrice
übereinstimmen, der in der CheckoutResponseMessage zurückgegeben wurde, zuzüglich der Änderung des Trinkgeldbetrags, falls das Trinkgeld vom Nutzer geändert werden kann. Weitere Informationen finden Sie unter Preisänderungen während der Bestellung. - Verarbeite die Bestellung und Zahlung, wenn du eine Antwort mit dem Bestellstatus
CREATED
oderCONFIRMED
zurückgibst. - Achten Sie darauf, dass ein gültiges Antwortformat zurückgegeben wird. Verwenden Sie dazu generierte Typen, die aus dem Schema erstellt wurden, wie unter Clientbibliotheken generieren beschrieben.
- Verwende das GoogleProvidedPaymentInstrument,
instrumentToken
um die Zahlung zu verarbeiten. Gib RejectionInfo mit dem TypPAYMENT_DECLINED
zurück, wenn die Zahlung nicht verarbeitet werden kann. Weitere Informationen finden Sie unter Zahlungen verarbeiten. - Benachrichtigen Sie den Nutzer sofort nach der Bearbeitung der Bestellung per E-Mail und/oder SMS.
Antwort zurückgeben
- Legen Sie OrderState.
state
aufCREATED
oderCONFIRMED
fest, wenn keine Fehler vorhanden sind. - Legen Sie OrderState.
state
aufREJECTED
fest, wenn Fehler auftreten, und fügen Sie das RejectionInfo-Objekt mit dem entsprechenden RejectionInfoType hinzu. - Legen Sie OrderUpdate.
orderManagementActions
fest.