고객이 주문을 제출한 후 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에 전송합니다. 오류 유형 NO_CAPACITY 의 actionOrderId , userVisibleOrderId , orderManagementActions , rejectionInfo , foodOrderError 가 있어야 합니다. |
사용 사례 2: 배송 기사를 이용할 수 없거나 배송지 주소가 범위를 벗어나 주문이 거부됩니다. | REJECTED 상태가 포함된 OrderUpdate 를 Google에 전송합니다. 오류 유형 OUT_OF_SERVICE_AREA 의 actionOrderId , userVisibleOrderId , orderManagementActions , rejectionInfo , foodOrderError 가 있어야 합니다. |
사용 사례 3: 음식점이 예기치 않게 문을 닫았거나 폐점 중이기 때문에 주문이 거부됩니다. | REJECTED 상태가 포함된 OrderUpdate 를 Google에 전송합니다. 오류 유형 CLOSED 의 actionOrderId , userVisibleOrderId , orderManagementActions , rejectionInfo , foodOrderError 가 있어야 합니다. |
사용 사례 4: 일부 상품의 재고가 없어 주문이 거부됩니다. | REJECTED 상태가 포함된 OrderUpdate 를 Google에 전송합니다. 오류 유형 AVAILABILITY_CHANGED 의 actionOrderId , userVisibleOrderId , orderManagementActions , rejectionInfo , foodOrderError 가 있어야 합니다. |
사용 사례 5: 알 수 없는 이유 또는 분류되지 않은 이유로 주문이 거부됩니다. | REJECTED 상태가 포함된 OrderUpdate 를 Google에 전송합니다. 오류 유형 UNKNOWN 의 actionOrderId , userVisibleOrderId , orderManagementActions , 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에 주문 상태, actionOrderId , userVisibleOrderId , orderManagementAction , 업데이트된 estimatedFulfillmentTime 가 포함된 OrderUpdate 를 전송합니다. |
사용 사례 2: 주문의 총 가격을 업데이트해야 합니다. | Google에 주문 상태(actionOrderId , userVisibleOrderId , orderManagementAction , estimatedFulfillmentTime )와 업데이트된 totalPrice 를 포함하는 OrderUpdate 를 전송합니다. |
사용 사례 3: 주문의 주문 관리 작업을 업데이트해야 합니다. | Google에 주문 상태, actionOrderId , userVisibleOrderId , estimatedFulfillmentTime , 업데이트된 orderManagementActions 가 포함된 OrderUpdate 를 전송합니다. |
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" } } } }