Der Bezahlvorgang wird aufgerufen, wenn ein Nutzer einen Einkaufswagen erstellt. Der Inhalt des Einkaufswagens des Nutzers und Details zur Bestellung werden an Ihren End-to-End-Webdienst für Bestellungen gesendet. Diese Informationen werden von Ihrem Webservice überprüft. Anschließend können Sie entweder fortfahren oder den Warenkorb bei Bedarf anpassen.
Der Checkout-Handler für Ihren Webservice muss auf POST-Anfragen reagieren. Wenn ein Kunde den Bezahlvorgang auswählt, sendet Google dem End-to-End-Webdienst für Bestellungen einen JSON-Anfragetext im Form eines CheckoutRequestMessage
, der die Details der Cart
eines Kunden enthält. Ihr Webdienst antwortet dann mit einer CheckoutResponseMessage
. Das folgende Diagramm veranschaulicht den Vorgang.
Wenn Ihr End-to-End-Webdienst für die Bestellung eine Zahlungsanfrage erhält, muss er Folgendes tun:
- Prüfen Sie die Gültigkeit des Einkaufswagens anhand der aktuellen Artikelpreise, der Verfügbarkeit und des Anbieterdienstes.
- Berechnen Sie den Gesamtpreis (einschließlich Rabatten, Steuern und Versandkosten).
- Bei Erfolg antworten Sie mit einem unveränderten Einkaufswagen.
- Wenn das nicht funktioniert, antworte mit einer Fehlermeldung und einer neuen vorgeschlagenen Reihenfolge.
Bevor Sie mit der Implementierung des Bezahlvorgangs beginnen, empfehlen wir Ihnen, sich die Dokumentation zur Übersicht über die Auftragsausführung anzusehen.
Nachricht zur Zahlungsanfrage
Wenn ein Kunde den Bezahlvorgang auswählt, sendet Google eine Anfrage an Ihren Webservice mit einem JSON-Textkörper in Form einer CheckoutRequestMessage
, um den Einkaufswagen des Kunden zu validieren. Die Kundenbestellung wird erst später im Bestellvorgang gesendet.
Die Daten in einem CheckoutRequestMessage
umfassen Folgendes:
- Intent: Das Feld
inputs[0].intent
jedes Checkout-Anfragetexts enthält den Stringwertactions.foodordering.intent.CHECKOUT
. - Einkaufswagen: Das Feld
inputs[0].arguments[0].extension
einer Zahlungsanfrage enthält einCart
-Objekt, das den Einkaufswagen des Kunden darstellt. - Lieferung oder Mitnehmen: Das Erweiterungsfeld des
Cart
-Objekts enthält einFoodCartExtension
-Objekt, das Eigenschaften für die Lieferung oder das Mitnehmen angibt:- Bei Bestellungen mit Lieferung enthält das
FoodCartExtension
-Objekt die Lieferadresse. - Bei Bestellungen zur Abholung enthält das
FoodCartExtension
-Objekt keine Standortinformationen.
- Bei Bestellungen mit Lieferung enthält das
- Sandbox: Das Feld
isInSandbox
einer Zahlungsanfrage enthält einen booleschen Wert, der angibt, ob für die Transaktion Sandbox-Zahlungen verwendet werden.
Beispiel für eine Zahlungsanfrage
Unten sehen Sie ein Beispiel für CheckoutRequestMessage
:
{
"user": {},
"conversation": {
"conversationId": "CTZbZfUlHCybEdcz_5PB3Ttf"
},
"inputs": [
{
"intent": "actions.foodordering.intent.CHECKOUT",
"arguments": [
{
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.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"
]
}
}
}
}
}
]
}
],
"directActionOnly": true,
"isInSandbox": true
}
Antwortnachricht für den Bezahlvorgang
Nachdem Ihr Web-Bezahldienst eine Anfrage vom End-to-End-Bestellservice erhalten hat, muss er sie verarbeiten und mit einer CheckoutResponseMessage
antworten. Die CheckoutResponseMessage
muss entweder eine erfolgreiche oder eine fehlgeschlagene Anfrage abdecken.
Erfolgreiche Anfrage
Damit eine Auscheckanfrage erfolgreich ist, muss CheckoutResponseMessage
ProposedOrder
und PaymentOptions
enthalten:
ProposedOrder
cart
: Eincart
-Objekt, das mit dem imCheckoutRequestMessage
angegebenen Einkaufswagen identisch ist. Wenn der Inhalt des Einkaufswagens geändert werden muss, sollte dieCheckoutResponseMessage
stattdessen eineFoodErrorExtension
mit einer korrigiertenProposedOrder
enthalten.otherItems
: Vom Anbieter hinzugefügte Artikel wie Versandkosten, Steuern und andere Gebühren. Kann auch Trinkgeld enthalten, das vom Nutzer hinzugefügt wurde.totalPrice
: Der Gesamtpreis der Bestellung.extension
: EinFoodOrderExtension
, das Informationen zur Auftragsausführung wie die Lieferdauer definiert.
PaymentOptions
- Die Einrichtung der Zahlungsabwicklung wird später unter Google Pay einrichten behandelt.
Du kannst Platzhalter-JSON in deiner
CheckoutResponseMessage
verwenden, bis du die Zahlungsverarbeitung implementiert hast. - Wenn du Platzhalter für Zahlungsoptionen in deiner
CheckoutResponseMessage
hinzufügen möchtest, findest du im Beispiel unten ein Beispiel für ein Zahlungsgateway fürPaymentOptions
.
- Die Einrichtung der Zahlungsabwicklung wird später unter Google Pay einrichten behandelt.
Du kannst Platzhalter-JSON in deiner
Beispiel für eine erfolgreiche Antwort
{
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"checkoutResponse": {
"proposedOrder": {
"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"
]
}
}
}
},
"totalPrice": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "AUD",
"units": "43",
"nanos": 100000000
}
},
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension",
"availableFulfillmentOptions": [
{
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "P0M"
}
}
}
]
},
"otherItems": [
{
"name": "Delivery fee",
"price": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "AUD",
"units": "3",
"nanos": 500000000
}
},
"type": "DELIVERY"
}
]
},
"paymentOptions": {
"googleProvidedOptions": {
"facilitationSpecification": "{\"apiVersion\":2,\"apiVersionMinor\":0,\"merchantInfo\":{\"merchantName\":\"merchantName\"},\"allowedPaymentMethods\":[{\"type\":\"CARD\",\"parameters\":{\"allowedAuthMethods\":[\"PAN_ONLY\"],\"allowedCardNetworks\":[\"VISA\",\"MASTERCARD\"],\"billingAddressRequired\":true,\"cvcRequired\":false},\"tokenizationSpecification\":{\"type\":\"PAYMENT_GATEWAY\",\"parameters\":{\"gatewayMerchantId\":\"YOUR_MERCHANT_ID\",\"gateway\":\"cybersource\"}}}],\"transactionInfo\":{\"currencyCode\":\"AUD\",\"totalPriceStatus\":\"ESTIMATED\",\"totalPrice\":\"43.1\"}} "
}
},
"additionalPaymentOptions": [
{
"actionProvidedOptions": {
"paymentType": "ON_FULFILLMENT",
"displayName": "Pay when you get your food.",
"onFulfillmentPaymentData": {
"supportedPaymentOptions": []
}
}
}
]
}
}
}
]
}
}
}
Anfrage fehlgeschlagen
Wenn eine Zahlungsanfrage fehlschlägt, muss CheckoutResponseMessage
FoodErrorExtension
enthalten. Dieses Feld enthält eine Liste von FoodOrderError
-Elementen, die alle aufgetretenen Fehler beschreiben. Wenn es bei der Bestellung Fehler gibt, die korrigiert werden können, z. B. eine Preisänderung eines Artikels im Einkaufswagen, muss die FoodErrorExtension
die correctedProposedOrder
enthalten.
Beispiel für eine fehlgeschlagene Antwort
{
"expectUserResponse": false,
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"error": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension",
"foodOrderErrors": [
{
"error": "CLOSED",
"description": "The restaurant is closed."
}
]
}
}
}
]
}
}
}
Implementierung des Bezahlvorgangs
Führen Sie bei der Implementierung des Bezahlvorgangs die folgenden Schritte aus.
Dienst validieren
Gib für die erste gefundene Dienstfehlerbedingung einen FoodOrderError zurück. Diese Fehler können nicht wiederhergestellt werden. Daher sollte der erste Fehler zurückgegeben werden. Eine Beschreibung von wiederherstellbaren Fehlern finden Sie unter Fehlerbehebung.
- Lies in der Anfrage das Attribut FulfillmentOptionInfo, um festzustellen, ob der Ausführungstyp für
delivery
oderpickup
gilt. Gib bei Bedarf die folgenden Fehlertypen zurück:
Fehlertyp Anwendungsfall INVALID Der Ausführungstyp ist ungültig. NOT_FOUND Der Auftragsausführungstyp wurde nicht gefunden. GESCHLOSSEN - Für die Bestellung sind keine OperationHours angegeben.
- Es handelt sich um eine Bestellung mit dem Vermerk „So bald wie möglich“ und es sind derzeit keine ServiceHours für diese Bestellung verfügbar.
- Die Straße ist aufgrund eines Notfalls gesperrt oder für den Dienst
isDisabled
ist „wahr“ festgelegt.
UNAVAILABLE_SLOT Die Vorabbestellung kann nicht ausgeführt werden. NO_CAPACITY Das Restaurant ist derzeit ausgelastet und nimmt keine Bestellungen an. OUT_OF_SERVICE_AREA Die Bestellung kann nicht an die Adresse des Nutzers geliefert werden. Ein Beispiel finden Sie unter Überprüfung der Lieferadresse. NO_COURIER_AVAILABLE Die Bestellung kann aufgrund von Personalmangel nicht zugestellt werden.
Einkaufswagen prüfen und Preise festlegen
Rufen Sie jeden Warenkorb.
lineItems
auf und vergleichen Sie die Daten mit den aktuellen Daten in Ihrem System oder im System des Händlers. Der Wert MenuItemOffer.sku
aus der Feedentität ist als LineItem.offerId
enthalten. Erstellen Sie bei Bedarf für jede Werbebuchung einen FoodOrderError. Erstellen Sie für jeden Artikel maximal einen Fehler. Gib bei Bedarf die folgenden Fehlertypen zurück:Fehlertyp Anwendungsfall Wiederherstellbar INVALID Die Artikeldaten oder Optionendaten sind ungültig. Nein NOT_FOUND Der Artikel oder eine der Optionen wurde nicht gefunden. Nein PRICE_CHANGED Der Preis einer Artikel- oder Add-on-Kombination hat sich geändert. Dieser Fehler kann als wiederherstellbar behandelt werden. Ja AVAILABILITY_CHANGED Der für die Werbebuchungen oder eine der Optionen angeforderte Betrag ist nicht verfügbar. Ja REQUIREMENTS_NOT_MET Die Mindest- oder Maximalbestellmenge wurde nicht erreicht. Sie können das prüfen, indem Sie nachsehen, ob der Einkaufswagenpreis unter Gebühr. eligibleTransactionVolumeMin
oder über Gebühr.eligibleTransactionVolumeMax
liegt. Siehe Beispiel unter Bestellwertprüfung.Nein Die validierte Liste der Werbebuchungen mit LineItemType
REGULAR
zurückgeben. Die Summe aller Preise der Warenkorbpositionen ist der Warenkorbpreis oderSUBTOTAL
.
Beispiele finden Sie unter Validierung von Einkaufswagenartikeln.
Servicegebühren berechnen
- Suchen Sie anhand von
eligibleRegion
,validFrom
,validThrough
undpriority
nach der richtigen Gebühren-Entität für den Dienst. - Berechnen Sie den Gebührenbetrag basierend darauf, ob das Element mit einer
price
-,percentageOfCart
- oderpricePerMeter
-Property definiert wurde. - Geben Sie die Liefer- oder Mitnahmegebühr als LineItem mit dem LineItemType
DELIVERY
bzw.FEE
zurück. Fügen Sie die Gebühr der Liste Einkaufswagen.otherItems
hinzu.
Werbeaktionen anwenden
- Die Angebots-Entität wird anhand der Übereinstimmung des Werts Angebot.
coupon
mit dem Wert Angebot.dealCode
ermittelt. Validiere den Deal und gib bei Bedarf einen FoodOrderError zurück. Diese Fehler können als wiederherstellbar behandelt werden. Gib bei Bedarf die folgenden Fehlertypen zurück:
Fehlertyp Anwendungsfall PROMO_NOT_RECOGNIZED Der Gutscheincode wurde nicht erkannt. PROMO_EXPIRED Die Gültigkeit des Deals ist abgelaufen. PROMO_ORDER_INELIGIBLE Der Gutschein kann nicht für die Bestellung verwendet werden. PROMO_NOT_APPLICABLE Anderer Grund Berechnen Sie den Dealpreis anhand von Deal.
discount
oder Deal.discountPercentage
.Wenden Sie den Angebotspreis auf Grundlage des Einkaufswagengesamtpreises oder der Gesamtgebühr an, je nach Angebot.
dealType
Gib den Einkaufswagen.
promotions
mit angewendetem Angebot zurück.Geben Sie das Angebot als LineItem mit dem LineItemType
DISCOUNT
zurück. Fügen Sie den Rabatt der Liste Cart.otherItems
mit einem negativen Preis hinzu.
Antwort zurückgeben
- Erstelle die ProposedOrder.
cart
Der Antwortwagen entspricht dem Anfragewagen, wenn bei der Validierung keine Fehler auftreten. - Gib die Liste ProposedOrder.
otherItems
zurück, einschließlich Steuern, Gebühren, Trinkgeldern und Rabatten, falls zutreffend. Weitere Informationen zur Konfiguration des Artikels „Trinkgeld“ finden Sie unter Trinkgeld. - Fügen Sie die ProposedOrder
totalPrice
hinzu, indem Sie den Einkaufswagenpreis, Gebühren, Rabatte, Steuern und Trinkgelder hinzufügen. - Gib die FoodOrderExtension.
availableFulfillmentOptions
mit der entsprechenden FulfillmentOption zurück. Aktualisieren Sie die voraussichtliche Abhol- oder Lieferzeit. - Wenn bei den vorherigen Validierungsüberprüfungen FoodOrderErrors generiert wurden:
- Fügen Sie StructuredResponse.
error
und die Liste der Fehler in FoodErrorExtension.foodOrderErrors
ein. - Gib den Wert ProposedOrder im Feld
correctedProposedOrder
zurück, wenn alle Fehler behoben werden können. - Gib die PaymentOptions im Feld
paymentOptions
zurück, wenn alle Fehler behoben werden können. - Optional: Fügen Sie die
additionalPaymentOptions
hinzu, wenn andere Zahlungsoptionen verfügbar sind und alle Fehler behoben werden können.
- Fügen Sie StructuredResponse.
- Wenn keine Validierungsfehler auftreten, gib
proposedOrder
undpaymentOptions
im CheckoutResponse-Objekt zurück. Fügen Sie optional dasadditionalPaymentOptions
hinzu, wenn weitere Zahlungsoptionen verfügbar sind.