Nachdem ein Kunde eine Essensbestellung aufgegeben hat, können Sie eine Nachricht zur Aktualisierung der Bestellung an den Dienst für End-to-End-Bestellungen, um uns über die Änderung zu informieren.
Hier sind einige häufige Gründe für das Senden von Bestellaktualisierungen:
- Die geschätzte Lieferzeit für die Bestellung wird verfügbar oder ändert sich.
- Der Status einer Bestellung ändert sich.
- Die Bestellung kann nicht mehr ausgeführt werden.
- Der Preis eines in der Bestellung enthaltenen Speisenangebots hat sich geändert.
- Der Kunde hat eine neue Möglichkeit, seine Bestellung zu verwalten, z. B. einen Kundensupport. oder die Telefonnummer des Restaurants.
- Der Beleg für die Bestellung ist verfügbar.
In den nächsten Abschnitten wird beschrieben, wie Sie mit diesen unterschiedlichen Szenarien umgehen können. über Bestellaktualisierungen.
Bestellstatus wechseln
Ein Auftrag hat sechs mögliche Status. Diese Status und ihre möglichen Übergänge sind im folgenden Diagramm dargestellt:
Wenn ein Kunde zum ersten Mal eine Bestellung aufgibt, beginnt die Bestellung mit dem Status
CREATED
, CONFIRMED
oder REJECTED
. Sie können eine Nachricht zur Aktualisierung Ihrer Bestellung an
aktualisiert den Status eines Auftrags, solange der Statusübergang gültig ist. CREATED
Der Status wird verwendet, wenn die Plattform des Partners die Bestellung nicht bestätigen oder ablehnen kann
sofort. Ein Anwendungsbeispiel ist z. B., wenn ein Kunde eine Bestellung über eine Lieferung bestellt.
Aggregator. Der Versanddienstleister erhält die Lieferung von Google und der
der Aggregator die Informationen
an das Restaurant sendet. Nachdem das Restaurant
und die Verfügbarkeit der Bestellung bestätigt hat, kann der Status jetzt CONFIRMED
lauten.
REJECTED
.
Eine Bestellung mit dem Status CONFIRMED
wird als Nächstes in den Status IN_PREPARATION
verschoben. Je nachdem, ob die Bestellung zur Abholung oder Lieferung vorgesehen ist, verwende als Nächstes den Status READY_FOR_PICKUP
oder IN_TRANSIT
. Wenn das Essen geliefert oder abgeholt wurde, wird die Bestellung auf den Status FULFILLED
gesetzt.
Wenn Sie es Kunden ermöglichen, Bestellungen zu stornieren, können Sie den Status CANCELLED
verwenden. Eine Bestellung kann im Status CREATED
, CONFIRMED
, IN_PREPARATION
, READY_FOR_PICKUP
oder IN_TRANSIT
storniert werden.
Ihr End-to-End-Bestelldienst sollte je nach
Stornierungsrichtlinien und den Status der Zahlungen zum Zeitpunkt der Stornierung.
Ihr End-to-End-Bestelldienst muss nicht alle verfügbaren Status unterstützen
und Übergänge. Der endgültige Status der Bestellung muss jedoch FULFILLED
lauten.
REJECTED
oder CANCELLED
.
Voraussichtliche Lieferzeit angeben
Sie können Nutzern einen geschätzten Zeitraum für den Versand ihrer Bestellung angeben
abgeholt oder geliefert werden kann. Feld estimatedFulfillmentTimeIso8601
verwenden
von FoodOrderUpdateExtension
, um einen geschätzten Zeitraum zu ermitteln,
kann die Bestellung des Kunden abgeholt oder geliefert werden.
Sende das estimatedFulfillmentTimeIso8601
zu folgenden Zeiten:
- Wenn die geschätzte Zeit verfügbar ist, idealerweise in der Bestellung
CREATED
oderCONFIRMED
. - Wenn sich die geschätzte Zeit ändert, z. B. wenn die geschätzte Zeit bis zum
genauer, wenn die Bestellung
IN_TRANSIT
ist.
Um die Erwartungen der Nutzenden effektiv zu erfüllen, sollten Sie vorsichtig sein und geben Sie ein Datum und einen Zeitraum an, nicht ein festes Datum und eine feste Uhrzeit. Sie sollten Berücksichtigen Sie nach Möglichkeit Schwankungen wie die Verkehrslage. Für Sie können beispielsweise eine Schätzung von 12:45 Uhr (Untergrenze) bis 13:15 Uhr (obere Grenze) gebunden) für eine Bestellung, deren voraussichtliche Lieferzeit 13:00 Uhr ist.
Aktionen zur Bestellverwaltung bereitstellen
Wenn Sie ein Update zu Ihrer Bestellung senden, können Sie Ihren Kunden Ressourcen zur Verfügung stellen, die
verwalten sie ihre Bestellung in Form eines OrderManagementAction
. Nach einem
der Kunde eine Bestellung aufgibt, muss er sich möglicherweise an Sie oder das Restaurant wenden
des Bestellvorgangs, um den Fortschritt zu verfolgen, Änderungen vorzunehmen oder die Bestellung zu stornieren.
Mit einem OrderManagementAction
können Kunden per E-Mail, telefonisch oder über eine Verknüpfung
direkt von ihrem Gerät aus. Verwenden Sie dieselben Informationen in
OrderManagementAction
entsprechend der E-Mail-Bestellbestätigung, die Sie an den
Nutzer.
Folgende Arten von Aktionen zur Bestellverwaltung sind möglich:
CUSTOMER_SERVICE
: Kunden die Möglichkeit bieten, den Kunden zu kontaktieren . Dieser Verwaltungsaktionstyp ist für Bestellaktualisierungen erforderlich.EMAIL
: Bieten Sie Kunden die Möglichkeit, eine E-Mail an die angegebene E-Mail-Adresse.CALL
: Bieten Sie Kunden die Möglichkeit, die angegebene Telefonnummer anzurufen.VIEW_DETAIL
: Bieten Sie Kunden die Möglichkeit, Details zu ihren Reihenfolge.
Jede Bestellaktualisierung muss mindestens eine Bestellverwaltungsaktion enthalten. Sie können jedoch
Die bereitgestellten Bestellverwaltungsaktionen können je nach Status der Bestellung variieren.
Beispiel: Wenn eine Bestellung den Status CONFIRMED
hat, ist der CUSTOMER_SERVICE
kann auf die Telefonnummer des Kundenservice verweisen. Wenn dieser Bestellstatus
Bei Aktualisierungen von IN_TRANSIT
kann die Aktion CUSTOMER_SERVICE
auf den
Telefonnummer des Restaurants für Auftragsausführung.
Updates zu Bestellungen senden
Sie verwenden den Nachrichtentyp AsyncOrderUpdateRequestMessage
, um eine Bestellung zu senden
auf den Dienst „Ordering End-to-End“ aktualisiert. Google antwortet mit einer
AsyncOrderUpdateResponseMessage
Wenn Sie z. B. einen Nutzer informieren möchten,
Kundschaft bestätigen, dass ihre Bestellung gültig und angenommen wurde, können Sie eine
AsyncOrderUpdateRequestMessage
, um den Status der Bestellung in CONFIRMED
zu ändern
mit dem Label Accepted by restaurant
.
Nachricht zur Aktualisierung der Bestellung festlegen
Wenn Sie eine AsyncOrderUpdateRequestMessage
an Google senden, müssen Sie Folgendes angeben:
Informationen zum Status der Bestellung im Feld OrderUpdate
.
Die folgenden Beispiele zeigen eine beispielhafte AsyncOrderUpdateRequestMessage
für
für jeden Bestellstatus:
BESTÄTIGT
Dieses Beispiel zeigt eine Beispielanfrage zur Aktualisierung einer Bestellung, durch die der Nutzer dass die Bestellung mit einem Beleg und einer voraussichtlichen Lieferung bestätigt wird .
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "CONFIRMED", "label": "Provider confirmed" }, "receipt": { "userVisibleOrderId": "userVisibleId1234" }, "updateTime": "2017-07-17T12:00:00Z", "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ], "infoExtension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension", "estimatedFulfillmentTimeIso8601": "2017-07-17T13:00:00Z/2017-07-17T13:30:00Z" } } } }
ABGELEHNT
Dieses Beispiel zeigt eine Beispielanfrage zur Aktualisierung einer Bestellung, durch die der Nutzer , dass die Bestellung mit Ablehnungsgrund abgelehnt wurde.
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "REJECTED", "label": "Order rejected" }, "updateTime": "2017-05-10T02:30:00.000Z", "rejectionInfo": { "type": "UNKNOWN", "reason": "Sorry, the restaurant cannot take your order right now." }, "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ], "infoExtension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension", "foodOrderErrors": [ { "error": "NO_CAPACITY", "description": "Sorry, the restaurant cannot take your order right now." } ] } } } }
CANCELLED
Dieses Beispiel zeigt eine Beispielanfrage zur Aktualisierung einer Bestellung, durch die der Nutzer dass die Bestellung mit einem Stornierungsgrund storniert wurde.
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "CANCELLED", "label": "Order cancelled" }, "updateTime": "2017-05-10T02:30:00.000Z", "cancellationInfo": { "reason": "Customer requested" }, "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ] } } }
IN_PREPARATION
Dieses Beispiel zeigt eine Beispielanfrage zur Aktualisierung einer Bestellung, durch die der Nutzer dass das Essen gerade zubereitet wird.
{ "isInSandbox":true, "customPushMessage":{ "orderUpdate":{ "actionOrderId":"sample_action_order_id", "orderState":{ "state":"IN_PREPARATION", "label":"Order is being prepared" }, "receipt": { "userVisibleOrderId": "userVisibleId1234" }, "updateTime":"2018-04-15T11:30:00Z", "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ], "infoExtension":{ "@type":"type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension", "estimatedFulfillmentTimeIso8601":"PT20M" } } } }
READY_FOR_PICKUP
Dieses Beispiel zeigt eine Beispielanfrage zur Aktualisierung einer Bestellung, durch die der Nutzer dass das Essen zur Abholung bereit ist.
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "READY_FOR_PICKUP", "label": "Order is ready for pickup" }, "receipt": { "userVisibleOrderId": "userVisibleId1234" }, "updateTime": "2018-04-15T12:00:00Z", "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ], "infoExtension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension", "estimatedFulfillmentTimeIso8601": "PT20M" } } } }
IN_TRANSIT
Dieses Beispiel zeigt eine Beispielanfrage zur Aktualisierung einer Bestellung, durch die der Nutzer dass die Bestellung unterwegs ist und eine voraussichtliche Lieferdauer angegeben wird.
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "IN_TRANSIT", "label": "Order is on the way" }, "inTransitInfo": { "updatedTime": "2017-07-17T12:00:00Z" }, "updateTime": "2017-07-17T12:00:00Z", "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ], "infoExtension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension", "estimatedFulfillmentTimeIso8601": "PT20M" } } } }
AUSGEFÜHRT
Dieses Beispiel zeigt eine Beispielanfrage zur Aktualisierung einer Bestellung, durch die der Nutzer dass die Bestellung abgeholt oder zugestellt wird:
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "FULFILLED", "label": "Order delivered" }, "updateTime": "2017-05-10T02:30:00.000Z", "fulfillmentInfo": { "deliveryTime": "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ] } } }
Weitere Beispiele für Anfragen zur Aktualisierung von Bestellungen in verschiedenen Anwendungsfällen finden Sie unter Implementieren Sie erweiterte Bestellaktualisierungen.
Autorisierungstoken generieren und Nachricht senden
Für Aktualisierungen von Bestellungen ist ein Autorisierungstoken erforderlich, damit die End-to-End-Bestellung kann überprüfen, ob die Nachricht von Ihrem End-to-End-Webdienst für Bestellungen stammt.
So implementieren Sie Bestellaktualisierungen für Ihr Projekt:
- So erstellen Sie ein Autorisierungstoken:
<ph type="x-smartling-placeholder">
- </ph>
- Verwenden Sie die Google-Authentifizierungsbibliothek, um die Anmeldedaten aus Ihrem Dienst zu lesen Kontodatei.
- Fordern Sie ein Token mit dem folgenden API-Bereich an:
https://www.googleapis.com/auth/actions.fulfillment.conversation
- Verwenden Sie dieses Token, um eine authentifizierte HTTP POST-Anfrage an den
folgenden Endpunkt:
https://actions.googleapis.com/v2/conversations:send
- Legen Sie den
Content-Type
-Header als Teil Ihrer Anfrage aufapplication/json
fest.
Die folgenden Beispiele veranschaulichen, wie Bestellaktualisierungen implementiert werden:
Node.js
In diesem Code wird die Google-Authentifizierungsbibliothek für Node.js verwendet.
const {auth} = require('google-auth-library') const request = require('request'); // The service account client secret file downloaded from the Google Cloud Console const serviceAccountJson = require('./service-account.json') // order-update.json is a file that contains the payload const jsonBody = require('./order-update.json') /** * Get the authorization token using a service account. */ async function getAuthToken() { let client = auth.fromJSON(serviceAccountJson) client.scopes = ['https://www.googleapis.com/auth/actions.fulfillment.conversation'] const tokens = await client.authorize() return tokens.access_token; } /** * Send an order update request */ async function sendOrderUpdate() { const token = await getAuthToken() request.post({ headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, url: 'https://actions.googleapis.com/v2/conversations:send', body: jsonBody, json: true }, (err, res, body) => { if (err) { return console.log(err); } console.log(`Response: ${JSON.stringify(res)}`) }) }
Python
In diesem Code wird die Google-Authentifizierungsbibliothek für Python verwendet.
from google.oauth2 import service_account from google.auth.transport.requests import AuthorizedSession import json # service-account.json is the service account client secret file downloaded from the # Google Cloud Console credentials = service_account.Credentials.from_service_account_file( 'service-account.json') scoped_credentials = credentials.with_scopes( ['https://www.googleapis.com/auth/actions.fulfillment.conversation']) authed_session = AuthorizedSession(scoped_credentials) # order-update.json is a file that contains the payload json_payload=json.load(open('order-update.json')) response = authed_session.post( 'https://actions.googleapis.com/v2/conversations:send', json=json_payload)
Java
In diesem Code wird die Google-Authentifizierungsbibliothek für Java verwendet.
/** * Get the authorization token using a service account. */ private static String getAuthToken() { InputStream serviceAccountFile = Example.class.getClassLoader().getResourceAsStream("service-account.json"); ServiceAccountCredentials.Builder credentialsSimpleBuilder = ServiceAccountCredentials.fromStream(serviceAccountFile).toBuilder(); credentialsSimpleBuilder.setScopes(ImmutableList.of("https://www.googleapis.com/auth/actions.fulfillment.conversation")); AccessToken accessToken = credentialsSimpleBuilder.build().refreshAccessToken(); return accessToken.getTokenValue(); } /** * Send an order update request */ public void sendOrderUpdate() { String authToken = getAuthToken(); // Execute POST request executePostRequest("https://actions.googleapis.com/v2/conversations:send", authToken, "update_order_example.json",); }
Bei erfolgreichen Bestellaktualisierungen ohne Fehler gibt Google eine HTTP 200-Antwort zurück mit leerer Nutzlast. Wenn ein Problem aufgetreten ist, z. B. wenn das Update fehlerhaft ist, gibt Google einen Fehler zurück.