Direktkauf einrichten

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.

Die CheckoutResponseMessage gibt den unveränderten Einkaufswagen des Kunden oder einen Fehler zurück.

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 Stringwert actions.foodordering.intent.CHECKOUT.
  • Einkaufswagen: Das Feld inputs[0].arguments[0].extension einer Zahlungsanfrage enthält ein Cart-Objekt, das den Einkaufswagen des Kunden darstellt.
  • Lieferung oder Mitnehmen: Das Erweiterungsfeld des Cart-Objekts enthält ein FoodCartExtension-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.
  • 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: Ein cart-Objekt, das mit dem im CheckoutRequestMessage angegebenen Einkaufswagen identisch ist. Wenn der Inhalt des Einkaufswagens geändert werden muss, sollte die CheckoutResponseMessage stattdessen eine FoodErrorExtension mit einer korrigierten ProposedOrder 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: Ein FoodOrderExtension, 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ür PaymentOptions.

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.

  1. Lies in der Anfrage das Attribut FulfillmentOptionInfo, um festzustellen, ob der Ausführungstyp für delivery oder pickup gilt.
  2. 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.
    Hinweis: Spezielle Fenster haben Vorrang vor normalen Fenstern. Beispiele finden Sie unter Bestellfenster validieren und Dienstentitäten vorübergehend entfernen.
    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

  1. 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
  2. Die validierte Liste der Werbebuchungen mit LineItemType REGULAR zurückgeben. Die Summe aller Preise der Warenkorbpositionen ist der Warenkorbpreis oder SUBTOTAL.

Beispiele finden Sie unter Validierung von Einkaufswagenartikeln.

Servicegebühren berechnen

  1. Suchen Sie anhand von eligibleRegion, validFrom, validThrough und priority nach der richtigen Gebühren-Entität für den Dienst.
  2. Berechnen Sie den Gebührenbetrag basierend darauf, ob das Element mit einer price-, percentageOfCart- oder pricePerMeter-Property definiert wurde.
  3. 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

  1. Die Angebots-Entität wird anhand der Übereinstimmung des Werts Angebot.coupon mit dem Wert Angebot.dealCode ermittelt.
  2. 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
  3. Berechnen Sie den Dealpreis anhand von Deal.discount oder Deal.discountPercentage.

  4. Wenden Sie den Angebotspreis auf Grundlage des Einkaufswagengesamtpreises oder der Gesamtgebühr an, je nach Angebot.dealType

  5. Gib den Einkaufswagen.promotions mit angewendetem Angebot zurück.

  6. 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

  1. Erstelle die ProposedOrder.cart Der Antwortwagen entspricht dem Anfragewagen, wenn bei der Validierung keine Fehler auftreten.
  2. 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.
  3. Fügen Sie die ProposedOrdertotalPrice hinzu, indem Sie den Einkaufswagenpreis, Gebühren, Rabatte, Steuern und Trinkgelder hinzufügen.
  4. Gib die FoodOrderExtension.availableFulfillmentOptions mit der entsprechenden FulfillmentOption zurück. Aktualisieren Sie die voraussichtliche Abhol- oder Lieferzeit.
  5. 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.
  6. Wenn keine Validierungsfehler auftreten, gib proposedOrder und paymentOptions im CheckoutResponse-Objekt zurück. Fügen Sie optional das additionalPaymentOptions hinzu, wenn weitere Zahlungsoptionen verfügbar sind.