Der Bezahlvorgang wird gestartet, wenn ein Nutzer einen Einkaufswagen erstellt. Der Inhalt der der Warenkorb des Nutzers und Einzelheiten zur Bestellung werden an Ihre End-to-End-Website für Bestellungen gesendet. . Diese Informationen werden von Ihrem Webdienst überprüft. Sie können dann entweder fortfahren oder Anpassungen am Warenkorb nach Bedarf vornehmen.
Der Checkout-Handler für Ihren Webdienst muss auf POST-Anforderungen antworten. Wenn ein
Kunde den Kauf abschließt, sendet Google den End-to-End-Webdienst für Bestellungen
JSON-Anfragetext im Format CheckoutRequestMessage
, der die
Details zum Cart
eines Kunden Ihr Webdienst antwortet dann mit einem
CheckoutResponseMessage
Das folgende Diagramm veranschaulicht den Vorgang.
Nach Erhalt einer Zahlungsanforderung muss Ihr End-to-End-Webdienst für Bestellungen die folgenden Anforderungen erfüllen: Folgendes:
- Prüfen Sie die Gültigkeit des Warenkorbs basierend auf den aktuellen Artikelpreisen, der Verfügbarkeit, und Dienstleister.
- Berechnen des Gesamtpreises (einschließlich aller Rabatte, Steuern und Versandkosten) Gebühren).
- Wenn der Vorgang erfolgreich war, antworten Sie mit einem unveränderten Einkaufswagen.
- Wenn der Vorgang nicht erfolgreich ist, geben Sie eine Fehlermeldung und einen neuen Vorschlag für den Auftrag zurück.
Bevor Sie mit der Implementierung des Bezahlvorgangs beginnen, sollten Sie den Abschnitt Auftragsausführung Übersicht Dokumentation.
Nachricht zur Bezahlanfrage
Um den Einkaufswagen des Kunden zu validieren,
Google sendet eine Anfrage mit einem JSON-Text in Form eines
CheckoutRequestMessage
Die Kundenbestellung wird erst später im
End-to-End-Ablauf der Bestellung
Daten in einem
CheckoutRequestMessage
umfasst Folgendes:
- Intent: Die
inputs[0].intent
jedes Textes der Checkout-Anfrage das Feldactions.foodordering.intent.CHECKOUT
-Stringwert. - Einkaufswagen: Das Feld
inputs[0].arguments[0].extension
einer Zahlungsanfrage enthält einCart
-Objekt, das den Einkaufswagen des Kunden darstellt. - Lieferung oder Essen zum Mitnehmen: Das Erweiterungsfeld des
Cart
-Objekts enthält einFoodCartExtension
-Objekt, das Eigenschaften für die Übermittlung oder Essen zum Mitnehmen: <ph type="x-smartling-placeholder">- </ph>
- Bei Auslieferungsaufträgen enthält das Objekt
FoodCartExtension
Folgendes: Lieferadresse. - Bei Bestellungen zur Abholung oder zum Mitnehmen gilt das
FoodCartExtension
-Objekt nicht keine Standortinformationen enthalten.
- Bei Auslieferungsaufträgen enthält das Objekt
- 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 Bezahlanfrage
Hier ein Beispiel für ein CheckoutRequestMessage
-Objekt:
{
"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
}
Checkout-Antwortnachricht
Nachdem Sie eine Anfrage vom End-to-End-Service für Bestellungen erhalten haben, wird Ihre Google Checkout-Website
muss der Dienst sie verarbeiten und mit CheckoutResponseMessage
antworten. Die
CheckoutResponseMessage
muss entweder eine erfolgreiche oder fehlgeschlagene
Anfrage erfolgreich
Wenn eine Bezahlanfrage erfolgreich ist, muss CheckoutResponseMessage
Folgendes angeben:
ProposedOrder
und
PaymentOptions
:
ProposedOrder
cart
: Eincart
-Objekt, das mit dem Einkaufswagen imCheckoutRequestMessage
. Wenn Teile des Warenkorbs geändert hat, sollte dieCheckoutResponseMessage
stattdessen einenFoodErrorExtension
mit einem korrigiertenProposedOrder
.otherItems
: vom Anbieter hinzugefügte Elemente, z. B. Versandkosten Steuern und sonstige Gebühren. Kann auch vom Nutzer hinzugefügte Trinkgelder enthalten.totalPrice
: Der Gesamtpreis der Bestellung.extension
: EineFoodOrderExtension
, die Informationen zur Auftragsausführung definiert für die Bestellung, wie z. B. die Lieferdauer.
PaymentOptions
- Die Einrichtung der Zahlungsverarbeitung wird später im Abschnitt Google
Bezahlen.
Sie können Platzhalter-JSON in Ihrem
CheckoutResponseMessage
verwenden, bis Sie zur Implementierung der Zahlungsabwicklung. - So fügen Sie in Ihrem
CheckoutResponseMessage
Platzhalterzahlungsoptionen hinzu: siehe Beispiel unten, in dem ein Beispiel eines Zahlungs-Gateways fürPaymentOptions
.
- Die Einrichtung der Zahlungsverarbeitung wird später im Abschnitt Google
Bezahlen.
Sie können Platzhalter-JSON in Ihrem
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 Zahlungsanforderung fehlschlägt, muss CheckoutResponseMessage
Folgendes ausführen:
enthalten FoodErrorExtension
, das eine Liste mit
FoodOrderError
Elemente zur Beschreibung der aufgetretenen Fehler. Wenn es eine wiederherstellbare
Fehler bei der Bestellung, wie z. B. eine Preisänderung eines Artikels im Warenkorb,
FoodErrorExtension
muss 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
Gehen Sie bei der Implementierung des Bezahlvorgangs folgendermaßen vor:
Dienst validieren
Einen FoodOrderError für die erste Dienstfehlerbedingung zurückgeben gefunden. Da diese Fehler nicht behoben werden können, sollte der erste Fehler folgendermaßen aussehen: zurückgegeben. Unter Umgang mit Fehlern finden Sie eine Beschreibung der behebbar sind.
- Lesen Sie das Attribut FulfillmentOptionInfo in der
Anfrage, um festzustellen, ob der Ausführungstyp für
delivery
oderpickup
ist. Geben Sie bei Bedarf die folgenden Fehlertypen zurück:
Fehlertyp Anwendungsfall UNGÜLTIG Der Ausführungstyp ist ungültig. NOT_FOUND Der Ausführungstyp wurde nicht gefunden. GESCHLOSSEN - Für den Auftrag gibt es keine OperationHours-Fenster.
- Bei der Bestellung handelt es sich um eine ASAP-Bestellung und für die aktuelle Zeit sind keine ASAP ServiceHours verfügbar.
- Ein Notfall wurde geschlossen oder der Dienst
isDisabled
ist wahr.
UNAVAILABLE_SLOT Die Bestellung kann nicht im Voraus ausgeführt werden. NO_CAPACITY Das Restaurant ist gut besucht und nimmt im Moment keine Bestellungen an. OUT_OF_SERVICE_AREA Die Bestellung kann nicht an die Adresse des Nutzers geliefert werden. Ein Beispiel findest du unter Bestätigung der Lieferadresse. NO_COURIER_AVAILABLE Die Bestellung kann aufgrund des begrenzten Lieferpersonals nicht geliefert werden.
Warenkorb überprüfen und Preis festlegen
Suche in jedem Warenkorb.
lineItems
und validiere sie mit den aktuellen Daten in oder im System des Händlers. Die MenuItemOffer.sku
-Wert aus der Feedentität ist enthalten. als LineItem.offerId
. Erstellen: FoodOrderError für jede Werbebuchung ein, falls erforderlich. Erstellen: maximal einen Fehler pro Artikel. Geben Sie die folgenden Fehlertypen zurück, wenn erforderlich:Fehlertyp Anwendungsfall Wiederherstellbar UNGÜLTIG Die Artikeldaten oder eine der Optionsdaten sind ungültig. Nein NOT_FOUND Das Element oder eine der Optionen wurde nicht gefunden. Nein PRICE_CHANGED Der Preis eines Artikels oder einer Add-on-Kombination hat sich geändert. Dieser Fehler wird als behebbar eingestuft. Ja AVAILABILITY_CHANGED Der für die Werbebuchungen oder eine der Optionen angeforderte Betrag ist nicht verfügbar. Ja REQUIREMENTS_NOT_MET Der Mindest- oder Höchstwert für die Bestellung ist nicht erreicht. Dazu prüfen Sie, ob der Warenkorbpreis unter der Gebühr. eligibleTransactionVolumeMin
oder über der GebühreligibleTransactionVolumeMax
liegt. Beispiel für die Validierung des MindestbestellwertsNein Geben Sie die validierte Liste der Positionen mit LineItemType zurück.
REGULAR
Die Summe aller Preise für die Warenkorbposition ist der Warenkorbpreis oderSUBTOTAL
Beispiele finden Sie unter Validierung von Warenkorbelementen.
Servicegebühren berechnen
- Suchen Sie die richtige Fee-Entität für den Dienst anhand der
eligibleRegion
,validFrom
,validThrough
undpriority
. - Berechnen Sie den Gebührenbetrag abhängig davon, ob die Entität mit einer
price
definiert wurde,percentageOfCart
- oderpricePerMeter
-Property. - Servicegebühr für Lieferung oder Abholung als LineItem mit
LineItemType
DELIVERY
bzw.FEE
. Gebühr hinzufügen in den Einkaufswagen.otherItems
.
Angebote anwenden
- Suchen Sie die Entität Deal anhand der
Promotion.
coupon
mit dem Deal.dealCode
. Validieren Sie den Deal und geben Sie bei Bedarf einen FoodOrderError zurück. Diese Fehler werden als behebbar eingestuft. Folgende Fehlertypen zurückgeben Bei Bedarf:
Fehlertyp Anwendungsfall PROMO_NOT_RECOGNIZED Der Gutscheincode wurde nicht erkannt. PROMO_EXPIRED Die Gültigkeit des Angebots ist abgelaufen. PROMO_ORDER_INELIGIBLE Für diese Bestellung kann der Gutschein nicht eingelöst werden. PROMO_NOT_APPLICABLE Andere Gründe. Berechnen Sie den Dealpreis basierend auf dem Deal.
discount
oder DealdiscountPercentage
.Wenden Sie den Dealpreis anhand des Gesamtbetrags des Einkaufswagens oder der Gebühr an, je nachdem, Deal
dealType
.Gib den Einkaufswagen.
promotions
mit dem angewendeten Angebot zurück.Geben Sie das Angebot als LineItem mit LineItemType
DISCOUNT
Fügen Sie den Rabatt zur Einkaufswagen.otherItems
mit einem negativen Preis.
Antwort zurückgeben
- Erstellen Sie den ProposedOrder.
cart
Der Antworteinkaufswagen ist der entsprechen dem Warenkorb für Anfragen, wenn während der Validierung keine Fehler festgestellt werden. - Gibt die Liste ProposedOrder.
otherItems
mit dem Steuern, Gebühren, Trinkgeld und Ermäßigung. Siehe Gratuity für Weitere Informationen zur Konfiguration des Trinkgeldartikels finden Sie hier. - Fügen Sie den ProposedOrder
totalPrice
ein, indem Sie den Einkaufswagen hinzufügen. Preis, Gebühren, Rabatt, Steuern und Trinkgeld. - Geben Sie den
FoodOrderExtension.
availableFulfillmentOptions
mit die entsprechende FulfillmentOption. Geschätzten Wert aktualisieren Abhol- oder Lieferzeit bis zur voraussichtlichen Zeit. - Wenn FoodOrderErrors durch die vorherigen Validierungsprüfungen generiert wurden:
<ph type="x-smartling-placeholder">
- </ph>
- Fügen Sie StructuredResponse.
error
und die Liste der Fehler in FoodErrorExtension.foodOrderErrors
. - Geben Sie ProposedOrder im
correctedProposedOrder
, wenn alle Fehler behoben werden können. - Geben Sie die PaymentOptions in der
paymentOptions
zurück. wenn alle Fehler behoben werden können. - Fügen Sie optional
additionalPaymentOptions
hinzu, falls weitere Zahlungsoptionen und alle Fehler können behoben werden.
- Fügen Sie StructuredResponse.
- Wenn keine Validierungsfehler vorliegen, wird
proposedOrder
zurückgegeben.paymentOptions
im CheckoutResponse-Objekt Fügen Sie optionaladditionalPaymentOptions
hinzu, falls weitere Zahlungsoptionen zur Verfügung.