„Bestellung senden“ einrichten

Nach dem Bezahlvorgang Anruf, die Nutzenden den aktualisierten Warenkorb mit Steuern, Versandkosten, Rabatten andere Belastungen, die Sie zurücksenden. Der Nutzer bestätigt und sendet die Bestellung und Google sendet an Ihren Auftragsausführungsendpunkt eine JSON-Anfrage, die den Informationen zur Bestellung. Ihr Webdienst muss diese Bestellung erhalten, verarbeiten, und Google mit dem Status der Bestellung antworten.

In diesem Abschnitt wird das von Google gesendete Nachrichtenformat für Bestellanfragen beschrieben. mit dem Namen SubmitOrderRequestMessage und das Format der Antwortnachricht die Sie angeben müssen, SubmitOrderResponseMessage Weitere Informationen zum Lebenszyklus der Auftragsabwicklung findest du in der Übersicht zur Auftragsausführung:

Auftragsabwicklung implementieren

Der End-to-End-Webdienst für Bestellungen, den Sie für die Funktion „Ordering End-to-End“ erstellen, muss einen URL-Endpunkt für den Empfang von Bestellnachrichten von Google enthalten. Für Bestellung verarbeitet, erhält Ihr Webdienst eine SubmitOrderRequestMessage im JSON-Format als POST-Anfrage von Google formatieren. Diese Anfrage enthält eine Kundenbestellung, einschließlich Steuern, Gebühren und Zahlungsinformationen. Bei Erhalt einer Bestellung muss Ihr Webdienst folgende Voraussetzungen erfüllen:

  • Prüfe die Voraussetzungen für Transaktionen, 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.
  • Antworten Sie mit dem entsprechenden Status der Bestellung: CREATED, CONFIRMED oder REJECTED.

Nach der Bearbeitung der Bestellung muss der Auftragsausführungscode eine Antwort enthalten in Form einer SubmitOrderResponseMessage-JSON-Nachricht an Google zurück.

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

Nachricht zur Bestellanfrage

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

  1. Intent: Das Feld inputs[0].intent im Text jeder Bestellanfrage enthält den Stringwert actions.intent.TRANSACTION_DECISION.
  2. Reihenfolge:Das Feld inputs[0].arguments[0].transactionDecisionValue einer Anfrage zum Senden einer Bestellung enthält ein Order-Objekt, das den auf die Bestellung des Kunden und die Zahlungsdetails.
  3. Sandbox-Flag: Im Feld isInSandbox einer Anfrage zur Übermittlung einer Bestellung wird angegeben, 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
}
    

Bestellantwortnachricht

Nach Erhalt einer Anfrage verarbeitet Ihr End-to-End-Webdienst für Bestellungen die und sendet eine SubmitOrderResponseMessage zurück, die den Parameter folgende Daten:

  • OrderUpdate: Ein Objekt, das den Status der Bestellung und alle Aktionen nach der Bestellung, die dem Nutzer zur Verfügung stehen, wie etwa die Kontaktaufnahme mit dem Support und Bestelldetails anzeigen, die Sie in den Feld finalResponse.richResponse.items[0].structuredResponse.orderUpdate von auf die Antwort.

Feld zur Aktualisierung der Bestellung

Wenn Ihr Webdienst ein SubmitOrderResponseMessage sendet, enthält es ein OrderUpdate mit den folgenden Feldern:

  • actionOrderId: Die eindeutige ID der Bestellung, die für die Bestellung in Ihrem System identifizieren und darauf verweisen, wenn Sie zu aktualisieren.
  • orderState: Ein OrderState-Objekt, das den Status der Bestellung darstellt.
  • orderManagementActions: Aktionen für die Nachbestellung, die dem Nutzer zur Verfügung stehen, z. B. z. B. den Kundensupport kontaktieren und die Bestelldetails einsehen.
  • totalPrice: Der Gesamtpreis der Bestellung. Dies ist optional. Nur senden wenn sich der Gesamtpreis der Bestellung nach dem Absenden der Bestellung geändert hat.

Eine Bestellung kann einen der folgenden Status haben:

  • CREATED: Die Bestellung wurde von Ihrem Endpunkt für die Auftragsausführung verarbeitet, aber der Dienstleister hat die Bestellung noch nicht bestätigt.
  • CONFIRMED: Die Bestellung wurde von Ihrem Endpunkt für die Auftragsausführung verarbeitet, und der Dienstleister die Bestellung bestätigt hat.
  • REJECTED: Ein Problem ist aufgetreten und der Endpunkt für die Auftragsausführung konnte nicht Auftrag erstellen oder bestätigen, was Zahlungsprobleme umfassen kann.

Wenn Sie eine Bestellung auf den Status REJECTED setzen, geben Sie den Grund in der Feld rejectionInfo von OrderUpdate. 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 Anfrage nicht erfolgreich ist, muss SubmitOrderResponseMessage Folgendes festlegen: OrderState.state zu REJECTED. Die Antwort muss auch Fügen Sie die RejectionInfo hinzu, die ein RejectionType-Objekt enthalten. zur Beschreibung des Fehlertyps.

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

Auftragsimplementierung einreichen

Gehen Sie bei der Implementierung der API zum Senden von Bestellungen so vor:

Validierung

  1. Führen Sie die Service-, Warenkorb- und Angebotsprüfung wie unter Einrichtung Kasse.
  2. Geben Sie RejectionInfo mit einem der folgenden Typen zurück, wenn erforderlich:
RejectionInfoType Anwendungsfall
UNAVAILABLE_SLOT Die Auftragsausführungszeit ist nicht mehr gültig.
PROMO_USER_INELIGIBLE Verwenden Sie die E-Mail-Adresse im Objekt Contact in der Anfrage, um zu prüfen, ob der Nutzer das Angebot nutzen darf. Ein Beispiel finden Sie 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 könnte beispielsweise an unzureichenden Mitteln liegen.
UNKNOWN Bei allen anderen Validierungsfehlern.

Setze OrderState.state auf REJECTED, wenn eine Validierung vorhanden ist. Fehler aufgetreten. Optional können Sie einen spezifischen Grund für die Ablehnung angeben. FoodOrderUpdateExtension.foodOrderErrors. Beispiele finden Sie unter Bestellbestätigung senden

Zahlung bearbeiten

  1. Berechnen Sie den totalPrice, indem Sie den Warenkorbpreis, Gebühren, Rabatt, Steuern und Trinkgeld. totalPrice sollte mit der zurückgegebenen totalPrice übereinstimmen. in der CheckoutResponseMessage sowie die Änderung der den Trinkgeldbetrag, wenn dieser vom Nutzer geändert werden kann. Siehe Preis sich während des Bestellvorgangs ändert.
  2. Verarbeitung der Bestellung und Zahlung, wenn du eine Antwort mit einem Bestellstatus zurückgibst von CREATED oder CONFIRMED.
  3. Achten Sie darauf, dass ein gültiges Antwortformat zurückgegeben wird, indem Sie generierte Typen verwenden aus dem Schema erstellt, wie in Clientbibliotheken generieren.
  4. Verwenden Sie die Methode GoogleProvidedPaymentInstrument.instrumentToken um die Zahlung zu verarbeiten. RejectionInfo mit Typ zurückgeben PAYMENT_DECLINED, wenn die Zahlung nicht verarbeitet werden kann. Siehe Prozess Zahlungen.
  5. Benachrichtigen Sie den Nutzer sofort nach der Verarbeitung der Bestellung per E-Mail und oder SMS.

Antwort zurückgeben

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