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
lubREJECTED
.
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:
- Intencja: pole
inputs[0].intent
w treści każdego żądania przesłania zamówienia zawiera wartość ciągu znakówactions.intent.TRANSACTION_DECISION
. - Zamówienie: pole
inputs[0].arguments[0].transactionDecisionValue
w żądaniu przesłania zamówienia zawiera obiektOrder
reprezentujący zamówienie klienta wraz ze szczegółami płatności. - 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 polufinalResponse.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
: obiektOrderState
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ę, SubmitOrderResponseMessage
musi 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
- Przeprowadź weryfikację usług, koszyka i promocji zgodnie z instrukcjami konfigurowania płatności.
- 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 |
|
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
- 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. - Przetwórz zamówienie i płatność, jeśli zwrócisz odpowiedź o stanie zamówienia
CREATED
lubCONFIRMED
. - Sprawdź, czy zwracany jest prawidłowy format odpowiedzi przy użyciu typów wygenerowanych na podstawie schematu opisanych w artykule o generowaniu bibliotek klienta.
- Użyj GoogleProvidedPaymentInstrument.
instrumentToken
, aby przetworzyć płatność. Jeśli nie można przetworzyć płatności, zwróć RejectionInfo typuPAYMENT_DECLINED
. Więcej informacji znajdziesz w artykule Przetwarzanie płatności. - powiadamia użytkownika e-mailem lub SMS-em natychmiast po przetworzeniu zamówienia;
Wysyłanie odpowiedzi
- Ustaw OrderState.
state
naCREATED
lubCONFIRMED
, jeśli nie ma błędów. - Jeśli wystąpiły błędy, ustaw wartość OrderState.
state
naREJECTED
i dodaj obiekt RejectionInfo z odpowiednim elementem RejectionInfoType. - Ustaw OrderUpdate.
orderManagementActions
.