Aktualisierung der asynchronen Bestellung

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:

Bestellstatus

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 oder CONFIRMED.
  • 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.

Diagramm zur Aktualisierung von Bestellungen

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:

  1. So erstellen Sie ein Autorisierungstoken: <ph type="x-smartling-placeholder">
      </ph>
    1. Verwenden Sie die Google-Authentifizierungsbibliothek, um die Anmeldedaten aus Ihrem Dienst zu lesen Kontodatei.
    2. Fordern Sie ein Token mit dem folgenden API-Bereich an: https://www.googleapis.com/auth/actions.fulfillment.conversation
  2. Verwenden Sie dieses Token, um eine authentifizierte HTTP POST-Anfrage an den folgenden Endpunkt: https://actions.googleapis.com/v2/conversations:send
  3. Legen Sie den Content-Type-Header als Teil Ihrer Anfrage auf application/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.