Google Checkout einrichten

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.

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

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

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."
                }
              ]
            }
          }
        }
      ]
    }
  }
}