„Bestellung senden“ einrichten

Nach dem Checkout-Aufruf sieht sich der Nutzer den aktualisierten Einkaufswagen mit Steuern, Versandkosten, Rabatten und anderen Gebühren an, die du zurückgibst. Der Nutzer bestätigt und sendet die Bestellung. Google sendet dann eine JSON-Anfrage mit den Informationen zur Bestellung an Ihren Endpunkt für die Auftragsausführung. Ihr Webdienst muss diese Bestellung empfangen, verarbeiten und Google mit dem Status der Bestellung antworten.

In diesem Abschnitt wird das von Google gesendete Format der Bestellanfrage (SubmitOrderRequestMessage) und das Format der von dir bereitgestellten Antwortnachricht (SubmitOrderResponseMessage) beschrieben. Weitere Informationen zum Lebenszyklus der Auftragsausführung finden Sie in der Übersicht zur Auftragsausführung.

Implementierung der Auftragsausführung

Der Webdienst für Bestellungen – Ende-zu-Ende, den Sie für die Verwendung mit Bestellungen – Ende-zu-Ende erstellen, muss einen URL-Endpunkt zum Empfang von Bestellnachrichten von Google enthalten. Für die Auftragsverarbeitung erhält Ihr Webservice eine SubmitOrderRequestMessage im JSON-Format als POST-Anfrage von Google. Diese Anfrage enthält eine Kundenbestellung, einschließlich Steuern, Gebühren und Zahlungsinformationen. Wenn Ihr Webdienst eine Anfrage zum Einreichen einer Bestellung erhält, muss er Folgendes tun:

  • Prüfen, ob die Transaktion zulässig ist, z. B. Kartenbestätigung oder Betrugserkennung
  • Erstellen Sie einen Auftrag in Ihrem System.
  • Autorisieren Sie die Zahlungsmethode und rufen Sie gegebenenfalls die Charge API Ihres Zahlungsabwicklers auf.
  • Gib den Status der Bestellung an: CREATED, CONFIRMED oder REJECTED.

Nach der Bearbeitung der Bestellung muss dein Fulfillment-Code eine Antwort in Form einer SubmitOrderResponseMessage-JSON-Nachricht an Google zurückgeben.

Weitere Informationen zu den Anforderungen an die Implementierung des End-to-End-Fulfillment-Webdienstes für Bestellungen finden Sie in der Übersicht über die Auftragsausführung.

Nachricht mit Bestellanfrage

Wenn ein Kunde während des End-to-End-Bestellvorgangs eine Bestellung aufgibt, sendet Google eine Anfrage an Ihren Webservice mit einer JSON-Nachricht namens SubmitOrderRequestMessage, die die folgenden Daten enthält:

  1. Intent: Das Feld inputs[0].intent jedes Anfragetexts zum Senden einer Bestellung enthält den Stringwert actions.intent.TRANSACTION_DECISION.
  2. Bestellung:Das Feld inputs[0].arguments[0].transactionDecisionValue einer Anfrage zum Senden einer Bestellung enthält ein Order-Objekt, das die zu platzierende Bestellung des Kunden zusammen mit Zahlungsdetails darstellt.
  3. Sandbox-Flag:Das Feld isInSandbox einer Bestellanfrage gibt an, ob für die Transaktion Sandbox-Zahlungen verwendet werden.

Beispiel für eine Bestellanfrage

Folgendes ist ein SubmitOrderRequestMessage-Beispiel.

JSON

{
    "user": {},
    "conversation": {
        "conversationId": "CTKbKfUlHCyDEdcz_5PBJTtf"
    },
    "inputs": [
        {
            "intent": "actions.intent.TRANSACTION_DECISION",
            "arguments": [
                {
                    "transactionDecisionValue": {
                        "order": {
                            "finalOrder": {
                                "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"
                                                ]
                                            }
                                        },
                                        "contact": {
                                            "displayName": "Hab Sy",
                                            "email": "hab9878.sy@gmail.com",
                                            "phoneNumber": "+61000000000",
                                            "firstName": "Hab",
                                            "lastName": "Sy"
                                        }
                                    }
                                },
                                "otherItems": [
                                    {
                                        "name": "Delivery fee",
                                        "type": "DELIVERY",
                                        "price": {
                                            "type": "ESTIMATE",
                                            "amount": {
                                                "currencyCode": "AUD",
                                                "units": "3",
                                                "nanos": 500000000
                                            }
                                        }
                                    },
                                    {
                                        "name": "Subtotal",
                                        "type": "SUBTOTAL",
                                        "price": {
                                            "type": "ESTIMATE",
                                            "amount": {
                                                "currencyCode": "AUD",
                                                "units": "39",
                                                "nanos": 600000000
                                            }
                                        }
                                    }
                                ],
                                "totalPrice": {
                                    "type": "ESTIMATE",
                                    "amount": {
                                        "currencyCode": "AUD",
                                        "units": "43",
                                        "nanos": 100000000
                                    }
                                },
                                "extension": {
                                    "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension"
                                }
                            },
                            "googleOrderId": "01412971004192156198",
                            "orderDate": "2020-10-22T09:02:06.173Z",
                            "paymentInfo": {
                                "displayName": "Pay when you get your food",
                                "paymentType": "ON_FULFILLMENT"
                            }
                        }
                    }
                }
            ]
        }
    ],
    "directActionOnly": true,
    "isInSandbox": true
}
    

Bestellantwort

Nachdem eine Anfrage eingegangen ist, verarbeitet Ihr End-to-End-Webdienst für Bestellungen die Anfrage und sendet eine SubmitOrderResponseMessage zurück, die die folgenden Daten enthält:

  • OrderUpdate: Ein Objekt mit dem Status der Bestellung und allen nach der Bestellung verfügbaren Aktionen für den Nutzer, z. B. den Kontakt mit dem Support und die Anzeige von Bestelldetails. Sie definieren diese im Feld finalResponse.richResponse.items[0].structuredResponse.orderUpdate der Antwort.

Feld für Bestellaktualisierung

Wenn Ihr Webdienst eine SubmitOrderResponseMessage sendet, enthält sie ein OrderUpdate-Feld mit den folgenden Feldern:

  • actionOrderId: Die eindeutige ID der Bestellung, mit der die Bestellung in Ihrem System eindeutig identifiziert und beim Senden nachfolgender Bestellaktualisierungen darauf verwiesen wird.
  • orderState: Ein OrderState-Objekt, das den Status der Bestellung darstellt.
  • orderManagementActions: Aktionen nach der Bestellung, die dem Nutzer zur Verfügung stehen, z. B. den Kundensupport kontaktieren und Bestelldetails ansehen.
  • totalPrice: Der Gesamtpreis der Bestellung. Dies ist optional. Senden Sie diese Informationen nur, wenn sich der Gesamtpreis der Bestellung nach dem Senden der Bestellung geändert hat.

Bestellungen können einen der folgenden Status haben:

  • CREATED: Die Bestellung wurde über Ihren Auftragsausführungsendpunkt erfolgreich verarbeitet, aber der Anbieter hat sie noch nicht bestätigt.
  • CONFIRMED: Die Bestellung wurde über Ihren Auftragsausführungsendpunkt erfolgreich verarbeitet und der Anbieter hat sie bestätigt.
  • REJECTED: Es ist ein Problem aufgetreten und Ihr Fulfillment-Endpunkt konnte die Bestellung nicht erstellen oder bestätigen. Das kann auch an Problemen mit der Zahlung liegen.

Wenn Sie für eine Bestellung den Status REJECTED festlegen, geben Sie den Grund im Feld rejectionInfo von OrderUpdate an. Verwenden Sie FoodOrderUpdateExtension.FoodOrderErrors-Werte in Verbindung mit rejectionInfo vom Typ UNKNOWN und geben Sie eine Beschreibung an.

Beispiel für eine Bestellantwort

Folgendes ist ein SubmitOrderResponseMessage-Beispiel.

JSON

{
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "orderUpdate": {
              "actionOrderId": "1603357328160",
              "orderState": {
                "state": "CONFIRMED",
                "label": "Pending"
              },
              "updateTime": "2020-10-22T02:02:08-07:00",
              "orderManagementActions": [
                {
                  "type": "CUSTOMER_SERVICE",
                  "button": {
                    "title": "Call customer service",
                    "openUrlAction": {
                      "url": "tel:+61234561000"
                    }
                  }
                },
                {
                  "type": "VIEW_DETAILS",
                  "button": {
                    "title": "View order details",
                    "openUrlAction": {
                      "url": "https://partner.com/view/orderstatus"
                    }
                  }
                }
              ],
              "receipt": {
                "userVisibleOrderId": "BXZ-1603357328"
              }
            }
          }
        }
      ]
    }
  }
}

Anfrage fehlgeschlagen

Wenn eine Einreichungsanfrage fehlschlägt, muss SubmitOrderResponseMessage den OrderState.state auf REJECTED setzen. Die Antwort muss außerdem RejectionInfo enthalten, das ein RejectionType-Objekt zur Beschreibung des Fehlertyps enthält.

Beispiel für eine fehlgeschlagene Antwort

JSON

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "orderUpdate": {
              "actionOrderId": "sample_action_order_id",
              "orderState": {
                "state": "REJECTED",
                "label": "Order rejected"
              },
              "updateTime": "2017-05-10T02:30:00.000Z",
              "rejectionInfo": {
                "type": "PAYMENT_DECLINED",
                "reason": "Insufficient funds"
              },
              "orderManagementActions": [
                {
                  "type": "CUSTOMER_SERVICE",
                  "button": {
                    "title": "Contact customer service",
                    "openUrlAction": {
                      "url": "mailto:support@example.com"
                    }
                  }
                },
                {
                  "type": "EMAIL",
                  "button": {
                    "title": "Email restaurant",
                    "openUrlAction": {
                      "url": "mailto:person@example.com"
                    }
                  }
                },
                {
                  "type": "CALL",
                  "button": {
                    "title": "Call restaurant",
                    "openUrlAction": {
                      "url": "tel:+16505554679"
                    }
                  }
                },
                {
                  "type": "VIEW_DETAILS",
                  "button": {
                    "title": "View order",
                    "openUrlAction": {
                      "url": "https://orderview.partner.com?orderid=sample_action_order_id"
                    }
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}
    

Implementierung der Bestellung einreichen

Führen Sie die folgenden Schritte aus, um die API zum Einreichen von Bestellungen zu implementieren.

Validierung

  1. Führen Sie wie unter Kasse einrichten beschrieben Prüfungen für den Dienst, den Warenkorb und die Werbung durch.
  2. Gib RejectionInfo mit einem der folgenden Typen zurück, falls erforderlich:
RejectionInfoType Anwendungsfall
UNAVAILABLE_SLOT Die Lieferzeit ist nicht mehr gültig.
PROMO_USER_INELIGIBLE Verwende die E-Mail-Adresse im Kontakt-Objekt in der Anfrage, um die Berechtigung des Nutzers für das Angebot zu prüfen. Siehe Beispiel unter „Bestellung mit Angeboten senden“ implementieren.
INELIGIBLE
  • Nutzerinformationen wie Telefonnummer oder E-Mail-Adresse sind ungültig.
  • Ihre Risiko-Engine erkennt Betrug.
PAYMENT_DECLINED Die Zahlung kann nicht verarbeitet werden. Das kann beispielsweise an einem unzureichenden Guthaben liegen.
UNKNOWN Bei allen anderen Validierungsfehlern

Legen Sie OrderState.state auf REJECTED fest, wenn Validierungsfehler auftreten. Optional können Sie mit der FoodOrderUpdateExtension einen bestimmten Ablehnungsgrund angeben.foodOrderErrors Beispiele finden Sie unter Bestellbestätigung senden.

Zahlung verarbeiten

  1. Berechnen Sie den totalPrice, indem Sie den Einkaufswagenpreis, die Gebühren, den Rabatt, die Steuern und das Trinkgeld addieren. totalPrice muss mit dem totalPrice übereinstimmen, der in der CheckoutResponseMessage zurückgegeben wurde, zuzüglich der Änderung des Trinkgeldbetrags, falls das Trinkgeld vom Nutzer geändert werden kann. Weitere Informationen finden Sie unter Preisänderungen während der Bestellung.
  2. Verarbeite die Bestellung und Zahlung, wenn du eine Antwort mit dem Bestellstatus CREATED oder CONFIRMED zurückgibst.
  3. Achten Sie darauf, dass ein gültiges Antwortformat zurückgegeben wird. Verwenden Sie dazu generierte Typen, die aus dem Schema erstellt wurden, wie unter Clientbibliotheken generieren beschrieben.
  4. Verwende das GoogleProvidedPaymentInstrument,instrumentToken um die Zahlung zu verarbeiten. Gib RejectionInfo mit dem Typ PAYMENT_DECLINED zurück, wenn die Zahlung nicht verarbeitet werden kann. Weitere Informationen finden Sie unter Zahlungen verarbeiten.
  5. Benachrichtigen Sie den Nutzer sofort nach der Bearbeitung der Bestellung per E-Mail und/oder SMS.

Antwort zurückgeben

  1. Legen Sie OrderState.state auf CREATED oder CONFIRMED fest, wenn keine Fehler vorhanden sind.
  2. Legen Sie OrderState.state auf REJECTED fest, wenn Fehler auftreten, und fügen Sie das RejectionInfo-Objekt mit dem entsprechenden RejectionInfoType hinzu.
  3. Legen Sie OrderUpdate.orderManagementActions fest.