고객이 주문을 제출하면 주문 업데이트 메시지를 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: 예상 처리 시간을 업데이트해야 합니다. | 주문 상태, actionOrderId , userVisibleOrderId , orderManagementAction 및 업데이트된 estimatedFulfillmentTime 와 함께 OrderUpdate 를 Google에 보냅니다. |
사용 사례 2: 총 주문 가격을 업데이트해야 합니다. | 주문 상태, actionOrderId , userVisibleOrderId , orderManagementAction , estimatedFulfillmentTime 및 업데이트된 totalPrice 과 함께 OrderUpdate 를 Google에 보냅니다. |
사용 사례 3: 주문의 주문 관리 작업을 업데이트해야 합니다. | 주문 상태, actionOrderId , userVisibleOrderId , estimatedFulfillmentTime 및 업데이트된 orderManagementActions 와 함께 OrderUpdate 를 Google에 보냅니다. |
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" } } } }