Kullanıcıların yemek siparişlerini önceden planlayabilmesi için sipariş tamamlama adımınıza destek ekleyebilirsiniz. Bu desteği sipariş tamamlama işlemine uygulamadan önce, envanter feed'i şemasında (AdvanceServiceDeliveryHoursSpecification
) açıklandığı gibi, kullanıcıların ön sipariş verebileceği saatleri belirten bir hizmet envanteri feed'i oluşturun.
Ön sipariş aralıkları
Google, bir restoran veya hizmetin teslimat sürelerine (AdvanceServiceDeliveryHoursSpecification
bölümünde tanımlandığı şekilde) göre 7 güne kadar ileri tarihli, 15 dakikalık aralıklarla erken sipariş aralıkları önerir.
Ön sipariş için önerilen zaman aralıklarını almak üzere ödeme sırasında FoodCartExtension
nesnesinin fulfillmentPreference
alanında aşağıdaki değerleri kullanın:
PickupInfo.pickupTimeIso8601
DeliveryInfo.deliveryTimeIso8601
Ödeme aşamasında ön siparişleri uygulama
Aşağıdaki tabloda, kullanıcılar sipariş vermeye çalışırken ödeme sırasında sipariş karşılama yanıtınızı uygulayabileceğiniz olası yöntemler listelenmiştir.
Senaryo | Sipariş karşılama davranışı |
---|---|
İstenilen aralık için ön sipariş verilebilir. | Aynı yuvada bir ProposedOrder oluşturarak P0M ("en kısa sürede") veya FUTURE_SLOT arabasını kabul edin. Bir alanı kabul eden ödeme yanıtı örneği için bu kod snippet'ine bakın. |
İstenen aralık için ön sipariş karşılanamıyor. | Sağlayıcınız aşağıdakileri yapmalıdır:
Alternatif aralık öneren bir ödeme yanıtı örneği için bu kod snippet'ine bakın. |
Sipariş karşılama için alternatif slotlar
Ödeme sırasında Google tarafından önerilen önceden sipariş verme aralıkları uygun değilse sipariş karşılama ekibiniz CheckoutResponseMessage
nesnesini kullanarak alternatifler önerebilir.
Alternatif ön sipariş aralıklarını belirtmek için ödeme isteğine FoodErrorExtension
ile yanıt verin ve aşağıdaki değerleri ayarlayın:
foodOrderErrors
parametresinde hata türünü (ör.UNAVAILABLE_SLOT
,NO_CAPACITY
veyaCLOSED
) belirtin.correctedProposedOrder
parametresinde,availableFulfillmentOptions
aracılığıyla alternatifP0M
veyaFUTURE_SLOT
değerleri sağlayın.
Alternatif aralık, sipariş verme tarihinden sonraki 7 gün için geçerli olmalı ve kullanıcının istediği sepetin karşılanabileceği tüm aralıkları içermelidir.
Örneğin, öğle yemeği spesiyallerinin yalnızca pazartesiden cumaya 11:00-13:00 saatleri arasında sunulduğunu varsayalım. Kullanıcı daha sonra alışveriş sepetine özel öğle yemeği eklemeye çalışır ancak seçtiği zaman aralığı doludur. Bu durumda, öğle yemeği spesiyalleri sepette tutulmalı ve önümüzdeki 7 gün için yalnızca 11:00-13:00 arasındaki zaman aralıkları döndürülmelidir.
Yanıtınızda correctedProposedOrder.Cart.fulfillmentPreference
nesnesini çıkarmalısınız.
Kullanılabilir zaman aralığı yoksa veya restoran ya da hizmet önceden siparişleri desteklemiyorsa correctedProposedOrder
sağlamanıza gerek yoktur.
Restoran veya hizmetin ön sipariş almaya hazır olduğu durumlarda, ön sipariş için ödeme isteği ve yanıt akışı sırasında sipariş karşılama hizmetiniz ile Google arasında geçen JSON mesajları için aşağıdaki örneklere bakın.
Örnek: Teslimat aralığı içeren CheckoutRequest
Aşağıdaki snippet'te, ön sipariş teslimat aralığı içeren bir ödeme isteği örneği gösterilmektedir.
{
"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": {
...
}
}
}
}
]
}
]
}
Örnek: CheckoutResponse, aralığı kabul ediyor
Aşağıdaki snippet'te, sipariş karşılama ekibinizin önerilen ön sipariş aralıklarını kabul ettiği bir ödeme yanıtı örneği gösterilmektedir.
{
"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": {
...
}
}
}
}
]
}
}
}
Örnek: Alternatif slotlar içeren CheckoutResponse
Aşağıdaki snippet'te, sipariş karşılama ekibinizin alternatif ön sipariş aralıkları önerdiği bir ödeme yanıtı örneği gösterilmektedir. Yanıtınızda correctedProposedOrder.Cart.fulfillmentPreference
nesnesinin atlanması gerektiğini unutmayın.
{
"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": {
...
}
}
}
}
]
}
}
}
Sipariş gönderirken ön siparişleri uygulama
Sipariş gönderiminde, ön sipariş aralıklarında bir sorun varsa SubmitOrderResponseMessage
, RejectionInfo
nesnesinde nedeni (UNAVAILABLE_SLOT
veya UNKNOWN
gibi) içermelidir.
Sağlayıcı tarafından kabul edildiğinde siparişin durumunu OrderState
nesnesinde CREATED
yerine CONFIRMED
olarak güncelleyin. Seçilen zaman aralığını kullanıcıya gönderdiğiniz onay e-postasına ekleyin.
Sipariş karşılama ekibiniz siparişi restorana daha sonra gönderirse Asenkron Sipariş Güncelleme İşlemi'ni kullanarak Google'a bir güncelleme gönderin.
Siparişin yerine getirilmesiyle ilgili sipariş gönderme yanıtınızın veya sonraki eşzamansız sipariş güncellemelerinizin OrderUpdate
nesnesine, değeri aşağıdaki gibi ayarlanmış bir estimatedFulfillmentTimeIso8601
ekleyin:
- Sipariş durumu
CREATED
veyaCONFIRMED
olduğunda değeri, kullanıcının ön siparişi için planladığı teslimat veya teslim alma zamanına ayarlayın. - Restoran veya servisten daha doğru bir tahmini teslimat süresi olduğunda değeri, teslimat veya teslim alma süresi olarak ayarlayın.
Örnek: Teslimat aralığı içeren SubmitOrderRequest
Aşağıdaki snippet'te, kullanıcının seçtiği ön sipariş aralığını gösteren bir sipariş gönderme isteği örneği gösterilmektedir.
{
"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": {
...
}
}
}
}
]
}
]
}
Örnek: Siparişi kabul eden SubmitOrderResponse
Aşağıdaki snippet'te, sipariş gönderme yanıtı örneği gösterilmektedir. Bu örnekte, sipariş karşılama hizmetiniz kullanıcının ön siparişini kabul ettiğini onaylamaktadır.
{
"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"
}
}
}
}
]
}
}
}
Örnek: Açılış olmaması nedeniyle siparişi reddeden SubmitOrderResponse
Aşağıdaki snippet'te, sipariş karşılama hizmetinizin müsait olmayan bir zaman aralığı nedeniyle kullanıcının ön siparişini reddettiği bir sipariş gönderme yanıtı örneği gösterilmektedir.
{
"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": [
...
]
}
}
}
]
}
}
}
Ön sipariş örnekleri
AdvanceServiceDeliveryHoursSpecification
türü, kullanıcıların siparişlerini önceden planlamaları için teslimat veya teslim alma saatlerini belirtmek amacıyla kullanılabilir.
Not: Hizmet karşılama için belirtmeniz gereken iki ayrı zaman aralığı vardır: Kullanıcıların ne zaman sipariş verebileceğini belirten sipariş aralığı ve siparişin ne zaman karşılanacağını belirten karşılama aralığı.
nesnesi, kullanıcının ne zaman sipariş verebileceğini tanımlar. Alt öğelerin sipariş karşılama süreleri (OpeningHoursSpecification
veya ServiceDeliveryHoursSpecification
), siparişin ne zaman karşılanabileceğini tanımlar.AdvanceServiceDeliveryHoursSpecification
Aşağıdaki örnekte, bir hizmetin 15 dakikalık hizmet aralıkları ile ön sipariş kabul etme saatleri tanımlanmaktadır.
{ "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" } } ] } ] }
Aşağıdaki örnekte, hizmetin Noel günü aynı gün teslimat için açık, ancak aynı gün için planlanmış ileri siparişler için kapalı olduğunu nasıl belirtebileceğiniz gösterilmektedir. Bu örnek aşağıdaki senaryoları destekler:
- Kullanıcılar, 25 Aralık'ta aynı gün teslimat seçeneğiyle sipariş verebilir.
- Kullanıcılar 27 Aralık'ta teslim edilmesi planlanan ürünler için 25 Aralık'ta ön sipariş verebilir.
- Kullanıcılar 22 Aralık'ta 25 Aralık'ta teslimat için ön sipariş veremez.
{ "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" } }
Aşağıdaki örnekte, hizmetin aynı gün teslimat veya Noel günü için planlanmış ön siparişler için kapalı, daha sonraki bir gün için planlanmış ön siparişler için açık olduğunu nasıl belirtebileceğiniz gösterilmektedir. Bu örnek aşağıdaki senaryoları destekler:
- Kullanıcılar 25 Aralık'ta aynı gün teslimat seçeneğiyle sipariş veremez.
- Kullanıcılar 27 Aralık'ta teslim edilmesi planlanan ürünler için 25 Aralık'ta ön sipariş verebilir.
- Kullanıcılar 22 Aralık'ta 25 Aralık'ta teslimat için ön sipariş veremez.
{ "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" } ] }
Aşağıdaki örnek hizmet, siparişleri 7/24 kabul eder ve hafta içi 10:00-23:59:59 arasında teslimat yapar:
... { "@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" } } } ...
Aşağıdaki örnek hizmette siparişler her gün 08:00-20:59:59 arasında kabul edilir. Müşteriler bir saat içinde teslimat seçebilir veya aşağıdaki aralıklardan birini tercih edebilir:
... { "@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" } } ] } ...
Aşağıdaki örnekte, mağazanın hafta içi 08:00-16:59:59, hafta sonları ise 08:00-18:59 arasında açık olduğu bir durum gösterilmektedir. Siparişler 7/24 kabul edilmez.
... { // 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" } } ] } ...