Menü feed'lerini ve sipariş karşılama alışveriş sepeti öğelerini eşleme
Müşteriler Menü feed'inizdeki öğeleri alışveriş sepetlerine ekleyip ödeme yaptığında Google, fiyatlarını ve stok durumlarını doğrulamak için bu öğeleri sipariş karşılama uç noktanıza gönderir. Fiyatlandırma ve stok durumu doğrulandıktan sonra müşteri sipariş verebilir. Bu bölümde, menü feed'i öğelerinin sipariş karşılama sepeti öğeleriyle nasıl eşleştirileceği gösterilmektedir.
Bu bölümdeki örnekler, Menü feed'i ve Alışveriş sepeti şemasının sadeleştirilmiş sürümleridir. Yalnızca Menü feed'i ile Alışveriş sepeti nesnesi arasındaki eşlemeyi göstermekle alakalı alanlar gösterilir. Tam şemalar için bkz. Menu
ve Cart
.
Menu
feed'inde bir alışveriş sepetine eklenen öğeler, hem ödeme hem de sipariş gönderimi için Cart
nesnesinde gönderilir.
- Basit bir
MenuItem
,lineItems
dizisindeLineItem
olarak gösterilir.offerId
, Menü feed'inde seçilen menü öğesininoffer.id
öğesidir. - Gerekli
MenuItemOption
içeren birMenuItem
,lineItems
dizisindeLineItem
olarak temsil edilir.offerId
, Menü feed'indeki seçili menü öğesi seçeneğininoffer.id
değeridir. LineItem
simgesininAddOnMenuItem
değeri,FoodItemExtension
öğesininoptions
dizisindeFoodItemOption
olarak temsil edilir. Her seçenekte, menü feed'indeki seçili eklenti menü öğesininoffer.id
değerine karşılık gelen birofferId
bulunur. Eklentinin her bir seçeneğin içindesubOptions
olarak temsil edilen iç içe yerleştirilmiş AddOnMenüItem(s) öğeleri de içerebileceğini unutmayın.
Aşağıdaki örneklerde, menü feed'i ile sipariş karşılama sepeti arasındaki menü öğeleri eşlenmiştir.
JSON
Bu örnekte basit menü öğelerinin bir listesi bulunmaktadır.
Menü feed'indeki menü öğeleri:
{ "@type": "Menu", "@id": "menu_id", "hasMenuItem": [ { "@type": "MenuItem", "@id": "menuitem_id_1", "offers": [ { "@type": "Offer", "@id": "menuitem_offer_id_1", "price": "p_1", "priceCurrency": "USD" } ] }, { "@type": "MenuItem", "@id": "menuitem_id_2", "offers": [ { "@type": "Offer", "@id": "menuitem_offer_id_2", "price": "p_2", "priceCurrency": "USD" } ] } ] }
Sipariş karşılama sepetiyle eşleştirilen menü öğeleri:
{ "@type": "Cart", "lineItems": [ { "offerId": "menuitem_offer_id_1", "price": { "amount": { "currencyCode": "USD", "units": "dollar(q_1*p_1)", "nanos": "cent(q_1*p_1)" } }, "quantity": "q_1" }, { "offerId": "menuitem_offer_id_2", "price": { "amount": { "currencyCode": "USD", "units": "dollar(q_2*p_2)", "nanos": "cent(q_2*p_2)" } }, "quantity": "q_2" } ] }
JSON
Bu örnek, bir veya daha fazla AddOnMenüItems içeren bir menü öğesi içerir.
Menü feed'indeki menü öğeleri:
{ "@type": "Menu", "@id": "menu_id", "hasMenuItem": [ { "@type": "MenuItem", "@id": "menuitem_id_1", "offers": [ { "@type": "Offer", "@id": "menuitem_offer_id_1", "price": "p_1", "priceCurrency": "USD" } ], "menuAddOn": [ { "@type": "MenuAddOnSection", "@id": "menuaddon_section_id_1", "hasMenuItem": [ { "@type": "AddOnMenuItem", "@id": "menuitem_addon_id_1", "offers": [ { "@type": "Offer", "@id": "menuitem_addon_offer_id_1", "price": "addon_p_1", "priceCurrency": "USD" } ] }, { "@type": "AddOnMenuItem", "@id": "menuitem_addon_id_2", "offers": [ { "@type": "Offer", "@id": "menuitem_addon_offer_id_2", "price": "addon_p_2", "priceCurrency": "USD" } ] } ] } ] }, { "@type": "MenuItem", "@id": "menuitem_id_2", "offers": [ { "@type": "Offer", "@id": "menuitem_offer_id_2", "price": "p_2", "priceCurrency": "USD" } ] } ] }
Sipariş karşılama sepetiyle eşleştirilen menü öğeleri:
{ "@type": "Cart", "lineItems": [ { "offerId": "menuitem_offer_id_1", "price": { "amount": { "currencyCode": "USD", "units": "dollar(q_1*(p_1 + addon_q_1*addon_p_1 + addon_q_2*addon_p_2))", "nanos": "cent(q_1*(p_1 + addon_q_1*addon_p_1 + addon_q_2*addon_p_2))" } }, "quantity": "q_1", "extension": { "@type": "FoodItemExtension", "options": [ { "offerId": "menuitem_addon_offer_id_1", "price": { "currencyCode": "USD", "units": "dollar(addon_q_1*addon_p_1)", "nanos": "cent(addon_q_1*addon_p_1)" }, "quantity": "addon_q_1" }, { "offerId": "menuitem_addon_offer_id_2", "price": { "currencyCode": "USD", "units": "dollar(addon_q_2*addon_p_2)", "nanos": "cent(addon_q_2*addon_p_2)" }, "quantity": "addon_q_2" } ] } }, { "offerId": "menuitem_offer_id_2", "price": { "amount": { "currencyCode": "USD", "units": "dollar(q_2*p_2)", "nanos": "cent(q_2*p_2)" } }, "quantity": "q_2" } ] }
JSON
Bu örnekte, menü öğesi seçenekleri, AddOnMenüItems ve iç içe yerleştirilmiş AddOnMenüItems içeren bir menü öğesi bulunur
Menü feed'indeki menü öğeleri:
{ "@type": "MenuItem", "@id": "menuitem_id_1", "hasMenuItemOptions": [ { "@type": "MenuItemOption", "value": { "@type": "PropertyValue", "name": "OPTION", "value": "Large", "offers": [ { "@type": "Offer", "@id": "menuitem_option_offer_id_1", "price": "p_1", "priceCurrency": "USD" } ], "menuAddOn": [ { "@type": "AddOnMenuSection", "@id": "menuitem_option_addon_section_id_1", "hasMenuItem": [ { "@type": "AddOnMenuItem", "@id": "menuitem_option_addon_id_1", "offers": [ { "@type": "Offer", "@id": "menuitem_option_addon_offer_id_1", "price": "addon_p_1", "priceCurrency": "USD" } ] }, { "@type": "AddOnMenuItem", "@id": "menuitem_option_addon_id_2", "offers": [ { "@type": "Offer", "@id": "menuitem_option_addon_offer_id_2", "price": "addon_p_2", "priceCurrency": "USD" } ], "menuAddOn": [ { "@type": "AddOnMenuSection", "@id": "menuitem_option_subaddon_section_id_1", "hasMenuItem": [ { "@type": "AddOnMenuItem", "@id": "menuitem_option_subaddon_id_1", "offers": [ { "@type": "Offer", "@id": "menuitem_option_subaddon_offer_id_1", "price": "subaddon_p_1", "priceCurrency": "USD" } ] } ] } ] } ] } ] } } ] }
Sipariş karşılama sepetiyle eşleştirilen menü öğeleri:
{ "@type": "Cart", "lineItems": [ { "offerId": "menuitem_option_offer_id_1", "price": { "amount": { "currencyCode": "USD", "units": "dollar(q_1*(p_1 + addon_q_1*addon_p_1 + addon_q_2*(addon_p_2 + subaddon_q_1*subaddon_p_1)))", "nanos": "cent(q_1*(p_1 + addon_q_1*addon_p_1 + addon_q_2*(addon_p_2 + subaddon_q_1*subaddon_p_1)))" } }, "quantity": "q_1", "extension": { "@type": "FoodItemExtension", "options": [ { "offerId": "menuitem_option_addon_offer_id_1", "price": { "currencyCode": "USD", "units": "dollar(addon_q_1*addon_p_1)", "nanos": "cent(addon_q_1*addon_p_1)" }, "quantity": "addon_q_1" }, { "offerId": "menuitem_option_addon_offer_id_2", "price": { "currencyCode": "USD", "units": "dollar(addon_q_2*(addon_p_2 + subaddon_q_1*subaddon_p_1))", "nanos": "cent(addon_q_2*(addon_p_2 + subaddon_q_1*subaddon_p_1))" }, "quantity": "addon_q_2", "subOptions": [ { "offerId": "menuitem_option_subaddon_offer_id_1", "price": { "currencyCode": "USD", "units": "dollar(subaddon_q_1*subaddon_p_1)", "nanos": "cent(subaddon_q_1*subaddon_p_1)" }, "quantity": "subaddon_q_1" } ] } ] } } ] }
Hataları işleme
CheckoutRequestMessage
öğesini işlerken sorun yaşarsanız CheckoutResponse yerine FoodErrorExtension
içeren bir CheckoutResponseMessage
ile yanıt verebilirsiniz. İşleme sırasında oluşan bir veya daha fazla hatayı tanımlamak için bu yanıtı kullanabilirsiniz.
Hataları ele almanın 2 yolu vardır:
- Kurtarılabilir hatalar: Kullanıcının siparişi göndermek için alışveriş sepetini düzenlemesi gerekmez. Örneğin,
Cart
içindeki bir öğede fiyat değişikliği olduğunu belirlersenizcorrectedProposedOrder
vepaymentOptions
ile birliktePRICE_CHANGED
hata türündeFoodOrderError
ile yanıt verebilirsiniz. Google, kullanıcıyı değişiklik konusunda bilgilendirir ancak kullanıcınıncorrectedProposedOrder
ile göndermesine izin verir. Kullanıcı ayrıca geri dönüp isterse alışveriş sepetini düzenleyebilir. Yeni birCheckoutRequestMessage
veyaSubmitOrderRequestMessage
alırsınız. - Kurtarılamaz hatalar: Kullanıcının siparişi göndermeden önce alışveriş sepetini düzenlemesi gerekir. Örneğin, restoranın kapalı olduğunu belirlerseniz
CLOSED
hata türündeFoodOrderError
ile yanıt verebilirsiniz. Google, kullanıcıyı bilgilendirir ve yeni bir restorana güncelleme yapmak için etkileşimi yönetir. Yeni bir alışveriş sepeti için yeni birCheckoutRequestMessage
alırsınız.
Genel olarak, alışveriş sepeti düzeyindeki hataları düzeltilemez, öğe düzeyindeki hataları ise kurtarılamaz hale getirin. Hata türlerinin tam listesi ve anlamları için FoodOrderError
sayfasını inceleyin.
Fiyat değişikliklerini işleme
Ödeme sırasında fiyat değişiklikleri
Müşterinin ödeme isteğini işlerken bir fiyat sorunuyla karşılaşırsanız aşağıdakileri yapın:
- Hataları işleme bölümünde açıklandığı gibi,
CheckoutRequestMessage
içinFoodErrorExtension
içeren birCheckoutResponseMessage
ile yanıt verin. - Hata yanıtında, fiyatı doğru değere güncellemek için
correctedProposedOrder.cart
öğesini kullanın. Google, düzeltilmiş siparişi alır ve yeni birCheckoutRequestMessage
düzenleyebilir.
Ödeme işleminden sonra Google, ProposedOrder
değiştirilip değiştirilmediğinden bağımsız olarak son kullanıcıya bir sipariş onayı sayfası gösterir.
ProposedOrder düzeltilmişse Google kullanıcıyı değişiklikler hakkında bilgilendirmek için ek uyarılar gösterebilir. Kullanıcı siparişi vermeyi kabul ederse ödeme isteği alınmaz. Akış, düzeltilen ProposedOrder
ile sipariş göndermeye devam ediyor.
Ancak kullanıcı dilediği zaman fikrini değiştirip alışveriş sepetini tekrar düzenleyebilir. Alışveriş sepeti bu şekilde güncellendiğinde Google yeni bir CheckoutRequestMessage
gönderir.
Sipariş gönderilirken fiyat değişiklikleri
Sipariş gönderimini işlerken bir fiyat sorunuyla karşılaşırsanız (actions.intent.TRANSACTION_DECISION
amacı tetiklendi) hata mesajı göndermeyin veya yanıtınızdaki fiyatı güncellemeyin. SubmitOrderRequestMessage
'daki fiyatlar, miktarlar veya diğer ayrıntılar verilerinizle eşleşmiyorsa siparişin istendiği gibi verilemediğini belirtmek için REJECTED
olarak ayarlanmış orderState
ile yanıt verin.
Ardından, sipariş ve ödeme ayrıntıları geçerliyse orderState
öğesini CREATED
veya CONFIRMED
olarak ayarlayın. Ayrıca, sisteminizdeki siparişin kimliğini temsil edecek bir actionOrderId
ekleyin. Sonraki güncellemeler gönderilirken bu kimlik kullanılmalıdır.
Ödemeyi işleyemiyorsanız ve SubmitOrderRequestMessage
'i zaten gönderdiyseniz kullanıcıya siparişin gerçekleşmeyeceğini bildirmek için orderState
REJECTED
değerine ayarlanmış bir AsyncOrderUpdateRequestMessage
gönderebilirsiniz.
Sipariş gönderildikten sonra fiyat değişiklikleri
Fiyatın, müşteri siparişini gönderirken kullanılan fiyattan farklı olduğunu tespit ederseniz Zaman Uyumsuz Sipariş Güncellemelerini Uygulama bölümünde açıklandığı gibi yeni fiyatla bir AsyncOrderUpdateRequestMessage
düzenleyebilirsiniz.
Fiyatları, eş zamansız sipariş güncellemelerini kullanarak güncellemek için:
lineItemUpdates[x].price
cinsinden fiyatı değiştirin. Bu değer, öğelerin eklentiler dahil toplam maliyetini yansıtır ve miktarla çarpılır. (Daha fazla bilgi içinLineItem
öğesindeprice
alanının açıklamasına bakın.)lineItemUpdates[x].reason
dilinde bir açıklama girin.lineItemUpdates[x].orderState
öğesiniCONFIRMED
olarak ayarlayın.
Kendi takdirinize bağlı olarak, AsyncOrderUpdateRequestMessage göndermeden önce veya sonra ödeme aracından ödeme almayı deneyebilirsiniz. İşlem başarısız olursa (muhtemelen fiyat deltasının çok yüksek olması) Google'a hata hakkında bilgi vermek için OrderUpdate
içinde aşağıdaki ayarları içeren bir AsyncOrderUpdateRequestMessage gönderin:
orderState
öğesiniREJECTED
olarak ayarlayın.label
alanında hatayı açıklayın.
Ödeme doğrulaması
4. Adım: Ödemeyi uygulama bölümünde açıklandığı gibi, sipariş karşılama uç noktanız her gelen CheckoutRequestMessage
için doğrulama gerçekleştirmeli ve CheckoutResponseMessage
ile yanıt vermelidir.
Aşağıda, başarılı bir doğrulama için kullanılacak bir CheckoutResponseMessage
örneği verilmiştir:
Kullanım alanı | Nasıl uygulanır? |
---|---|
Kullanım alanı 1: Doğrulama başarılı | Dönüş CheckoutResponse . ProposedOrder ve PaymentOptions içermelidir.
ProposedOrder fiyata vergiler, ücretler ve alışveriş sepetinin toplam fiyatı dahildir. |
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "checkoutResponse": { "proposedOrder": { "id": "sample_proposed_order_id_1", "otherItems": [ { "name":"New customer discount", "price": { "type":"ESTIMATE", "amount": { "currencyCode":"USD", "units":"-5", "nanos": -500000000 } }, "type": "DISCOUNT" }, { "name": "Delivery fee", "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "3", "nanos": 500000000 } }, "type": "DELIVERY" }, { "name": "Tax", "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "1", "nanos": 500000000 } }, "type": "TAX" } ], "cart": { "merchant": { "id": "https://www.exampleprovider.com/merchant/id1", "name": "Falafel Bite" }, "lineItems": [ { "name": "Pita Chips", "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": "2", "nanos": 750000000 } }, "subLines": [ { "note": "Notes for this item." } ], "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension", "options": [ { "id": "sample_addon_offer_id_1", "offerId": "https://www.exampleprovider.com/menu/item/addon/offer/id1", "name": "Honey Mustard", "price": { "currencyCode": "USD" }, "quantity": 1 }, { "id": "sample_addon_offer_id_2", "offerId": "https://www.exampleprovider.com/menu/item/addon/offer/id2", "name": "BBQ Sauce", "price": { "currencyCode": "USD", "nanos": 500000000 }, "quantity": 1 } ] } }, { "name": "Chicken Shwarma Wrap", "type": "REGULAR", "id": "sample_item_offer_id_2", "offerId": "https://www.exampleprovider.com/menu/item/offer/id2", "quantity": 1, "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "8" } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension" } }, { "name": "Greek Salad", "type": "REGULAR", "id": "sample_item_offer_id_3", "offerId": "https://www.exampleprovider.com/menu/item/offer/id3", "quantity": 1, "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "9", "nanos": 990000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension" } }, { "name": "Prawns Biryani", "type": "REGULAR", "id": "sample_item_offer_id_4", "offerId": "https://www.exampleprovider.com/menu/item/offer/id4", "quantity": 1, "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "15", "nanos": 990000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension" } } ], "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension", "fulfillmentPreference": { "fulfillmentInfo": { "delivery": { "deliveryTimeIso8601": "P90M" } } }, "location": { "coordinates": { "latitude": 37.788783, "longitude": -122.41384 }, "formattedAddress": "1350 CHARLESTON ROAD, MOUNTAIN VIEW, CA, United States", "zipCode": "94043", "city": "Mountain View", "postalAddress": { "regionCode": "US", "postalCode": "94043", "administrativeArea": "CA", "locality": "Mountain View", "addressLines": [ "1350 Charleston Road" ] }, "notes": "Gate code is #111" } } }, "totalPrice": { "type": "ESTIMATE", "amount": { // Represents $36.73 "currencyCode": "USD", "units": "36", "nanos": 730000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension", "availableFulfillmentOptions": [ { "fulfillmentInfo": { "delivery": { "deliveryTimeIso8601": "P90M" } }, "expiresAt": "2017-07-17T12:30:00Z" } ] } }, "paymentOptions": { "googleProvidedOptions": { "tokenizationParameters": { "tokenizationType": "PAYMENT_GATEWAY", "parameters": { "gateway": "stripe", "stripe:publishableKey": "pk_live_stripe_client_key", "stripe:version": "2017-04-06" } }, "supportedCardNetworks": [ "AMEX", "DISCOVER", "MASTERCARD", "JCB", "VISA" ], "prepaidCardDisallowed": true } } } } } ] } } }
Teslimat adresini doğrulama
Karşılama uç noktanız, her bir CheckoutRequestMessage
öğesinde bulunan teslimat adresini doğrulamalıdır.
Teslimat adresiyle ilgili bir sorun varsa (ör. teslimat hizmetinin kapsamı dışındaysa) sipariş karşılama işleminiz tarafından iade edilen CheckoutResponseMessage
uygun türde bir FoodOrderError
içermelidir.
Kullanım alanı | Nasıl uygulanır? |
---|---|
Kullanım alanı 1: Teslimat adresi izin verilen aralığın dışında olduğu veya teslimat adresiyle ilgili bir sorun olduğu için doğrulama başarısız oldu. | OUT_OF_SERVICE_AREA hata türüne sahip FoodOrderError hatasıyla FoodErrorExtension döndürün. |
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "error": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension", "foodOrderErrors": [ { "error": "OUT_OF_SERVICE_AREA", "description": "Sorry, the restaurant cannot deliver to your address." } ] } } } ] } } }
Minimum sipariş değeri doğrulaması
Sipariş karşılama uç noktanız her bir CheckoutRequestMessage
için minimum sipariş değerini doğrulamalıdır.
Minimum sipariş değeri karşılanmazsa sipariş karşılama işleminiz tarafından iade edilen CheckoutResponseMessage
şu hata türünde FoodOrderError
içermelidir: REQUIREMENTS_NOT_MET
.
Kullanım alanı | Nasıl uygulanır? |
---|---|
Kullanım alanı 1: Minimum sipariş değeri karşılanmadığı için doğrulama başarısız oldu | REQUIREMENTS_NOT_MET hata türüne sahip FoodOrderError hatasıyla FoodErrorExtension döndürün. |
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "error": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension", "foodOrderErrors": [ { "error": "REQUIREMENTS_NOT_MET", "description": "The cart subtotal must be over $20." } ] } } } ] } } }
Sipariş aralığı doğrulaması
Sipariş karşılama uç noktanız, her bir CheckoutRequestMessage
için sipariş aralığını etkileyebilecek tüm faktörleri doğrulamalıdır.
Örneğin, restoran kapalıysa veya o anda sipariş almıyorsa siparişiniz tarafından döndürülen CheckoutResponseMessage
sırasıyla CLOSED
veya NO_CAPACITY
FoodOrderError
hata türünü içermelidir.
Kullanım alanı | Nasıl uygulanır? |
---|---|
1. kullanım alanı: Restoran kapalı olduğundan veya artık desteklenmediği için doğrulama başarısız oldu. | CLOSED hata türüne sahip FoodOrderError hatasıyla FoodErrorExtension döndürün. |
2. kullanım alanı: Restoran meşgul olduğundan ve şu anda sipariş almadığından doğrulama başarısız oldu. | NO_CAPACITY hata türüne sahip FoodOrderError hatasıyla FoodErrorExtension döndürün. |
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "error": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension", "foodOrderErrors": [ { "error": "CLOSED", "description": "The restaurant is closed." } ] } } } ] } } }
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "error": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension", "foodOrderErrors": [ { "error": "NO_CAPACITY", "description": "Sorry, the restaurant is busy at the moment." } ] } } } ] } } }
Alışveriş sepeti öğelerini doğrulama
Sipariş karşılama uç noktanız, CheckoutRequestMessage
içinde bulunan her alışveriş sepeti öğesinin fiyatını ve stok durumunu doğrulamalıdır.
Stok durumu veya fiyatlandırma değiştiyse karşılama isteğiniz tarafından döndürülen CheckoutResponseMessage
sırasıyla AVAILABILITY_CHANGED
veya PRICE_CHANGED
hata türünde FoodOrderError
içermelidir.
Kullanım alanı | Nasıl uygulanır? |
---|---|
Kullanım alanı 1: Bazı menü öğeleri ve/veya özelleştirmeleri geçerli olmadığı ya da stokta kalmadığı için doğrulama başarısız oldu | AVAILABILITY_CHANGED hata türünde correctedProposedOrder , PaymentOptions ve FoodOrderError hata içeren FoodErrorExtension döndürün. Geçersiz öğeler CorrectedProposedOrder öğesinden kaldırılmalıdır. |
Kullanım alanı 2: Bazı menü öğeleri ve/veya özelleştirmeleri geçerli olmadığı ya da stokta kalmadığı için doğrulama başarısız oldu. Düzeltilen alışveriş sepeti, artık minimum sipariş değeri koşulunu karşılamıyor. | AVAILABILITY_CHANGED ve REQUIREMENTS_NOT_MET hata türlerine sahip FoodOrderError
hata türüne sahip FoodErrorExtension döndürür. |
3. Kullanım alanı: Bazı menü öğeleri ve/veya özelleştirme fiyatları değiştiğinden doğrulama başarısız oldu | PRICE_CHANGED hata türünde correctedProposedOrder , PaymentOptions ve FoodOrderError hata içeren FoodErrorExtension döndürün. Güncel olmayan fiyatlar CorrectedProposedOrder üzerinden güncellenmelidir. |
Kullanım alanı 4: Bazı menü öğeleri ve/veya özelleştirme fiyatları değiştiğinden doğrulama başarısız oldu. Düzeltilen alışveriş sepeti, minimum sipariş değeri koşulunu artık karşılamıyor | PRICE_CHANGED ve REQUIREMENTS_NOT_MET hata türlerine sahip FoodOrderError
hata türüne sahip FoodErrorExtension döndürür. |
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "error": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension", "foodOrderErrors": [ { "error": "AVAILABILITY_CHANGED", "id": "sample_item_offer_id_1", "description": "The item is no longer available." }, { "error": "AVAILABILITY_CHANGED", "id": "sample_item_offer_id_2", "description": "The item is no longer available." } ], "correctedProposedOrder": { "id": "sample_corrected_proposed_order_id_1", "otherItems": [ { "name":"New customer discount", "price": { "type":"ESTIMATE", "amount": { "currencyCode":"USD", "units":"-5", "nanos": -500000000 } }, "type": "DISCOUNT" }, { "name": "Delivery fee", "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "3", "nanos": 500000000 } }, "type": "DELIVERY" }, { "name": "Tax", "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "1", "nanos": 500000000 } }, "type": "TAX" } ], "cart": { "merchant": { "id": "https://www.exampleprovider.com/merchant/id1", "name": "Falafel Bite" }, "lineItems": [ { "name": "Greek Salad", "type": "REGULAR", "id": "sample_item_offer_id_3", "offerId": "https://www.exampleprovider.com/menu/item/offer/id3", "quantity": 1, "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "9", "nanos": 990000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension" } }, { "name": "Prawns Biryani", "type": "REGULAR", "id": "sample_item_offer_id_4", "offerId": "https://www.exampleprovider.com/menu/item/offer/id4", "quantity": 1, "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "15", "nanos": 990000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension" } } ], "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension", "fulfillmentPreference": { "fulfillmentInfo": { "delivery": { "deliveryTimeIso8601": "P90M" } } }, "location": { "coordinates": { "latitude": 37.788783, "longitude": -122.41384 }, "formattedAddress": "1350 CHARLESTON ROAD, MOUNTAIN VIEW, CA, United States", "zipCode": "94043", "city": "Mountain View", "postalAddress": { "regionCode": "US", "postalCode": "94043", "administrativeArea": "CA", "locality": "Mountain View", "addressLines": [ "1350 Charleston Road" ] }, "notes": "Gate code is #111" } } }, "totalPrice": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "36", "nanos": 730000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension", "availableFulfillmentOptions": [ { "fulfillmentInfo": { "delivery": { "deliveryTimeIso8601": "P90M" } }, "expiresAt": "2017-07-17T12:30:00Z" } ] } }, "paymentOptions": { "googleProvidedOptions": { "tokenizationParameters": { "tokenizationType": "PAYMENT_GATEWAY", "parameters": { "gateway": "stripe", "stripe:publishableKey": "pk_live_stripe_client_key", "stripe:version": "2017-04-06" } }, "supportedCardNetworks": [ "AMEX", "DISCOVER", "MASTERCARD", "JCB", "VISA" ], "prepaidCardDisallowed": true } } } } } ] } } }
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "error": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension", "foodOrderErrors": [ { "error": "REQUIREMENTS_NOT_MET", "description": "The cart subtotal must be over $20." }, { "error": "AVAILABILITY_CHANGED", "id": "cart_lineitem_id" "description": "cart_lineitem_id is no longer available." } ] } } } ] } } }
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "error": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension", "foodOrderErrors": [ { "error": "PRICE_CHANGED", "id": "sample_item_offer_id_1", "description": "The price has changed.", "updatedPrice": { "currencyCode": "USD", "units": "2", "nanos": 750000000 } }, { "error": "PRICE_CHANGED", "id": "sample_item_offer_id_2", "description": "The price has changed.", "updatedPrice": { "currencyCode": "USD", "units": "8" } } ], "correctedProposedOrder": { "id": "sample_corrected_proposed_order_id_1", "otherItems": [ { "name":"New customer discount", "price": { "type":"ESTIMATE", "amount": { "currencyCode":"USD", "units":"-5", "nanos": -500000000 } }, "type": "DISCOUNT" }, { "name": "Delivery fee", "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "3", "nanos": 500000000 } }, "type": "DELIVERY" }, { "name": "Tax", "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "1", "nanos": 500000000 } }, "type": "TAX" } ], "cart": { "merchant": { "id": "https://www.exampleprovider.com/merchant/id1", "name": "Falafel Bite" }, "lineItems": [ { "name": "Pita Chips", "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": "2", "nanos": 750000000 } }, "subLines": [ { "note": "Notes for this item." } ], "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension", "options": [ { "id": "sample_addon_offer_id_1", "offerId": "https://www.exampleprovider.com/menu/item/addon/offer/id1", "name": "Honey Mustard", "price": { "currencyCode": "USD" }, "quantity": 1 }, { "id": "sample_addon_offer_id_2", "offerId": "https://www.exampleprovider.com/menu/item/addon/offer/id2", "name": "BBQ Sauce", "price": { "currencyCode": "USD", "nanos": 500000000 }, "quantity": 1 } ] } }, { "name": "Chicken Shwarma Wrap", "type": "REGULAR", "id": "sample_item_offer_id_2", "offerId": "https://www.exampleprovider.com/menu/item/offer/id2", "quantity": 1, "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "8" } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension" } }, { "name": "Greek Salad", "type": "REGULAR", "id": "sample_item_offer_id_3", "offerId": "https://www.exampleprovider.com/menu/item/offer/id3", "quantity": 1, "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "9", "nanos": 990000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension" } }, { "name": "Prawns Biryani", "type": "REGULAR", "id": "sample_item_offer_id_4", "offerId": "https://www.exampleprovider.com/menu/item/offer/id4", "quantity": 1, "price": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "15", "nanos": 990000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension" } } ], "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension", "fulfillmentPreference": { "fulfillmentInfo": { "delivery": { "deliveryTimeIso8601": "P90M" } } }, "location": { "coordinates": { "latitude": 37.788783, "longitude": -122.41384 }, "formattedAddress": "1350 CHARLESTON ROAD, MOUNTAIN VIEW, CA, United States", "zipCode": "94043", "city": "Mountain View", "postalAddress": { "regionCode": "US", "postalCode": "94043", "administrativeArea": "CA", "locality": "Mountain View", "addressLines": [ "1350 Charleston Road" ] }, "notes": "Gate code is #111" } } }, "totalPrice": { "type": "ESTIMATE", "amount": { "currencyCode": "USD", "units": "36", "nanos": 730000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension", "availableFulfillmentOptions": [ { "fulfillmentInfo": { "delivery": { "deliveryTimeIso8601": "P90M" } }, "expiresAt": "2017-07-17T12:30:00Z" } ] } }, "paymentOptions": { "googleProvidedOptions": { "tokenizationParameters": { "tokenizationType": "PAYMENT_GATEWAY", "parameters": { "gateway": "stripe", "stripe:publishableKey": "pk_live_stripe_client_key", "stripe:version": "2017-04-06" } }, "supportedCardNetworks": [ "AMEX", "DISCOVER", "MASTERCARD", "JCB", "VISA" ], "prepaidCardDisallowed": true } } } } } ] } } }
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "error": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension", "foodOrderErrors": [ { "error": "REQUIREMENTS_NOT_MET", "description": "The cart subtotal must be over $20." }, { "error": "PRICE_CHANGED", "id": "cart_lineitem_id" "description": "cart_lineitem_id price has been updated." "updatedPrice": { "currencyCode": "USD", "units": "2", "nanos": 750000000 } } ] } } } ] } } }
Sipariş doğrulamasını gönderme
7. Adım: Sipariş Gönderme'de açıklandığı gibi, karşılama uç noktanız gelen her SubmitOrderRequestMessage
için doğrulama gerçekleştirmeli ve SubmitOrderResponseMessage
ile yanıt vermelidir.
Aşağıda, başarılı bir doğrulama için kullanılacak bir SubmitOrderResponseMessage
örneği verilmiştir:
Kullanım alanı | Nasıl uygulanır? |
---|---|
Kullanım alanı 1: Sipariş başarıyla oluşturuldu | CREATED sipariş durumuna sahip bir SubmitOrderResponseMessage . actionOrderId , userVisibleId , orderManagementActions ve estimatedFulfillmentTime içermelidir. |
Kullanım alanı 2: Ödeme sorunları nedeniyle sipariş reddedilmiştir | REJECTED sipariş durumuna sahip bir SubmitOrderResponseMessage . PAYMENT_DECLINED türünde actionOrderId , userVisibleId , orderManagementActions ve rejectionInfo içermelidir. |
Kullanım alanı 3: Sipariş, kullanıcı yasaklandı olarak işaretlendiği için reddedilmiştir | REJECTED sipariş durumuna sahip bir SubmitOrderResponseMessage . INELIGIBLE türünde actionOrderId , userVisibleId , orderManagementActions ve rejectionInfo içermelidir. |
Kullanım alanı 4: Kullanıcı bilgileri eksik veya geçersiz olduğundan sipariş reddedildi | REJECTED sipariş durumuna sahip bir SubmitOrderResponseMessage . INELIGIBLE türünde actionOrderId , userVisibleId , orderManagementActions ve rejectionInfo içermelidir. |
Kullanım alanı 5: Sipariş bilinmeyen bir nedenle reddedilmiştir | REJECTED sipariş durumuna sahip bir SubmitOrderResponseMessage . UNKNOWN türünde actionOrderId , userVisibleId , orderManagementActions ve rejectionInfo içermelidir. |
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "CREATED", "label": "Order received" }, "updateTime": "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", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "VIEW_DETAILS", "button": { "title": "View order", "openUrlAction": { "url": "https://orderview.partner.com?orderid=sample_action_order_id" } } } ] } } } ] } } }
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "REJECTED", "label": "Order rejected" }, "updateTime": "2017-05-10T02:30:00.000Z", "rejectionInfo": { "type": "PAYMENT_DECLINED", "reason": "Insufficient funds" }, "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", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "VIEW_DETAILS", "button": { "title": "View order", "openUrlAction": { "url": "https://orderview.partner.com?orderid=sample_action_order_id" } } } ] } } } ] } } }
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "REJECTED", "label": "Order rejected" }, "updateTime": "2017-05-10T02:30:00.000Z", "rejectionInfo": { "type": "INELIGIBLE", "reason": "Sorry, we are not able to take orders from this user" }, "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", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "VIEW_DETAILS", "button": { "title": "View order", "openUrlAction": { "url": "https://orderview.partner.com?orderid=sample_action_order_id" } } } ] } } } ] } } }
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "REJECTED", "label": "Order rejected" }, "updateTime": "2017-05-10T02:30:00.000Z", "rejectionInfo": { "type": "INELIGIBLE", "reason": "Sorry, the phone number must not be blank" }, "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", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "VIEW_DETAILS", "button": { "title": "View order", "openUrlAction": { "url": "https://orderview.partner.com?orderid=sample_action_order_id" } } } ] } } } ] } } }
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "REJECTED", "label": "Order rejected" }, "updateTime": "2017-05-10T02:30:00.000Z", "rejectionInfo": { "type": "UNKNOWN", "reason": "Sorry, there is something wrong with this order." }, "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", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "VIEW_DETAILS", "button": { "title": "View order", "openUrlAction": { "url": "https://orderview.partner.com?orderid=sample_action_order_id" } } } ] } } } ] } } }