고객이 주문을 제출하면 고객에게 주문의 변경사항을 알릴 수 있습니다. Google에 주문 업데이트 메시지를 보내 주문을 처리합니다. 그런 다음 Google은 주문 UI 내에서 고객에게 전송합니다.
주문 업데이트를 전송하는 일반적인 이유는 다음과 같습니다.
- 주문의 예상 처리 시간이 가능해지거나 변경됩니다.
- 주문 상태가 변경됩니다.
- 더 이상 주문을 처리할 수 없습니다.
- 주문에 포함된 메뉴 항목의 가격이 변경됨
- 고객이 고객 지원팀과 같이 주문을 관리할 수 있는 새로운 방법을 사용할 수 있음 음식점 전화번호 등입니다.
- 주문 영수증이 제공됩니다.
예를 들어 다음 예시에서는 주문 업데이트를 사용하여
음식점에서 확인한 후 CREATED
에서 CONFIRMED
까지 고객의 주문
다음과 같습니다.
사용 사례 | 구현 방법 |
---|---|
사용 사례 1: 음식점에서 주문을 확인합니다. | CONFIRMED 상태의 OrderUpdate 가 전송됨
Google에 문의하기 actionOrderId 가 있어야 합니다.
userVisibleOrderId , orderManagementActions ,
estimatedFulfillmentTime 입니다. |
JSON
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "CONFIRMED", "label": "Provider confirmed" }, "receipt": { "userVisibleOrderId": "userVisibleId1234" }, "updateTime": "2017-07-17T12:00:00Z", "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ], "infoExtension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension", "estimatedFulfillmentTimeIso8601": "2017-07-17T13:00:00Z/2017-07-17T13:30:00Z" } } } }
프로젝트의 주문 업데이트 구현에 관한 기본사항은 가이드를 참고하세요. 비동기 순서 업데이트.
다음 섹션에서는 고급 주문 업데이트 시나리오에 대한 예시를 제공합니다.
거부됨 상태
아래 예는 다음을 위한 AsyncOrderUpdateRequestMessage
를 보여줍니다.
여러 가지 이유로 거부된 주문입니다. 거부의 예
식당에서 더 이상 주문을 처리할 수 없거나
주문과 연결된 배송지 주소가 범위를 벗어났습니다.
사용 사례 | 구현 방법 |
---|---|
사용 사례 1: 제공업체가 연락할 수 없어 주문이 거부되었습니다. 음식점 또는 음식점이 주문을 이행할 수 없는 경우 | REJECTED 상태의 OrderUpdate 을
Google actionOrderId 가 있어야 합니다.
userVisibleOrderId , orderManagementActions
rejectionInfo 및 오류 유형의 foodOrderError
NO_CAPACITY |
사용 사례 2: 운전자가 부재중이어서 주문이 거부되었습니다. 배송 주소가 범위를 벗어났습니다. | REJECTED 상태의 OrderUpdate 을
Google actionOrderId 가 있어야 합니다.
userVisibleOrderId , orderManagementActions
rejectionInfo 및 오류 유형의 foodOrderError
OUT_OF_SERVICE_AREA |
사용 사례 3: 음식점이 문을 닫았기 때문에 주문이 거부되었습니다. 닫히는 경우가 있을 수 있습니다. | REJECTED 상태의 OrderUpdate 을
Google actionOrderId 가 있어야 합니다.
userVisibleOrderId , orderManagementActions
rejectionInfo 및 오류 유형의 foodOrderError
CLOSED |
사용 사례 4: 일부 상품이 품절되어 주문이 거부되었습니다. 재고 있음 | REJECTED 상태의 OrderUpdate 을
Google actionOrderId 가 있어야 합니다.
userVisibleOrderId , orderManagementActions
rejectionInfo 및 오류 유형의 foodOrderError
AVAILABILITY_CHANGED |
사용 사례 5: 알 수 없거나 카테고리가 없어 주문이 거부됨 있습니다. | REJECTED 상태의 OrderUpdate 을
Google actionOrderId 가 있어야 합니다.
userVisibleOrderId , orderManagementActions ,
오류 유형 UNKNOWN 의 rejectionInfo 입니다. |
JSON
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "REJECTED", "label": "Order rejected" }, "updateTime": "2017-05-10T02:30:00.000Z", "rejectionInfo": { "type": "UNKNOWN", "reason": "Sorry, the restaurant cannot take your order right now." }, "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ], "infoExtension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension", "foodOrderErrors": [ { "error": "NO_CAPACITY", "description": "Sorry, the restaurant cannot take your order right now." } ] } } } }
JSON
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "REJECTED", "label": "Order rejected" }, "updateTime": "2017-05-10T02:30:00.000Z", "rejectionInfo": { "type": "UNKNOWN", "reason": "Sorry, delivery is currently not available to your address." }, "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ], "infoExtension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension", "foodOrderErrors": [ { "error": "OUT_OF_SERVICE_AREA", "description": "Sorry, delivery is currently not available to your address." } ] } } } }
JSON
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "REJECTED", "label": "Order rejected" }, "updateTime": "2017-05-10T02:30:00.000Z", "rejectionInfo": { "type": "UNKNOWN", "reason": "Sorry, the restaurant is closed unexpectedly." }, "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ], "infoExtension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension", "foodOrderErrors": [ { "error": "CLOSED", "description": "Sorry, the restaurant is closed unexpectedly." } ] } } } }
JSON
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "REJECTED", "label": "Order rejected" }, "updateTime": "2017-05-10T02:30:00.000Z", "rejectionInfo": { "type": "UNKNOWN", "reason": "Sorry, some of items are not available right now." }, "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ], "infoExtension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension", "foodOrderErrors": [ { "error": "AVAILABILITY_CHANGED", "id": "sample_menu_item_id", "description": "Sorry, some of the items are not available right now." } ] } } } }
JSON
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "REJECTED", "label": "Order rejected" }, "updateTime": "2017-05-10T02:30:00.000Z", "rejectionInfo": { "type": "UNKNOWN", "reason": "Sorry, your order is rejected." }, "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ] } } }
취소됨 상태
아래 예는 다음을 위한 AsyncOrderUpdateRequestMessage
를 보여줍니다.
고객 요청에 의해 취소된 주문
사용 사례 | 구현 방법 |
---|---|
사용 사례 1: 고객 요청에 의해 주문이 취소됨 | CANCELLED 상태의 OrderUpdate 을
Google actionOrderId 가 있어야 합니다.
userVisibleOrderId , orderManagementActions ,
cancellationInfo 입니다. |
JSON
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "CANCELLED", "label": "Order cancelled" }, "updateTime": "2017-05-10T02:30:00.000Z", "cancellationInfo": { "reason": "Customer requested" }, "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ] } } }
처리 상태
아래 예는 다음을 위한 AsyncOrderUpdateRequestMessage
를 보여줍니다.
확인할 수 있습니다
사용 사례 | 구현 방법 |
---|---|
사용 사례 1: 주문이 완료되었습니다. | FULFILLED 상태의 OrderUpdate 을
Google actionOrderId 가 있어야 합니다.
userVisibleOrderId , orderManagementActions |
JSON
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "FULFILLED", "label": "Order delivered" }, "updateTime": "2017-05-10T02:30:00.000Z", "fulfillmentInfo": { "deliveryTime": "2017-05-10T02:30:00.000Z" }, "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ] } } }
배송 중 상태
아래 예는 다음을 위한 AsyncOrderUpdateRequestMessage
를 보여줍니다.
고객에게 배송 중인 배송 주문 상품입니다.
사용 사례 | 구현 방법 |
---|---|
사용 사례 1: 배송 주문이 배송 중입니다. | IN_TRANSIT 상태의 OrderUpdate 보내기
Google에 문의하기 actionOrderId 가 있어야 합니다.
userVisibleOrderId , orderManagementActions ,
estimatedFulfillmentTime 입니다. |
JSON
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "IN_TRANSIT", "label": "Order is on the way" }, "inTransitInfo": { "updatedTime": "2017-07-17T12:00:00Z" }, "updateTime": "2017-07-17T12:00:00Z", "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ], "infoExtension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension", "estimatedFulfillmentTimeIso8601": "PT20M" } } } }
수령 준비 완료 상태
아래 예는 다음을 위한 AsyncOrderUpdateRequestMessage
를 보여줍니다.
고객이 수령할 준비가 된 주문입니다.
사용 사례 | 구현 방법 |
---|---|
사용 사례 1: 주문 상품을 수령할 준비가 되었습니다. | READY_FOR_PICKUP 와 함께 OrderUpdate 보내기
상태를 Google에 제출합니다. actionOrderId 가 있어야 합니다.
userVisibleOrderId , orderManagementActions ,
estimatedFulfillmentTime 입니다. |
JSON
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "READY_FOR_PICKUP", "label": "Order is ready for pickup" }, "updateTime": "2018-04-15T12:00:00Z", "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ], "infoExtension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension", "estimatedFulfillmentTimeIso8601": "PT20M" } } } }
음식 준비 상태
아래 예는 다음을 위한 AsyncOrderUpdateRequestMessage
를 보여줍니다.
음식점에서 준비 중인 주문이 표시됩니다.
사용 사례 | 구현 방법 |
---|---|
사용 사례 1: 음식점에서 주문을 준비하는 중입니다. | IN_PREPARATION 와 함께 OrderUpdate 보내기
상태를 Google에 제출합니다. actionOrderId 가 있어야 합니다.
userVisibleOrderId , orderManagementActions ,
estimatedFulfillmentTime 입니다. |
JSON
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "IN_PREPARATION", "label": "Order is being prepared" }, "updateTime": "2018-04-15T11:30:00Z", "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ], "infoExtension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension", "estimatedFulfillmentTimeIso8601": "PT20M" } } } }
주문 변경 상태
아래 예는 다음을 위한 AsyncOrderUpdateRequestMessage
를 보여줍니다.
고객 주문에 대한 여러 가지 변경
사용 사례 1: 예상 처리 시간을 업데이트해야 합니다. | 주문 상태와 함께 Google에 OrderUpdate 전송
actionOrderId , userVisibleOrderId
orderManagementAction 및 업데이트된
estimatedFulfillmentTime 입니다. |
사용 사례 2: 총 주문 가격을 업데이트해야 합니다. | 주문 상태와 함께 Google에 OrderUpdate 전송
actionOrderId , userVisibleOrderId
orderManagementAction , estimatedFulfillmentTime ,
업데이트된 totalPrice |
사용 사례 3: 주문의 주문 관리 작업이 이(가) 업데이트되었습니다. | 주문 상태와 함께 Google에 OrderUpdate 전송
actionOrderId , userVisibleOrderId
estimatedFulfillmentTime 및 업데이트된
orderManagementActions 입니다. |
JSON
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "CONFIRMED", "label": "Provider confirmed" }, "receipt": { "userVisibleOrderId": "userVisibleId1234" }, "updateTime": "2017-07-17T12:00:00Z", "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ], "infoExtension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension", "estimatedFulfillmentTimeIso8601": "2017-07-17T13:00:00Z/2017-07-17T13:30:00Z" } } } }
JSON
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "CONFIRMED", "label": "Provider confirmed" }, "receipt": { "userVisibleOrderId": "userVisibleId1234" }, "totalPrice": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "20", "nanos": 500000000 } }, "updateTime": "2017-07-17T12:00:00Z", "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ], "infoExtension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension", "estimatedFulfillmentTimeIso8601": "2017-07-17T13:00:00Z/2017-07-17T13:30:00Z" } } } }
JSON
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "CONFIRMED", "label": "Provider confirmed" }, "receipt": { "userVisibleOrderId": "userVisibleId1234" }, "updateTime": "2017-07-17T12:00:00Z", "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ], "infoExtension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension", "estimatedFulfillmentTimeIso8601": "2017-07-17T13:00:00Z/2017-07-17T13:30:00Z" } } } }