После звонка при оформлении заказа пользователь просматривает обновленную корзину с указанием налогов, сборов за доставку, скидок и других сборов, которые вы возвращаете. Пользователь подтверждает и отправляет заказ, а Google отправляет вашей конечной точке выполнения запрос JSON, содержащий информацию о заказе. Ваш веб-сервис должен получить этот заказ, обработать его и отправить ответ Google о состоянии заказа.
В этом разделе описывается формат сообщения с запросом заказа, отправленный Google, который называется SubmitOrderRequestMessage
, а также формат ответного сообщения, которое вы должны предоставить, который называется SubmitOrderResponseMessage
. Дополнительные сведения о жизненном цикле выполнения заказа см. в разделе Обзор выполнения .
Осуществление выполнения заказов
Веб-сервис Ordering End-to-End, который вы создаете для работы с Ordering End-to-End, должен включать конечную точку URL-адреса для получения сообщений о заказах от Google. Для обработки заказа ваш веб-сервис получает SubmitOrderRequestMessage
в формате JSON в виде запроса POST от Google. Этот запрос содержит заказ клиента, включая налоги, сборы и информацию об оплате. После получения запроса на отправку заказа ваш веб-сервис должен выполнить следующее:
- Проверьте правомерность транзакций, например проверку карты или обнаружение мошенничества.
- Создайте заказ в своей системе.
- Авторизуйте метод оплаты и вызовите API платежа вашего платежного процессора, если это применимо.
- В ответе укажите соответствующее состояние заказа:
CREATED
,CONFIRMED
илиREJECTED
.
После обработки заказа ваш код выполнения должен предоставить ответ в виде JSON-сообщения SubmitOrderResponseMessage
обратно в Google.
Дополнительные сведения о требованиях к реализации веб-службы сквозного выполнения заказов см. в обзоре выполнения .
Сообщение с запросом заказа
Когда клиент решает разместить заказ во время сквозного процесса заказа, Google отправляет запрос в ваш веб-сервис с сообщением JSON, называемым SubmitOrderRequestMessage
, которое содержит следующие данные:
- Намерение: поле
inputs[0].intent
каждого тела запроса на отправку заказа содержит строковое значениеactions.intent.TRANSACTION_DECISION
. - Заказ: поле
inputs[0].arguments[0].transactionDecisionValue
запроса на отправку заказа содержит объектOrder
, который представляет размещаемый заказ клиента, а также сведения о платеже. - Флаг песочницы: поле
isInSandbox
запроса на отправку заказа указывает, использует ли транзакция платежи в песочнице.
Пример запроса заказа
Ниже приведен пример 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 }
Ответное сообщение на заказ
После получения запроса ваша сквозная веб-служба заказа обрабатывает запрос и отправляет обратно сообщение SubmitOrderResponseMessage
, которое включает следующие данные:
-
OrderUpdate
: объект, содержащий состояние заказа и любые действия после заказа, доступные пользователю, такие как обращение в службу поддержки и просмотр сведений о заказе, которые вы определяете в полеfinalResponse.richResponse.items[0].structuredResponse.orderUpdate
ответ.
Поле обновления заказа
Когда ваш веб-сервис отправляет SubmitOrderResponseMessage
, он содержит поле OrderUpdate
, которое включает следующие поля:
-
actionOrderId
: уникальный идентификатор заказа, который используется для уникальной идентификации заказа в вашей системе и для ссылки на него при отправке последующих обновлений заказа. -
orderState
: объектOrderState
, представляющий состояние заказа. -
orderManagementActions
: действия после заказа, доступные пользователю, такие как обращение в службу поддержки и просмотр сведений о заказе. -
totalPrice
: общая стоимость заказа. Это необязательно. Отправляйте только в том случае, если общая стоимость заказа изменилась после его отправки.
Заказ может находиться в одном из следующих состояний:
-
CREATED
: ваша конечная точка выполнения успешно обработала заказ, но поставщик еще не подтвердил заказ. -
CONFIRMED
: ваша конечная точка выполнения успешно обработала заказ, и поставщик подтвердил заказ. -
REJECTED
: возникла проблема, и ваша конечная точка выполнения не смогла создать или подтвердить заказ, что может включать проблемы с оплатой.
Если вы установили заказ в состояние REJECTED
, укажите причину в поле rejectionInfo
в OrderUpdate
. Используйте значения FoodOrderUpdateExtension.FoodOrderErrors
в сочетании с rejectionInfo
типа UNKNOWN
и предоставьте описание.
Пример ответа на заказ
Ниже приведен пример 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" } } } } ] } } }
Неудачный запрос
Если запрос на отправку не удался, SubmitOrderResponseMessage
необходимо установить OrderState . state
REJECTED
. Ответ также должен включать RejectionInfo , который содержит объект RejectionType
для описания типа ошибки.
Пример неудачного ответа
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" } } } ] } } } ] } } }
Отправить заказ на реализацию
При реализации API заказа на отправку необходимо предпринять следующие шаги.
Валидация
- Выполните проверку услуг, корзины и рекламных акций, как это сделано в разделе «Настройка оформления заказа» .
- При необходимости верните RejectionInfo с одним из следующих типов:
ОтклонениеИнфоТип | Вариант использования |
---|---|
UNAVAILABLE_SLOT | Срок выполнения больше не действителен. |
PROMO_USER_INELIGIBLE | Используйте адрес электронной почты в объекте «Контакт» в запросе, чтобы подтвердить право пользователя на участие в рекламной акции. См. пример реализации заказа на отправку с рекламными акциями . |
INELIGIBLE |
|
PAYMENT_DECLINED | Платеж не может быть обработан. Например, это может быть связано с недостатком средств. |
UNKNOWN | Для любой другой ошибки проверки. |
Установите OrderState . state
REJECTED
, если обнаружены ошибки проверки. При желании вы можете указать конкретную причину отклонения, используя FoodOrderUpdateExtension . foodOrderErrors
. См. примеры в разделе «Подтверждение отправки заказа» .
Обработать платеж
- Рассчитайте
totalPrice
сложив цену корзины, сборы, скидки, налоги и чаевые.totalPrice
должен быть таким же, какtotalPrice
, возвращаемый в сообщении CheckoutResponseMessage, плюс изменение суммы вознаграждения, если вознаграждение может быть изменено пользователем. Для получения более подробной информации см. Изменение цен во время отправки заказа . - Обработайте заказ и оплату, если вы вернете ответ со статусом заказа
CREATED
илиCONFIRMED
. - Убедитесь, что возвращается допустимый формат ответа, используя сгенерированные типы, созданные на основе схемы, как описано в разделе «Создание клиентских библиотек» .
- Используйте GoogleProvidedPaymentInstrument .
instrumentToken
для обработки платежа. Возвращайте RejectionInfo с типомPAYMENT_DECLINED
, если платеж не может быть обработан. Дополнительную информацию см. в разделе «Обработка платежей» . - Уведомите пользователя сразу после обработки заказа по электронной почте или SMS.
Вернуть ответ
- Установите OrderState .
state
CREATED
илиCONFIRMED
, если ошибок нет. - Установите OrderState .
state
REJECTED
в случае возникновения ошибок и включите объект RejectionInfo с соответствующим RejectionInfoType . - Установите OrderUpdate .
orderManagementActions
.