„Bestellung senden“ einrichten

Nach dem Bezahlanruf prüft der Nutzer den aktualisierten Einkaufswagen mit Steuern, Liefergebühren, Rabatten und sonstigen Gebühren, die Sie zurückgeben. Der Nutzer bestätigt und sendet die Bestellung. Google sendet dann eine JSON-Anfrage mit den Informationen zur Bestellung an den Auftragsausführungsendpunkt. Ihr Webdienst muss diese Bestellung erhalten, verarbeiten und Google mit dem Status der Bestellung antworten.

In diesem Abschnitt werden das von Google gesendete Nachrichtenformat für Bestellanfragen (SubmitOrderRequestMessage) und das Format der von Ihnen anzugebenden Antwortnachricht (SubmitOrderResponseMessage) beschrieben. Weitere Informationen zum Lebenszyklus der Auftragsabwicklung finden Sie unter Auftragsausführung.

Implementierung der Auftragsabwicklung

Der Bestell-End-to-End-Webdienst, den Sie für die Zusammenarbeit mit Bestell-End-to-End erstellen, muss einen URL-Endpunkt für den Empfang von Bestellnachrichten von Google enthalten. Zur Bestellverarbeitung empfängt Ihr Webdienst eine SubmitOrderRequestMessage im JSON-Format als POST-Anfrage von Google. Diese Anfrage enthält eine Kundenbestellung, einschließlich Steuern, Gebühren und Zahlungsinformationen. Bei Erhalt einer Bestellanforderung muss Ihr Webdienst folgende Schritte ausführen:

  • Prüfen Sie die Berechtigung für Transaktionen, z. B. Kartenüberprüfung oder Betrugserkennung.
  • Erstellen Sie einen Auftrag in Ihrem System.
  • Autorisieren Sie die Zahlungsmethode und rufen Sie gegebenenfalls die Charge API Ihres Zahlungsabwicklers auf.
  • Antworten Sie mit dem entsprechenden Status der Bestellung: CREATED, CONFIRMED oder REJECTED.

Nach der Verarbeitung der Bestellung muss der Auftragsausführungscode eine Antwort in Form einer SubmitOrderResponseMessage-JSON-Nachricht an Google senden.

Weitere Informationen zu den Implementierungsanforderungen für den Webdienst für die End-to-End-Auftragsausführung finden Sie in der Übersicht zur Auftragsausführung.

Nachricht zur Bestellanfrage

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

  1. Intent:Das Feld inputs[0].intent jedes Anfragens zum Senden einer Bestellung enthält den Stringwert actions.intent.TRANSACTION_DECISION.
  2. Order (Bestellung): Das Feld inputs[0].arguments[0].transactionDecisionValue einer Bestellanfrage enthält ein Order-Objekt, das die aufzugebende Bestellung des Kunden darstellt, sowie Zahlungsdetails.
  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
}
    

Antwortnachricht für Bestellung

Nachdem Sie eine Anfrage erhalten haben, verarbeitet Ihr Bestell-End-to-End-Webdienst die Anfrage und sendet eine SubmitOrderResponseMessage zurück, die die folgenden Daten enthält:

  • OrderUpdate: Ein Objekt, das den Status der Bestellung und alle Aktionen nach der Bestellung enthält, die dem Nutzer zur Verfügung stehen, z. B. die Kontaktaufnahme mit dem Support und das Aufrufen von Bestelldetails, die Sie im Feld finalResponse.richResponse.items[0].structuredResponse.orderUpdate der Antwort definieren.

Feld für Auftragsaktualisierung

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

  • actionOrderId: Die eindeutige ID der Bestellung, mit der die Bestellung in Ihrem System eindeutig identifiziert wird und auf die beim Senden nachfolgender Bestellaktualisierungen verwiesen wird.
  • orderState: Ein OrderState-Objekt, das den Status der Bestellung darstellt.
  • orderManagementActions: Nutzeraktionen nach der Bestellung, z. B. den Kundensupport kontaktieren und Bestelldetails ansehen.
  • totalPrice: Der Gesamtpreis der Bestellung. Dies ist optional. Nur senden, wenn sich der Gesamtpreis der Bestellung nach dem Absenden der Bestellung geändert hat.

Ein Auftrag kann einen der folgenden Status haben:

  • CREATED: Die Bestellung wurde vom Endpunkt der Auftragsausführung erfolgreich verarbeitet, der Anbieter hat sie jedoch noch nicht bestätigt.
  • CONFIRMED: Die Bestellung wurde vom Endpunkt für die Auftragsausführung erfolgreich verarbeitet und der Anbieter hat sie bestätigt.
  • REJECTED: Ein Problem ist aufgetreten und der Endpunkt für die Auftragsausführung konnte die Bestellung nicht erstellen oder bestätigen, was zu Zahlungsproblemen führen kann.

Wenn du für eine Bestellung den Status REJECTED festgelegt hast, gib 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 Sendeanfrage nicht erfolgreich ist, muss SubmitOrderResponseMessage OrderState.state auf REJECTED setzen. Die Antwort muss auch die RejectionInfo enthalten, die ein RejectionType-Objekt zur Beschreibung des Fehlertyps enthält.

Beispiel für eine nicht erfolgreiche 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 senden

Führen Sie die folgenden Schritte aus, wenn Sie die API zum Senden von Bestellungen implementieren.

Validierung

  1. Führen Sie die Validierungen von Diensten, Einkaufswagen und Angeboten wie unter Kasse einrichten beschrieben durch.
  2. Geben Sie bei Bedarf RejectionInfo mit einem der folgenden Typen zurück:
RejectionInfoType Anwendungsfall
UNAVAILABLE_SLOT Die Auftragsausführungszeit ist nicht mehr gültig.
PROMO_USER_INELIGIBLE Verwenden Sie die E-Mail-Adresse im Objekt Kontakt in der Anfrage, um zu prüfen, ob der Nutzer die Voraussetzungen für das Angebot erfüllt. Weitere Informationen finden Sie im Beispiel zum Implementieren von Bestellungen mit Angeboten.
INELIGIBLE
  • Nutzerinformationen wie Telefonnummer oder E-Mail-Adresse sind ungültig.
  • Ihre Risiko-Engine erkennt Betrug.
PAYMENT_DECLINED Die Zahlung kann nicht verarbeitet werden. Dies könnte beispielsweise an unzureichenden Mitteln liegen.
UNKNOWN Bei allen anderen Validierungsfehlern.

Legen Sie OrderState.state auf REJECTED fest, wenn Validierungsfehler auftreten. Optional kannst du über FoodOrderUpdateExtension.foodOrderErrors einen bestimmten Grund für die Ablehnung angeben. Beispiele finden Sie unter Bestellvalidierung senden.

Zahlung verarbeiten

  1. Berechnen Sie die totalPrice, indem Sie den Warenkorbpreis, die Gebühren, den Rabatt, die Steuern und das Trinkgeld addieren. totalPrice sollte mit dem in CheckoutResponseMessage zurückgegebenen totalPrice übereinstimmen, zuzüglich der Änderung des Trinkgelds, wenn das Trinkgeld vom Nutzer geändert werden kann. Weitere Informationen findest du unter Preisänderungen beim Senden der Bestellung.
  2. Verarbeiten Sie die Bestellung und Zahlung, wenn Sie eine Antwort mit dem Bestellstatus CREATED oder CONFIRMED zurückgeben.
  3. Sorgen Sie dafür, 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. Verwenden Sie zur Verarbeitung der Zahlung GoogleProvidedPaymentInstrument.instrumentToken. Wenn die Zahlung nicht verarbeitet werden kann, wird RejectionInfo vom Typ PAYMENT_DECLINED zurückgegeben. Weitere Informationen findest du unter Zahlungen verarbeiten.
  5. Benachrichtigen Sie den Nutzer sofort nach der Verarbeitung der Bestellung per E-Mail oder SMS.

Antwort zurückgeben

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