Nach dem Bezahlanruf prüft der Nutzer den aktualisierten Einkaufswagen mit Steuern, Liefergebühren, Rabatten und sonstigen Gebühren, die Sie zurückgeben. Der Nutzer bestätigt und sendet die Bestellung. Google sendet dann eine JSON-Anfrage mit den Informationen zur Bestellung an den Auftragsausführungsendpunkt. Ihr Webdienst muss diese Bestellung erhalten, verarbeiten und Google mit dem Status der Bestellung antworten.
In diesem Abschnitt werden das von Google gesendete Nachrichtenformat für Bestellanfragen (SubmitOrderRequestMessage
) und das Format der von Ihnen anzugebenden Antwortnachricht (SubmitOrderResponseMessage
) beschrieben.
Weitere Informationen zum Lebenszyklus der Auftragsabwicklung finden Sie unter Auftragsausführung.
Implementierung der Auftragsabwicklung
Der Bestell-End-to-End-Webdienst, den Sie für die Zusammenarbeit mit Bestell-End-to-End erstellen, muss einen URL-Endpunkt für den Empfang von Bestellnachrichten von Google enthalten. Zur Bestellverarbeitung empfängt Ihr Webdienst eine SubmitOrderRequestMessage
im JSON-Format als POST-Anfrage von Google. Diese Anfrage enthält eine Kundenbestellung, einschließlich Steuern, Gebühren und Zahlungsinformationen. Bei Erhalt einer Bestellanforderung muss Ihr Webdienst folgende Schritte ausführen:
- Prüfen Sie die Berechtigung für Transaktionen, z. B. Kartenüberprüfung oder Betrugserkennung.
- Erstellen Sie einen Auftrag in Ihrem System.
- Autorisieren Sie die Zahlungsmethode und rufen Sie gegebenenfalls die Charge API Ihres Zahlungsabwicklers auf.
- Antworten Sie mit dem entsprechenden Status der Bestellung:
CREATED
,CONFIRMED
oderREJECTED
.
Nach der Verarbeitung der Bestellung muss der Auftragsausführungscode eine Antwort in Form einer SubmitOrderResponseMessage
-JSON-Nachricht an Google senden.
Weitere Informationen zu den Implementierungsanforderungen für den Webdienst für die End-to-End-Auftragsausführung finden Sie in der Übersicht zur Auftragsausführung.
Nachricht zur Bestellanfrage
Wenn ein Kunde während des End-to-End-Bestellvorgangs eine Bestellung aufgibt, sendet Google eine Anfrage mit einer JSON-Nachricht namens SubmitOrderRequestMessage
an Ihren Webdienst, die die folgenden Daten enthält:
- Intent:Das Feld
inputs[0].intent
jedes Anfragens zum Senden einer Bestellung enthält den Stringwertactions.intent.TRANSACTION_DECISION
. - Order (Bestellung): Das Feld
inputs[0].arguments[0].transactionDecisionValue
einer Bestellanfrage enthält einOrder
-Objekt, das die aufzugebende Bestellung des Kunden darstellt, sowie Zahlungsdetails. - 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 }
Antwortnachricht für Bestellung
Nachdem Sie eine Anfrage erhalten haben, verarbeitet Ihr Bestell-End-to-End-Webdienst die Anfrage und sendet eine SubmitOrderResponseMessage
zurück, die die folgenden Daten enthält:
OrderUpdate
: Ein Objekt, das den Status der Bestellung und alle Aktionen nach der Bestellung enthält, die dem Nutzer zur Verfügung stehen, z. B. die Kontaktaufnahme mit dem Support und das Aufrufen von Bestelldetails, die Sie im FeldfinalResponse.richResponse.items[0].structuredResponse.orderUpdate
der Antwort definieren.
Feld für Auftragsaktualisierung
Wenn Ihr Webdienst eine SubmitOrderResponseMessage
sendet, enthält sie das Feld OrderUpdate
mit den folgenden Feldern:
actionOrderId
: Die eindeutige ID der Bestellung, mit der die Bestellung in Ihrem System eindeutig identifiziert wird und auf die beim Senden nachfolgender Bestellaktualisierungen verwiesen wird.orderState
: EinOrderState
-Objekt, das den Status der Bestellung darstellt.orderManagementActions
: Nutzeraktionen nach der Bestellung, z. B. den Kundensupport kontaktieren und Bestelldetails ansehen.totalPrice
: Der Gesamtpreis der Bestellung. Dies ist optional. Nur senden, wenn sich der Gesamtpreis der Bestellung nach dem Absenden der Bestellung geändert hat.
Ein Auftrag kann einen der folgenden Status haben:
CREATED
: Die Bestellung wurde vom Endpunkt der Auftragsausführung erfolgreich verarbeitet, der Anbieter hat sie jedoch noch nicht bestätigt.CONFIRMED
: Die Bestellung wurde vom Endpunkt für die Auftragsausführung erfolgreich verarbeitet und der Anbieter hat sie bestätigt.REJECTED
: Ein Problem ist aufgetreten und der Endpunkt für die Auftragsausführung konnte die Bestellung nicht erstellen oder bestätigen, was zu Zahlungsproblemen führen kann.
Wenn du für eine Bestellung den Status REJECTED
festgelegt hast, gib 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 Sendeanfrage nicht erfolgreich ist, muss SubmitOrderResponseMessage
OrderState.state
auf REJECTED
setzen. Die Antwort muss auch die RejectionInfo enthalten, die ein RejectionType
-Objekt zur Beschreibung des Fehlertyps enthält.
Beispiel für eine nicht erfolgreiche 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 senden
Führen Sie die folgenden Schritte aus, wenn Sie die API zum Senden von Bestellungen implementieren.
Validierung
- Führen Sie die Validierungen von Diensten, Einkaufswagen und Angeboten wie unter Kasse einrichten beschrieben durch.
- Geben Sie bei Bedarf RejectionInfo mit einem der folgenden Typen zurück:
RejectionInfoType | Anwendungsfall |
---|---|
UNAVAILABLE_SLOT |
Die Auftragsausführungszeit ist nicht mehr gültig. |
PROMO_USER_INELIGIBLE |
Verwenden Sie die E-Mail-Adresse im Objekt Kontakt in der Anfrage, um zu prüfen, ob der Nutzer die Voraussetzungen für das Angebot erfüllt. Weitere Informationen finden Sie im Beispiel zum Implementieren von Bestellungen mit Angeboten. |
INELIGIBLE |
|
PAYMENT_DECLINED |
Die Zahlung kann nicht verarbeitet werden. Dies könnte beispielsweise an unzureichenden Mitteln liegen. |
UNKNOWN |
Bei allen anderen Validierungsfehlern. |
Legen Sie OrderState.state
auf REJECTED
fest, wenn Validierungsfehler auftreten. Optional kannst du über FoodOrderUpdateExtension.foodOrderErrors
einen bestimmten Grund für die Ablehnung angeben. Beispiele finden Sie unter Bestellvalidierung senden.
Zahlung verarbeiten
- Berechnen Sie die
totalPrice
, indem Sie den Warenkorbpreis, die Gebühren, den Rabatt, die Steuern und das Trinkgeld addieren.totalPrice
sollte mit dem in CheckoutResponseMessage zurückgegebenentotalPrice
übereinstimmen, zuzüglich der Änderung des Trinkgelds, wenn das Trinkgeld vom Nutzer geändert werden kann. Weitere Informationen findest du unter Preisänderungen beim Senden der Bestellung. - Verarbeiten Sie die Bestellung und Zahlung, wenn Sie eine Antwort mit dem Bestellstatus
CREATED
oderCONFIRMED
zurückgeben. - Sorgen Sie dafür, dass ein gültiges Antwortformat zurückgegeben wird. Verwenden Sie dazu generierte Typen, die aus dem Schema erstellt wurden, wie unter Clientbibliotheken generieren beschrieben.
- Verwenden Sie zur Verarbeitung der Zahlung GoogleProvidedPaymentInstrument.
instrumentToken
. Wenn die Zahlung nicht verarbeitet werden kann, wird RejectionInfo vom TypPAYMENT_DECLINED
zurückgegeben. Weitere Informationen findest du unter Zahlungen verarbeiten. - Benachrichtigen Sie den Nutzer sofort nach der Verarbeitung der Bestellung per E-Mail oder SMS.
Antwort zurückgeben
- Setze OrderState.
state
aufCREATED
oderCONFIRMED
, wenn keine Fehler vorhanden sind. - Setze OrderState.
state
aufREJECTED
, wenn Fehler auftreten, und füge das Objekt RejectionInfo mit dem entsprechenden RejectionInfoType-Element ein. - Legen Sie OrderUpdate.
orderManagementActions
fest.