Der Bezahlvorgang wird aufgerufen, wenn ein Nutzer einen Einkaufswagen erstellt. Der Inhalt des Einkaufswagens des Nutzers und Details zur Bestellung werden an Ihren „Order with Google“-Webdienst gesendet. Diese Informationen werden von Ihrem Webdienst validiert. Anschließend können Sie entweder fortfahren oder ihren Einkaufswagen nach Bedarf anpassen.
Der Checkout-Handler für Ihren Webdienst muss auf POST-Anfragen antworten. Wenn ein Kunde bezahlen möchte, sendet Google den „Order with Google“-Webdienst einen JSON-Anfragetext in Form eines CheckoutRequestMessage
, das die Details der Cart
eines Kunden enthält. Ihr Webdienst antwortet dann mit einer CheckoutResponseMessage
. Das folgende Diagramm veranschaulicht den Vorgang.
Wenn Sie eine Zahlungsanforderung erhalten, muss Ihr „Order with Google“-Webdienst die folgenden Schritte ausführen:
- Prüfen Sie die Gültigkeit des Einkaufswagens anhand der aktuellen Artikelpreise, Verfügbarkeit und des Dienstleisters.
- Berechnen Sie den Gesamtpreis (einschließlich Rabatten, Steuern und Versandkosten).
- Wenn der Vorgang erfolgreich war, antworten Sie mit einem unveränderten Einkaufswagen.
- Wenn nicht, antworte mit einer Fehlermeldung und einem neuen vorgeschlagenen Auftrag.
Bevor Sie mit dem Implementieren des Bezahlvorgangs beginnen, sollten Sie die Dokumentation Auftragsausführung lesen.
Nachricht an die Kasse
Um den Einkaufswagen des Kunden zu validieren, sendet Google eine Anfrage mit einem JSON-Text in der Form CheckoutRequestMessage
an Ihren Webdienst, wenn er sich für den Bezahlvorgang entscheidet. Die Bestellung des Kunden wird erst später im Ablauf für „Order with Google“ eingereicht.
In einer CheckoutRequestMessage
enthaltene Daten umfassen Folgendes:
- Intent: Das Feld
inputs[0].intent
jedes Anfragetexts enthält den Stringwertactions.foodordering.intent.CHECKOUT
. - Warenkorb: Das Feld
inputs[0].arguments[0].extension
einer Anfrage enthält einCart
-Objekt, das den Einkaufswagen des Kunden darstellt. - Liefern oder Essen zum Mitnehmen: Das Erweiterungsfeld des
Cart
-Objekts enthält einFoodCartExtension
-Objekt, das Eigenschaften für die Lieferung oder Abholung angibt:- Bei Lieferaufträgen enthält das
FoodCartExtension
-Objekt die Lieferadresse. - Bei Bestellungen zum Abholen oder Essen enthält das
FoodCartExtension
-Objekt keine Standortinformationen.
- Bei Lieferaufträgen enthält das
- Sandbox: Das Feld
isInSandbox
einer Zahlungsanforderung enthält einen booleschen Wert, der angibt, ob für die Transaktion Sandbox-Zahlungen verwendet werden.
Beispiel für eine Zahlungsanforderung
Hier ein Beispiel für ein CheckoutRequestMessage
-Element:
{
"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
}
Antwort auf die Kasse
Nachdem du eine Anfrage vom „Order with Google“-Dienst erhalten hast, muss der Webdienst an der Kasse verarbeitet werden und mit einem CheckoutResponseMessage
antworten. Der CheckoutResponseMessage
muss entweder eine erfolgreiche oder eine fehlgeschlagene Anfrage abdecken.
Erfolgreiche Anfrage
Wenn eine Anfrage zum Abschluss des Bezahlvorgangs erfolgreich ist, muss CheckoutResponseMessage
ProposedOrder
und PaymentOptions
enthalten:
ProposedOrder
cart
: Eincart
-Objekt, das mit dem inCheckoutRequestMessage
bereitgestellten Einkaufswagen identisch ist. Wenn der Inhalt des Einkaufswagens geändert werden muss, sollteCheckoutResponseMessage
stattdessen einFoodErrorExtension
mit einem korrigiertenProposedOrder
enthalten.otherItems
: Vom Anbieter hinzugefügte Artikel wie Liefergebühren, Steuern und andere Gebühren. Kann auch Trinkgeld enthalten, das vom Nutzer hinzugefügt wurde.totalPrice
: Der Gesamtpreis der Bestellung.extension
: EineFoodOrderExtension
, die Informationen zur Auftragsausführung für den Auftrag definiert, z. B. die Lieferdauer.
PaymentOptions
- Die Einrichtung der Zahlungsabwicklung wird später unter Google Pay einrichten beschrieben.
Sie können Platzhalter-JSON in Ihrer
CheckoutResponseMessage
verwenden, bis Sie die Zahlungsverarbeitung implementieren können. - Im Beispiel unten sehen Sie, wie Sie Platzhalteroptionen in
CheckoutResponseMessage
hinzufügen. Dafür wird ein Beispielzahlungsgateway fürPaymentOptions
verwendet.
- Die Einrichtung der Zahlungsabwicklung wird später unter Google Pay einrichten beschrieben.
Sie können Platzhalter-JSON in Ihrer
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 Anfrage fehlgeschlagen ist, muss CheckoutResponseMessage
die FoodErrorExtension
enthalten. Diese Liste enthält die Elemente, die dabei aufgetretene Fehler enthalten (FoodOrderError
). Wenn die Bestellung behebbare Fehler enthält, z. B. Preisänderungen bei einem Artikel im Einkaufswagen, muss FoodErrorExtension
den 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."
}
]
}
}
}
]
}
}
}