Konfiguracja funkcji Złóż zamówienie

Po wywołaniu płatności użytkownik sprawdza zaktualizowany koszyk z podatkami, opłatami za dostawę, rabatami i innymi opłatami. Użytkownik potwierdza i przesyła zamówienie, a Google wysyła do punktu końcowego realizacji zamówienia żądanie JSON zawierające informacje o zamówieniu. Twoja usługa internetowa musi otrzymać to zamówienie, przetworzyć je i przesłać do Google odpowiedź ze stanem zamówienia.

Ta sekcja opisuje format wysyłanej przez Google wiadomości z prośbą o zamówienie (SubmitOrderRequestMessage) oraz format takiej wiadomości (SubmitOrderResponseMessage). Więcej informacji o cyklu życia realizacji zamówienia znajdziesz w artykule omówienie realizacji zamówień.

Wdrożenie realizacji zamówienia

Kompleksowa usługa internetowa do obsługi zamówień, którą tworzysz, aby obsługiwała kompleksowe zamawianie, musi zawierać punkt końcowy adresu URL na potrzeby odbierania wiadomości dotyczących zamówień od Google. W celu przetwarzania zamówień usługa internetowa otrzymuje od Google żądanie SubmitOrderRequestMessage w formacie JSON jako żądanie POST. Zawiera ono zamówienie klienta, w tym podatki, opłaty i dane do płatności. Po otrzymaniu prośby o przesłanie zamówienia Twoja usługa internetowa musi wykonać te czynności:

  • sprawdzić, czy transakcja się kwalifikuje, np. weryfikacja karty lub wykrywanie oszustw.
  • Utwórz zamówienie w systemie.
  • Autoryzuj formę płatności i w razie potrzeby wywołaj interfejs API Charge firmy obsługującej płatności.
  • Odpowiedz, podając odpowiedni stan zamówienia: CREATED, CONFIRMED lub REJECTED.

Po przetworzeniu zamówienia kod realizacji musi odpowiedzieć w formie wiadomości JSON SubmitOrderResponseMessage wysłanej do Google.

Więcej informacji o wymaganiach związanych z implementacją usługi internetowej w zakresie kompleksowej realizacji zamówień znajdziesz w omówieniu realizacji zamówień.

Wiadomość z prośbą o zamówienie

Jeśli klient postanowi złożyć zamówienie w ramach całego procesu składania zamówień, Google wysyła żądanie do Twojej usługi internetowej z komunikatem w formacie JSON o nazwie SubmitOrderRequestMessage zawierającym te dane:

  1. Intencja: pole inputs[0].intent w treści każdego żądania przesłania zamówienia zawiera wartość ciągu znaków actions.intent.TRANSACTION_DECISION.
  2. Zamówienie: pole inputs[0].arguments[0].transactionDecisionValue w żądaniu przesłania zamówienia zawiera obiekt Order reprezentujący zamówienie klienta wraz ze szczegółami płatności.
  3. Flaga piaskownicy: pole isInSandbox w żądaniu przesłania zamówienia wskazuje, czy transakcja korzysta z płatności w trybie piaskownicy.

Przykład prośby o zamówienie

Oto przykład SubmitOrderRequestMessage:

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
}
    

Wiadomość z odpowiedzią na zamówienie

Po otrzymaniu żądania Twoja kompleksowa usługa internetowa do obsługi zamówień przetwarza je i wysyła SubmitOrderResponseMessage z tymi danymi:

  • OrderUpdate: obiekt zawierający stan zamówienia i wszelkie dostępne dla użytkownika działania po wykonaniu usługi, takie jak kontakt z zespołem pomocy czy wyświetlanie szczegółów zamówienia, które określasz w polu finalResponse.richResponse.items[0].structuredResponse.orderUpdate w odpowiedzi.

Pole aktualizacji zamówienia

Gdy usługa internetowa wysyła żądanie SubmitOrderResponseMessage, zawiera pole OrderUpdate z tymi polami:

  • actionOrderId: unikalny identyfikator zamówienia, który służy do jednoznacznego identyfikowania zamówienia w systemie i odwoływania się do niego podczas wysyłania kolejnych aktualizacji zamówienia.
  • orderState: obiekt OrderState reprezentujący stan zamówienia.
  • orderManagementActions: działania po zamówieniu dostępne dla użytkownika, takie jak kontakt z obsługą klienta czy wyświetlanie szczegółów zamówienia.
  • totalPrice: łączna cena zamówienia. Nie jest to jednak wymagane. Wyślij tylko wtedy, gdy łączna cena zamówienia zmieniła się po jego przesłaniu.

Zamówienie może mieć jeden z tych stanów:

  • CREATED: punkt końcowy realizacji zamówienia przetworzył zamówienie, ale dostawca jeszcze nie potwierdził zamówienia.
  • CONFIRMED: punkt końcowy realizacji zamówienia prawidłowo przetworzył zamówienie, a dostawca potwierdził zamówienie.
  • REJECTED: wystąpił problem i punkt końcowy realizacji zamówienia nie może utworzyć lub potwierdzić zamówienia, co może być związane z problemami z płatnością.

Jeśli ustawisz stan zamówienia na stan REJECTED, podaj powód w polu rejectionInfo OrderUpdate. Użyj wartości FoodOrderUpdateExtension.FoodOrderErrors w połączeniu z rejectionInfo typu UNKNOWN i podaj opis.

Przykład odpowiedzi na zamówienie

Oto przykład SubmitOrderResponseMessage:

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

Żądanie nie powiodło się

Jeśli żądanie nie powiedzie się, SubmitOrderResponseMessagemusi ustawić OrderState.state na REJECTED. Odpowiedź musi też zawierać obiekt RejectionInfo, który zawiera obiekt RejectionType opisujący typ błędu.

Przykład odpowiedzi nieudanej

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

Przesyłanie implementacji zamówienia

Opisane poniżej czynności należy wykonać podczas wdrażania interfejsu API służącego do przesyłania zamówień.

Weryfikacja

  1. Przeprowadź weryfikację usług, koszyka i promocji zgodnie z instrukcjami konfigurowania płatności.
  2. W razie potrzeby zwróć RejectionInfo, używając jednego z tych typów:
RejectionInfoType Przypadek użycia
UNAVAILABLE_SLOT Czas realizacji jest już nieważny.
PROMO_USER_INELIGIBLE Użyj adresu e-mail w obiekcie Contact (Kontakt) w prośbie, aby sprawdzić, czy użytkownik kwalifikuje się do skorzystania z promocji. Przykład znajdziesz w artykule o implementowaniu przesyłania zamówienia z promocjami.
INELIGIBLE
  • Informacje o użytkowniku, takie jak numer telefonu lub adres e-mail, są nieprawidłowe.
  • Twój program wykrywa oszustwo.
PAYMENT_DECLINED Nie można przetworzyć płatności. Może to być spowodowane niewystarczającymi środkami.
UNKNOWN W przypadku innych błędów weryfikacji.

W przypadku błędów weryfikacji ustaw OrderState.state na REJECTED. Opcjonalnie możesz podać konkretną przyczynę odrzucenia za pomocą FoodOrderUpdateExtension.foodOrderErrors Przykłady znajdziesz w artykule Sprawdzanie poprawności zamówienia.

Przetwarzanie płatności

  1. Oblicz totalPrice, dodając cenę koszyka, opłaty, rabat, podatki i napiwek. Wartość totalPrice powinna być taka sama jak wartość totalPrice zwrócona w funkcji CheckoutResponseMessage plus zmiana kwoty napiwku, jeśli użytkownik może ją zmodyfikować. Więcej informacji znajdziesz w sekcji Zmiany cen podczas przesyłania zamówienia.
  2. Przetwórz zamówienie i płatność, jeśli zwrócisz odpowiedź o stanie zamówienia CREATED lub CONFIRMED.
  3. Sprawdź, czy zwracany jest prawidłowy format odpowiedzi przy użyciu typów wygenerowanych na podstawie schematu opisanych w artykule o generowaniu bibliotek klienta.
  4. Użyj GoogleProvidedPaymentInstrument.instrumentToken, aby przetworzyć płatność. Jeśli nie można przetworzyć płatności, zwróć RejectionInfo typu PAYMENT_DECLINED. Więcej informacji znajdziesz w artykule Przetwarzanie płatności.
  5. powiadamia użytkownika e-mailem lub SMS-em natychmiast po przetworzeniu zamówienia;

Wysyłanie odpowiedzi

  1. Ustaw OrderState.state na CREATED lub CONFIRMED, jeśli nie ma błędów.
  2. Jeśli wystąpiły błędy, ustaw wartość OrderState.state na REJECTED i dodaj obiekt RejectionInfo z odpowiednim elementem RejectionInfoType.
  3. Ustaw OrderUpdate.orderManagementActions.