フルフィルメントに、ユーザーが集荷と集荷日時を設定できるようにサポートを追加できます。
料理のデリバリーを前もって注文できますこのサポートを
フルフィルメント、ユーザーの営業時間を指定するサービス在庫フィードを作成する
在庫フィードのスキーマに則って事前注文を行う
(AdvanceServiceDeliveryHoursSpecification
)。
事前注文スロット
Google では、15 分単位で最大 7 日間、事前注文枠を提案
レストランやサービスの納品時間に基づいて
AdvanceServiceDeliveryHoursSpecification
)。
提案された注文の事前スロットを取得するには、
購入手続き時の FoodCartExtension
オブジェクトの fulfillmentPreference
フィールド:
PickupInfo.pickupTimeIso8601
DeliveryInfo.deliveryTimeIso8601
購入手続き時の事前注文を実装する
次の表に、フルフィルメントの 購入手続きの際にユーザーが注文しようとしたときに レスポンスを返すようになります
シナリオ | フルフィルメントの動作 |
---|---|
リクエストした時間枠は事前注文に対応できます。 | P0M (「できるだけ早く」)に同意するか、
FUTURE_SLOT カートを作成して、ProposedOrder を
同じスロットを使用しますスロットを受け入れる購入手続きのレスポンスの例については、以下をご覧ください。
こちらのコード スニペットをご覧ください。 |
リクエストした時間枠の事前注文は処理できません。 | フルフィルメントでは、次のことを行う必要があります。
<ph type="x-smartling-placeholder">
代替スロットを提案する購入手続きのレスポンスの例については、以下をご覧ください。 こちらのコード スニペットをご覧ください。 |
注文フルフィルメントの代替スロット
ご購入手続き時に、Google から提案された事前注文スロットが適さない場合は、
フルフィルメントは、CheckoutResponseMessage
を使用して代替商品を提案できます。
渡されます。
別の事前注文スロットを指定するには、購入手続きのリクエストに
FoodErrorExtension
] をクリックし、次の値を設定します。
foodOrderErrors
パラメータで、エラーの種類(UNAVAILABLE_SLOT
、NO_CAPACITY
、CLOSED
など)。correctedProposedOrder
パラメータで、代替のP0M
を指定します。またはavailableFulfillmentOptions
でFUTURE_SLOT
の値。
代替時間枠は注文時から 7 日間である必要があります。 ユーザーがリクエストしたカートが広告スペースに 処理されます。
たとえば、スペシャル ランチが月曜日から金曜日まで営業するとします。 午前 11 時から午後 1 時までです。その後、ユーザーはスペシャル ランチをカートに追加しようとしましたが、 選択したスロットは利用できません。この場合、フルフィルメントは 昼食の特典をカートに入れたままにして、午前 11 時から午後 1 時までの時間枠のみを返す 今後 7 日間
correctedProposedOrder.Cart.fulfillmentPreference
オブジェクトは省略する必要があります。
回答に含めます。
空いている時間枠がない場合、またはレストランやサービスが予約枠を獲得できない場合
事前注文のサポートであれば、
correctedProposedOrder
。
フルフィルメントと Google の間の JSON メッセージについては、以下の例をご覧ください。 事前注文の購入手続きのリクエストと応答のフローで、 予約を受け付けることができます。
例: 配信スロットを指定した CheckoutRequest
以下のスニペットは、事前注文を含む購入手続きリクエストの例を示しています。 配信スロットを指定します
{
"inputs": [
{
"intent": "actions.foodordering.intent.CHECKOUT",
"arguments": [
{
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.Cart",
"merchant": {
"id": "https://www.exampleprovider.com/merchant/id1",
"name": "Cucina Venti"
},
"lineItems": [
{
"name": "Sizzling Prawns Dinner",
"type": "REGULAR",
"id": "sample_item_offer_id_1",
"offerId": "https://www.exampleprovider.com/menu/item/offer/id1",
"quantity": 1,
"price": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "USD",
"units": "16",
"nanos": 750000000
}
},
}
],
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
"fulfillmentPreference": {
"fulfillmentInfo": {
"delivery": {
// Deliver at 6:30PM.
"deliveryTimeIso8601": "2017-12-14T18:30:00-07:00"
}
}
},
"location": {
...
}
}
}
}
]
}
]
}
例: スロットを受け入れる CheckoutResponse
以下のスニペットは、購入手続きのレスポンスで、フルフィルメントは 提示された事前注文のスロットを承認します。
{
"expectUserResponse": false,
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"checkoutResponse": {
"proposedOrder": {
"id": "sample_proposed_order_id_1",
"cart": {
"merchant": {
"id": "https://www.exampleprovider.com/merchant/id1",
"name": "Falafel Bite"
},
"lineItems": [
{
"name": "Sizzling Prawns Dinner",
"type": "REGULAR",
"id": "sample_item_offer_id_1",
"offerId": "https://www.exampleprovider.com/menu/item/offer/id1",
"quantity": 1,
"price": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "USD",
"units": "16",
"nanos": 750000000
}
},
}
],
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
"fulfillmentPreference": {
"fulfillmentInfo": {
"delivery": {
// Same as the time in the request.
"deliveryTimeIso8601": "2017-12-14T18:30:00-07:00"
}
}
},
"location": {
...
}
}
},
"totalPrice": {
"type": "ESTIMATE",
"amount": {
// Represents $16.75
"currencyCode": "USD",
"units": "16",
"nanos": 750000000
}
},
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension",
// Send whole proposed order back.
"availableFulfillmentOptions": [
"fulfillmentInfo": {
"delivery": {
// Same as the time in the request.
"deliveryTimeIso8601": "2017-12-14T18:30:00-07:00"
}
}
]
}
},
"paymentOptions": {
...
}
}
}
}
]
}
}
}
例: 代替スロットを含む CheckoutResponse
以下のスニペットは、購入手続きのレスポンスで、フルフィルメントは
代替の事前注文スロットが提案されます。なお、
correctedProposedOrder.Cart.fulfillmentPreference
オブジェクトは、
できます。
{
"expectUserResponse": false,
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"error": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension",
"foodOrderErrors": [
{
"error": "UNAVAILABLE_SLOT", // Cart level error
"description": "The restaurant is closed."
}
],
"correctedProposedOrder": {
// Send whole original cart back,
// without the fulfillmentPreference.
"cart": {
...
},
"otherItems": {
...
},
"totalPrice": {
...
},
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension",
"availableFulfillmentOptions": [
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "2017-12-14T19:00:00-07:00"
}
},
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "2017-12-14T19:30:00-07:00"
}
},
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "2017-12-14T20:00:00-07:00"
}
}
]
}
},
"paymentOptions": {
...
}
}
}
}
]
}
}
}
注文の送信時に事前注文を実装する
注文の送信時に事前注文のスロットに問題がある場合は、
SubmitOrderResponseMessage
に理由(
UNAVAILABLE_SLOT
または UNKNOWN
)を RejectionInfo
オブジェクトで呼び出します。
注文のステータスを CREATED
から CONFIRMED
に
OrderState
オブジェクト。次を含める:
ユーザー宛ての確認メールで、選択した時間帯を選択します。
フルフィルメントによって注文が後でレストランに送信される場合は、Google に 非同期 Order Update Action を使用した更新。
フルフィルメントの注文送信レスポンスの OrderUpdate
オブジェクト、または
非同期での注文更新を行う場合は、
次のように値を設定した estimatedFulfillmentTimeIso8601
。
- 注文ステータスが
CREATED
またはCONFIRMED
の場合は、値を ユーザーが事前注文にスケジュール設定した配送時間または受け取り時間。 - レストランからの目安のお届け日数がより正確である場合 配送または受け取りの目安時間に設定します。
例: 配信スロットを指定した SubmitOrderRequest
以下のスニペットは、注文の送信リクエストの例を示しています。 予約枠です。
{
"inputs": [
{
"intent": "actions.intent.TRANSACTION_DECISION",
"arguments": [
{
"transactionDecisionValue": {
"order": {
"finalOrder": {
"cart": {
"notes": "Guest prefers their food to be hot when it is delivered.",
"merchant": {
"id": "https://www.exampleprovider.com/merchant/id1",
"name": "Cucina Venti"
},
"lineItems": [
{
"name": "Sizzling Prawns Dinner",
"type": "REGULAR",
"id": "sample_item_offer_id_1",
"offerId": "https://www.exampleprovider.com/menu/item/offer/id1",
"quantity": 1,
"price": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "USD",
"units": "16",
"nanos": 750000000
}
}
}
],
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
"fulfillmentPreference": {
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "2017-12-14T18:30:00-07:00"
}
}
}
"contact": {
...
}
}
},
"totalPrice": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "USD",
"units": "16",
"nanos": 750000000
}
},
"id": "sample_final_order_id",
"extension": {
// Send whole proposed order back.
"availableFulfillmentOptions": [
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "2017-12-14T18:30:00-07:00"
}
]
}
},
"googleOrderId": "sample_google_order_id",
"orderDate": "2017-07-17T12:00:00Z",
"paymentInfo": {
...
}
}
}
}
]
}
]
}
例: SubmitOrderResponse で注文を受け入れる
以下のスニペットは、注文の送信レスポンスで、 フルフィルメントで、ユーザーの事前注文を受け付けたことを確認します。
{
"expectUserResponse": false,
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"orderUpdate": {
"actionOrderId": "sample_action_order_id",
"orderState": {
"state": "CREATED",
"label": "Order placed"
},
"receipt": {
"userVisibleOrderId": "userVisibleId1234"
},
"updateTime": "2017-07-17T12:00:00Z",
"orderManagementActions": [
...
],
"infoExtension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension",
// Same as the user selected time.
"estimatedFulfillmentTimeIso8601": "2017-12-14T18:30:00-07:00"
}
}
}
}
]
}
}
}
例: スロットが使用できないために注文を不承認とする SubmitOrderResponse
以下のスニペットは、注文の送信レスポンスで、 予約できない時間枠のために、フルフィルメントで事前注文が拒否された。
{
"expectUserResponse": false,
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"orderUpdate": {
"actionOrderId": "sample_action_order_id",
"orderState": {
"state": "REJECTED",
"label": "Unavailable slot"
},
"rejectionInfo": {
// Note that this UNAVAILABLE_SLOT is different from the enum
// with the same name proposed for FoodOrderError.
"state": "UNAVAILABLE_SLOT",
"label": "Unavailable slot"
},
"updateTime": "2017-07-17T12:00:00Z",
"orderManagementActions": [
...
]
}
}
}
]
}
}
}
事前注文の例
AdvanceServiceDeliveryHoursSpecification
タイプを使用すると、以下を指定できます。
ユーザーが事前に注文のスケジュールを設定できる、配達または受け取り時間。
注: 2 つの異なる時間枠を指定する必要があります。
サービス フルフィルメントの場合: ユーザーが商品をいつ注文できるかを指定する注文期間
注文、注文が処理されるタイミングを指定するフルフィルメント期間。「
オブジェクトは、ユーザーがいつメッセージを
注文できます。子フルフィルメントの所要時間(OpeningHoursSpecification
)
または ServiceDeliveryHoursSpecification
など)を使用して、注文をいつ実行できるかを定義します。
処理されます。AdvanceServiceDeliveryHoursSpecification
次の例では、事前注文を受け付ける受付時間を定義しています。 15 分間隔で運行しています。
{ "hoursAvailable": [ { "@type": "OpeningHoursSpecification", "opens": "T00:00:00", // Ordering available 24 hours "closes": "T23:59:59", "deliveryHours": [ { "@type": "ServiceDeliveryHoursSpecification", "opens": "T09:00:00", // ASAP orders b/w 9am and 8:59:59pm "closes": "T21:00:00", "deliveryLeadTime": { "value": "60", "unitCode": "MIN" } }, { "@type": "AdvanceServiceDeliveryHoursSpecification", "opens": "T10:00:00", // Delivery between 10AM and 7:59:59PM "closes": "T20:00:00", "serviceTimeInterval": "PT15M", // in slots spaced 15 minutes apart (ISO8601) "advanceBookingRequirement": { "minValue": 60, // The slot should be at least 60 mins away "maxValue": 8640, // but not more than 6 days away "unitCode": "MIN" } } ] } ] }
次の例は、サービスがオープンであることを指定する方法を示しています。 クリスマス日に当日配達注文をしますが、事前注文は できます。この例は、次のシナリオをサポートしています。
- 12 月 25 日に注文すると、同日配達が可能になります。
- お客様は 12 月 25 日に配達予定の事前注文を行うことができます 12 月 27 日です
- 12 月 22 日に、お客様は配送予定日の事前注文を行えません 12 月 25 日。
{ "specialOpeningHoursSpecification": { "@type": "AdvanceServiceDeliveryHoursSpecification", "validFrom": "2018-12-25T00:00:00-07:00", "validThrough": "2018-12-26T00:00:00-07:00", "opens": "T00:00:00", // No advance ordering "closes": "T00:00:00" } }
次の例は、サービスの終了を指定する方法を示しています。 当日配達または事前注文のうち、クリスマスに予定されている注文 翌日に予約することもできますこの例は以下をサポートしています。 シナリオ:
- お客様が 12 月 25 日に当日配達の注文を行うことはできません。
- お客様は 12 月 25 日に配達予定の事前注文を行うことができます 12 月 27 日です
- 12 月 22 日に、お客様は配送予定日の事前注文を行えません 12 月 25 日。
{ "specialOpeningHoursSpecification": [ { "@type": "ServiceDeliveryHoursSpecification", "validFrom": "2018-12-25T00:00:00-07:00", "validThrough": "2018-12-26T00:00:00-07:00", "opens": "T00:00:00", // No ASAP ordering on Christmas "closes": "T00:00:00" }, { "@type": "AdvanceServiceDeliveryHoursSpecification", "validFrom": "2018-12-25T00:00:00-07:00", "validThrough": "2018-12-26T00:00:00-07:00", "opens": "T00:00:00", // Orders cannot be scheduled for Christmas "closes": "T00:00:00" } ] }
次のサンプル Service は、24 時間年中無休で注文を受け付け、 平日午前 10 時~午後 2 時 59 分 59 秒:
... { "@type": "OpeningHoursSpecification", "opens": "T00:00:00", "closes": "T23:59:59", "deliveryHours": { "@type": "AdvanceServiceDeliveryHoursSpecification", "opens": "T10:00:00", // Delivery starts at 10:00AM "closes": "T15:00:00", // Delivery ends at 3:00PM. Delivery from 10AM-2:59:59PM. "dayOfWeek": [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" ], "serviceTimeInterval": "PT15M", // in slots spaced 15 minutes apart "advanceBookingRequirement": { "minValue": 60, // The slot should be at least 60 mins away "maxValue": 8640, // but not more than 6 days away "unitCode": "MIN" } } } ...
次のサンプル Service では、毎日午前 8 時から午後 4 時 59 分 59 秒までの注文を受け付け、 ユーザーは 1 時間以内に配達を選択するか、または スロット:
... { "@type": "OpeningHoursSpecification", "opens": "T08:00:00", // Ordering opens at 8:00AM "closes": "T17:00:00", // Ordering closes at 5:00PM, last order at 4:59:59PM "deliveryHours": [ { "@type": "ServiceDeliveryHoursSpecification", "opens": "T08:00:00", "closes": "T17:00:00", "deliveryLeadTime": { "@type": "QuantitativeValue", "value": "60", // If no exact deliveryLeadTime, put a maximum time "unitCode": "MIN" } }, { "@type": "AdvanceServiceDeliveryHoursSpecification", "opens": "T08:00:00", "closes": "T17:00:00", "serviceTimeInterval": "PT15M", // in slots spaced 15 minutes apart "advanceBookingRequirement": { "minValue": 90, // The slot should be at least 90 mins away "maxValue": 8640, // but not more than 6 days away "unitCode": "MIN" } } ] } ...
次のサンプルは、店舗の営業時間が午前 8 時~午後 4 時 59 分 59 秒の場合を示しています。 平日は午前 8 時~午後 6 時 59 分です。注文は 24 時間 365 日対応していません。
... { // On weekdays, ordering open from 8AM-4:59:59PM. "@type": "OpeningHoursSpecification", "opens": "T08:00:00", "closes": "T17:00:00", "dayOfWeek": [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" ], "deliveryHours": [ { // Fulfillment between 8AM-4:59:59PM on weekdays. "@type": "AdvanceServiceDeliveryHoursSpecification", "opens": "T08:00:00", "closes": "T17:00:00", "dayOfWeek": [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" ], "serviceTimeInterval": "PT15M", "advanceBookingRequirement": { "minValue": 60, "maxValue": 8640, "unitCode": "MIN" } }, { // Fulfillment between 8AM-6:59:59PM on weekends (even for orders placed on a // weekday). "@type": "AdvanceServiceDeliveryHoursSpecification", "opens": "T08:00:00", "closes": "T19:00:00", "dayOfWeek": [ "Saturday", "Sunday" ], "serviceTimeInterval": "PT15M", "advanceBookingRequirement": { "minValue": 60, "maxValue": 8640, "unitCode": "MIN" } } ] }, { // On weekends, one can place orders upto 6:59:59PM. "@type": "OpeningHoursSpecification", "opens": "T08:00:00", "closes": "T19:00:00", "dayOfWeek": [ "Saturday", "Sunday" ], "deliveryHours": [ { // But fulfillment on weekdays is only till 4:59:59PM. "@type": "AdvanceServiceDeliveryHoursSpecification", "opens": "T08:00:00", "closes": "T17:00:00", "dayOfWeek": [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" ], "serviceTimeInterval": "PT15M", "advanceBookingRequirement": { "minValue": 60, "maxValue": 8640, "unitCode": "MIN" } }, { // Fulfillment on weekends is till 6:59:59PM. "@type": "AdvanceServiceDeliveryHoursSpecification", "opens": "T08:00:00", "closes": "T19:00:00", "dayOfWeek": [ "Saturday", "Sunday" ], "serviceTimeInterval": "PT15M", "advanceBookingRequirement": { "minValue": 60, "maxValue": 8640, "unitCode": "MIN" } } ] } ...