Po rozmowie dotyczącej płatności użytkownik sprawdza zaktualizowany koszyk z podatkami, opłatami za dostawę, rabatami i innymi opłatami, które zwracasz. Użytkownik potwierdza i przesyła zamówienie, a Google wysyła do punktu końcowego realizacji żądanie JSON zawierające informacje o zamówieniu. Twoja usługa internetowa musi otrzymać to zamówienie, przetworzyć je i odezwać się do Google z informacją o stanie zamówienia.
W tym rozdziale opisujemy format wiadomości z zamówieniem wysyłanej przez Google, zwany SubmitOrderRequestMessage
, oraz format wiadomości z odpowiedzią, który musisz przesłać, zwany SubmitOrderResponseMessage
.
Więcej informacji o cyklu życia realizacji zamówienia znajdziesz w artykule Omówienie realizacji.
Realizacja zamówień
Usługa internetowa Kompleksowa pomoc w zamawianiu, którą tworzysz do współpracy z usługą Kompleksowa pomoc w zamawianiu, musi zawierać adres URL punktu końcowego do odbierania wiadomości o zamówieniach od Google. W przypadku przetwarzania zamówienia usługa internetowa otrzymuje SubmitOrderRequestMessage
w formacie JSON jako żądanie POST od Google. Ta prośba zawiera zamówienie klienta, w tym podatki, opłaty i informacje o płatności. Po otrzymaniu żądania przesłania zamówienia usługa internetowa musi wykonać te czynności:
- Sprawdzanie zgodności transakcji z wymaganiami, np. weryfikacja karty lub wykrywanie oszustw.
- Utwórz zamówienie w swoim systemie.
- Autoryzuj formę płatności i w stosownych przypadkach wywołaj interfejs API do obciążania klienta firmy obsługującej płatności.
- Odpowiedz, podając odpowiedni stan zamówienia:
CREATED
,CONFIRMED
lubREJECTED
.
Po przetworzeniu zamówienia Twój kod realizacji musi przesłać do Google odpowiedź w formie wiadomości SubmitOrderResponseMessage
w formacie JSON.
Więcej informacji o wymaganiach dotyczących implementacji usługi internetowej kompleksowego przetwarzania zamówień znajdziesz w omówieniu przetwarzania zamówień.
Wiadomość z prośbą o zamówienie
Gdy klient zdecyduje się złożyć zamówienie w ramach procesu zamawiania od początku do końca, Google wyśle do Twojej usługi internetowej żądanie z komunikatem JSON o nazwie SubmitOrderRequestMessage
, który zawiera te dane:
- Intencja: pole
inputs[0].intent
w treści każdego żądania przesłania zamówienia zawiera ciąg znakówactions.intent.TRANSACTION_DECISION
. - Zamówienie: pole
inputs[0].arguments[0].transactionDecisionValue
w żądaniu przesłania zamówienia zawiera obiektOrder
, który reprezentuje zamówienie klienta wraz ze szczegółami płatności. - Flaga piaskownicy: pole
isInSandbox
w prośbie o przesłanie zamówienia wskazuje, czy transakcja korzysta z płatności w piaskownicy.
Przykład prośby o zamówienie
Oto przykład: SubmitOrderRequestMessage
{ "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 }
Odpowiedź na zamówienie
Po otrzymaniu żądania usługa internetowa służąca do zamawiania przetwarza żądanie i wysyła odpowiedź SubmitOrderResponseMessage
, która zawiera te dane:
OrderUpdate
: obiekt zawierający stan zamówienia i wszystkie dostępne dla użytkownika działania po złożeniu zamówienia, takie jak kontakt z zespołem pomocy i wyświetlanie szczegółów zamówienia, które definiujesz w polufinalResponse.richResponse.items[0].structuredResponse.orderUpdate
odpowiedzi.
Pole aktualizacji zamówienia
Gdy usługa internetowa wysyła odpowiedź SubmitOrderResponseMessage
, zawiera ona pole OrderUpdate
, które zawiera te pola:
actionOrderId
: unikalny identyfikator zamówienia, który służy do jednoznacznej identyfikacji zamówienia w Twoim systemie i do którego odwołujesz się podczas wysyłania kolejnych aktualizacji zamówienia.orderState
: obiektOrderState
reprezentujący stan zamówienia.orderManagementActions
: działania dostępne dla użytkownika po złożeniu zamówienia, takie jak kontakt z zespołem obsługi klienta i wyświetlanie szczegółów zamówienia.totalPrice
: łączna cena zamówienia. Nie jest to jednak wymagane. Prześlij je 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ówień przetworzył zamówienie, ale dostawca nie potwierdził jeszcze zamówienia.CONFIRMED
: Twój punkt końcowy realizacji zamówień przetworzył zamówienie, a usługodawca je potwierdził.REJECTED
: wystąpił problem i Twój punkt końcowy realizacji nie mógł utworzyć lub potwierdzić zamówienia, co może obejmować problemy z płatnością.
Jeśli ustawisz stan zamówienia na REJECTED
, podaj przyczynę w polu rejectionInfo
w OrderUpdate
. Użyj wartości FoodOrderUpdateExtension.FoodOrderErrors
w połączeniu z atrybutem rejectionInfo
typu UNKNOWN
i podaj opis.
Przykład odpowiedzi na zamówienie
Oto przykład: SubmitOrderResponseMessage
{ "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" } } } } ] } } }
Nieudane żądanie
Jeśli żądanie przesłania nie powiedzie się, SubmitOrderResponseMessage
musi ustawić parametr OrderState.state
na REJECTED
. Odpowiedź musi też zawierać RejectionInfo, który zawiera obiekt RejectionType
opisujący typ błędu.
Przykład odpowiedzi z błędem
{ "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 zamówienia do wdrożenia
Podczas implementowania interfejsu API submit order należy wykonać te czynności:
Weryfikacja
- Przeprowadź weryfikację usługi, koszyka i promocji, tak jak w sekcji Konfiguracja płatności.
- W razie potrzeby zwracaj RejectionInfo z jednym z tych typów:
RejectionInfoType | Przypadek użycia |
---|---|
UNAVAILABLE_SLOT |
Czas realizacji nie jest już prawidłowy. |
PROMO_USER_INELIGIBLE |
Aby sprawdzić, czy użytkownik kwalifikuje się do promocji, użyj adresu e-mail w obiekcie Contact w żądaniu. Zobacz przykład w sekcji Wdrażanie przesyłania zamówienia z promocjami. |
INELIGIBLE |
|
PAYMENT_DECLINED |
Nie udało się przetworzyć płatności. Może to być na przykład spowodowane niewystarczającymi środkami. |
UNKNOWN |
W przypadku innych błędów weryfikacji. |
Jeśli wystąpią błędy walidacji, ustaw wartość OrderState.state
na REJECTED
. Opcjonalnie możesz podać konkretny powód odrzucenia, używając FoodOrderUpdateExtension.foodOrderErrors
Przykłady znajdziesz w sekcji Przesyłanie danych do weryfikacji zamówienia.
Przetwarzanie płatności
- Oblicz
totalPrice
, dodając cenę w koszyku, opłaty, rabat, podatki i napiwek. WartośćtotalPrice
powinna być taka sama jak wartośćtotalPrice
zwracana w CheckoutResponseMessage, z uwzględnieniem zmiany kwoty napiwku, jeśli użytkownik może ją zmienić. Więcej informacji znajdziesz w artykule Zmiany ceny podczas składania zamówienia. - przetworzyć zamówienie i płatność, jeśli zwrócisz odpowiedź ze stanem zamówienia
CREATED
lubCONFIRMED
; - Aby zwrócić prawidłowy format odpowiedzi, użyj wygenerowanych typów utworzonych na podstawie schematu zgodnie z opisem w artykule Generowanie bibliotek klienta.
- Użyj GoogleProvidedPaymentInstrument
instrumentToken
do przetworzenia płatności. W przypadku, gdy nie można przetworzyć płatności, zwracaj RejectionInfo z typemPAYMENT_DECLINED
. Aby dowiedzieć się więcej, zapoznaj się z artykułem Przetwarzanie płatności. - Powiadom użytkownika e-mailem lub SMS-em natychmiast po przetworzeniu zamówienia.
Zwracanie odpowiedzi
- Jeśli nie ma błędów, ustaw wartość OrderState.
state
naCREATED
lubCONFIRMED
. - Jeśli wystąpią błędy, ustaw parametr OrderState.
state
naREJECTED
i dołącz obiekt RejectionInfo z odpowiednim parametrem RejectionInfoType. - Ustaw OrderUpdate.
orderManagementActions