После звонка при оформлении заказа пользователь просматривает обновленную корзину с указанием налогов, сборов за доставку, скидок и других сборов, которые вы возвращаете. Пользователь подтверждает и отправляет заказ, а 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
:
{
"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
:
{
"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
для описания типа ошибки.
Пример неудачного ответа
{
"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
.