v1 önceden sipariş özelliği

Kullanıcıların teslim almayı planlamaları ve sipariş karşılama işlemleri için önceden teslim etmeye çalışın. Bu desteği sipariş karşılama, kullanıcıların çalışma saatlerini belirten bir hizmet envanteri feed'i oluşturun envanter feed'i şemasında açıklandığı gibi, ön sipariş verme (AdvanceServiceDeliveryHoursSpecification).

Gelişmiş sipariş aralıkları

Google, 15 dakikalık artışlarla, en fazla 7 gün sürecek ön sipariş aralıkları önerir bir restoran veya hizmetin sipariş karşılama sürelerine göre ( AdvanceServiceDeliveryHoursSpecification) tıklayın.

Önerilen siparişi önceden slotlarını almak için Ödeme sırasında FoodCartExtension nesnesinin fulfillmentPreference alanı:

  • PickupInfo.pickupTimeIso8601
  • DeliveryInfo.deliveryTimeIso8601

Ön siparişleri ödeme sırasında uygulayın

Aşağıdaki tabloda, sipariş karşılama ile ilgili uygulamalarınızın olası yolları kullanıcılar sipariş vermeye çalıştığında ödeme anında yanıt alın.

Senaryo Sipariş karşılama davranışı
İstenen zaman aralığı için ön sipariş yerine getirilebilir. P0M hükümlerini ("en kısa sürede") kabul edin veya Şu öğeyle bir ProposedOrder oluşturarak FUTURE_SLOT alışveriş sepeti seçebilirsiniz. Zaman aralığını kabul eden bir ödeme yanıtı örneği için bkz. bu kod snippet'ini kullanın.
İstenen zaman aralığı için ön sipariş yerine getirilemiyor. Sipariş karşılama işleminiz şu işlemleri gerçekleştirmelidir:
  1. İstenen P0M veya FUTURE_SLOT öğesini reddet ve siparişin neden karşılanamaması gerektiğini belirterek FoodErrorExtension nesnesini tıklayın.
    • Sipariş, kapasite nedeniyle karşılanamıyorsa bir NO_CAPACITY hata türünde FoodOrderError.
    • Restoranın açık olduğu için sipariş karşılanamıyorsa kapalı, hata türü için bir FoodOrderError belirtin CLOSED.
    • Sipariş, başka bir nedenden dolayı karşılanamazsa hata türü FoodOrderError belirtin UNAVAILABLE_SLOT.
  2. Mümkünse alternatif P0M sağlayın veya correctedProposedOrder içinde FUTURE_SLOT değerleri. Bu değerler, önümüzdeki 7 gün için geçerli tüm sipariş karşılama aralıkları olmalıdır. gün sonra şu anki saatten başlayarak. P0M aralığını dahil edin (geçerli durumlarda)

Alternatif alanlar öneren bir ödeme yanıtı örneği için bu kod snippet'ini kullanın.

Sipariş karşılama için alternatif slotlar

Ödeme sırasında, Google'ın önerdiği ön sipariş slotları uygun değilse sipariş karşılama, CheckoutResponseMessage kullanarak alternatifler önerebilir nesnesini tanımlayın.

Alternatif ön sipariş aralıkları belirtmek için ödeme isteğine FoodErrorExtension ve aşağıdaki değerleri ayarlayın:

  1. foodOrderErrors parametresinde hata türünü belirtin (ör. UNAVAILABLE_SLOT, NO_CAPACITY veya CLOSED).
  2. correctedProposedOrder parametresinde alternatif P0M veya availableFulfillmentOptions üzerinden FUTURE_SLOT değer.

Alternatif zaman aralıkları, sipariş tarihinden itibaren sonraki 7 gün boyunca olmalıdır. yerleşim ve kullanıcının istediği alışveriş sepetinin gönderilebileceği tüm alanları bilmek önemlidir.

Örneğin, öğle yemeği spesiyallerinin yalnızca pazartesiden cumaya sunulduğunu varsayalım saat 11:00 ile 13:00 arasında olacak. Kullanıcı, alışveriş sepetine öğle yemeği spesiyalleri eklemeye çalışıyor. seçilen zaman aralığı kullanılamıyor. Bu durumda, sipariş karşılama Öğle yemeği spesiyallerini alışveriş sepetinde tutma ve yalnızca 11:00 ile 13:00 arası zaman aralıklarını değiştirme sonraki 7 gün boyunca

correctedProposedOrder.Cart.fulfillmentPreference nesnesini atlamalısınız yanıt olarak ekleyebilirsiniz.

Boş zaman aralığı yoksa veya restoran ya da hizmet uygun değilse ön siparişleri desteklemenize rağmen, herhangi bir correctedProposedOrder

Sipariş karşılama ile Google arasındaki JSON mesajları için aşağıdaki örneklere bakın ön sipariş için ödeme isteği ve yanıt akışında, Restoran veya hizmet sunulduğunda ön sipariş verilebilir.

Örnek: Teslimat aralığı olan bir ödeme isteği

Aşağıdaki snippet'te, ön sipariş içeren bir ödeme isteği örneği gösterilmektedir. teslimat zaman aralığı.

{
  "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, zaman aralığını kabul ediyor

Aşağıdaki snippet'te, sipariş karşılamanın önerilen ön sipariş aralıklarını kabul eder.

{
  "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 yuvalarla CheckoutResponse

Aşağıdaki snippet'te, sipariş karşılamanın alternatif gelişmiş sipariş aralıkları önerir. Lütfen correctedProposedOrder.Cart.fulfillmentPreference nesne şurada atlanmalıdır: yanıt verirsiniz.

{
  "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önderilirken, ön sipariş aralıklarıyla ilgili bir sorun varsa SubmitOrderResponseMessage bunun nedenini (ör. UNAVAILABLE_SLOT veya UNKNOWN) RejectionInfo nesnesine eklenmelidir.

Siparişin CREATED olan durumunu CONFIRMED olarak güncellemek için OrderState nesne olarak kabul edilir. Şunu dahil et: belirli zaman aralığını seçin.

Sipariş karşılama işleminiz siparişi daha sonra restorana gönderiyorsa Google'a Eşzamansız Sipariş Güncelleme İşlemi'ni kullanarak güncelleyebilirsiniz.

Sipariş karşılama yanıtınızın OrderUpdate nesnesinde veya daha sonra eşzamansız sipariş güncellemelerinin yanı sıra estimatedFulfillmentTimeIso8601 değeri şu şekilde ayarlanmış olmalıdır:

  • Sipariş durumu CREATED veya CONFIRMED olduğunda değeri kullanıcının ön siparişi için planladığı teslimat veya teslim alma zamanı.
  • Restorandan daha doğru bir tahmini teslimat süresi sunulduğunda değeri, tahmini teslimat veya teslim alma süresine ayarlayın.

Örnek: Gönderim aralığıyla Send OrderRequest

Aşağıdaki snippet, kullanıcının seçtiği gelişmiş sipariş aralığına göre değişiklik gösterir.

{
  "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: Send OrderResponse'un siparişi kabul etmesi

Aşağıdaki snippet'te, sipariş karşılama, kullanıcının ön siparişini kabul ettiğini onaylar.

{
  "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: SubmitOrdersResponse, yuvanın kullanılamaması nedeniyle siparişi reddediyor

Aşağıdaki snippet'te, sipariş karşılama, müsait olmayan bir zaman aralığı nedeniyle kullanıcının ön siparişini reddeder.

{
  "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

Aşağıdakileri belirtmek için AdvanceServiceDeliveryHoursSpecification türü kullanılabilir: Kullanıcıların siparişlerini önceden planlayabilmeleri için teslimat veya teslim alma saatleri.

Not: Belirtmeniz gereken iki ayrı zaman aralığı vardır kullanıcıların sipariş tamamlaması için ne zaman sipariş verebileceğini belirten sipariş penceresi sipariş ve siparişin ne zaman karşılanacağını belirten sipariş karşılama dönemi. İlgili içeriği oluşturmak için kullanılan OpeningHoursSpecification nesnesi, kullanıcının vereyim. Çocuklar için sipariş karşılama süreleri (ServiceDeliveryHoursSpecification veya AdvanceServiceDeliveryHoursSpecification) karar vermeniz gerekir karşılandı.

Aşağıdaki örnekte bir hizmetin ön siparişleri kabul etmek için geçerli saatleri tanımlanmaktadır. 15 dakikalık servis aralığıyla çalışı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 şu anda açık olduğunu nasıl belirtebileceğiniz gösterilmektedir yılbaşı gününde aynı gün geçerli siparişler, ancak ileri tarihli siparişler için kapalı iletişim kurmuştu. Bu örnek aşağıdaki senaryoları destekler:

  • Kullanıcılar, aynı gün teslimat için 25 Aralık'tan önce sipariş verebilir.
  • Kullanıcılar, planlanan teslimat için 25 Aralık'ta ön sipariş verebilir Bu, 27 Aralık için.
  • Kullanıcılar, planlanan teslimat için 22 Aralık'ta ön sipariş veremez e-posta yazacaksınız.
{
  "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 kapalı olduğunu nasıl belirtebileceğiniz gösterilmektedir aynı gün içinde veya Noel günü için planlanmış ancak şu anda açık olan siparişlerde: ileri bir gün için planlanan gelişmiş siparişler. Bu örnek, aşağıdakini destekler senaryolar:

  • Kullanıcılar, aynı gün teslimat için 25 Aralık'tan itibaren sipariş veremez.
  • Kullanıcılar, planlanan teslimat için 25 Aralık'ta ön sipariş verebilir Bu, 27 Aralık için.
  • Kullanıcılar, planlanan teslimat için 22 Aralık'ta ön sipariş veremez e-posta yazacaksınız.
{
  "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, 7/24 siparişleri kabul eder ve şuradan teslimat yapar: Hafta içi 10:00-14: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"
    }
  }
}
...

Aşağıdaki örnek Hizmet, her gün 08:00-16:59:59 saatleri arasında siparişleri kabul etmektedir ve müşteriler, teslimat için bir saat içinde yuvalar:

...
{
  "@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 08:00-16:59:59 saatleri arasında açık olduğu bir vaka gösterilmektedir hafta sonları ise 08:00-18:59 arasında yapılır. 7/24 sipariş 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"
      }
    }
  ]
}
...