Eşleştirme menüsü feed'leri ve sipariş karşılama alışveriş sepeti öğeleri
Müşteriler Menü feed'inizdeki öğeleri alışveriş sepetine ekleyip ödeme yaptığında Google, bu öğeleri fiyatlarını doğrulamak ve sipariş karşılama uç noktanıza gönderir. stok durumu. Fiyatlandırma ve stok durumu doğrulandıktan sonra müşteri şunları yapabilir: sipariş verin. Bu bölümde, menü feed'i öğelerinin sipariş karşılama sepeti öğeleridir.
Bu bölümdeki örnekler, Menü feed'i ve Alışveriş sepeti'nin sadeleştirilmiş versiyonlarıdır.
şema. Yalnızca Menü feed'i ile menü feed'i arasındaki eşlemeyi göstermek için ilgili alanlar
alışveriş sepeti nesnesi gösterilir. Tam şemalar için Menu
ve Cart
sayfalarına göz atın.
Menu
feed'inde alışveriş sepetine eklenen öğeler Cart
üzerinden gönderilir
hem ödeme hem de sipariş gönderimi için bir nesnedir.
- Basit bir
MenuItem
,lineItems
içinde birLineItem
olarak gösterilirofferId
öğesinin Menü'de seçilen menü öğesininoffer.id
olduğu dizi feed'i seçin. - Zorunlu
MenuItemOption
değerine sahip birMenuItem
,lineItems
dizisindekiLineItem
veofferId
değeri seçildi Menü feed'indeki menü öğesi seçeneğininoffer.id
. LineItem
içinAddOnMenuItem
, birFoodItemExtension
öğesininoptions
dizisindekiFoodItemOption
. Her seçenekte, seçilen eklenti menüsüne karşılık gelen birofferId
bulunur Menü feed'indekioffer.id
. Bir AddOn MenuItem öğesine de sahip her birinin içindesubOptions
olarak gösterilen iç içe yerleştirilmiş AddOn MenuItem(öğeleri) seçeneğini belirleyin.
Aşağıdaki örneklerde, menü feed'i ile sipariş karşılama arasında menü öğeleri eşleştirilir alışveriş sepeti.
JSON
Bu örnekte, basit menü öğelerinden oluşan bir liste 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şlenen 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 AddOn MenuItems içeren bir menü öğesi içeriyor.
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şlenen 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çeneklerini içeren bir menü öğesi bulunur, AddOn MenuItems, ve iç içe yerleştirilmiş AddOn MenuItems
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şlenen 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
işlerken sorun yaşarsanız
, şunu içeren bir CheckoutResponseMessage
ile yanıt verebilir:
CheckoutResponse yerine FoodErrorExtension
. Bunu kullanabilirsiniz
oluşan bir veya daha fazla hatayı belirlemek için bu yanıtı kullanabilirsiniz.
Hataları ele almanın 2 yolu vardır:
- Kurtarılabilir hatalar: Kullanıcının
sipariş. Örneğin,
Cart
içindeki bir öğenin fiyat değişikliği içinFoodOrderError
hata türü ile yanıt verebilirsinizcorrectedProposedOrder
vepaymentOptions
ile birliktePRICE_CHANGED
. Google, kullanıcıyı değişiklik konusunda bilgilendirir ancak kullanıcınıncorrectedProposedOrder
Kullanıcı aşağıdaki koşullardan birini karşılıyorsa geri dönüp alışveriş sepetini de düzenleyebilir: gerekir. Yeni birCheckoutRequestMessage
ya daSubmitOrderRequestMessage
. - Düzeltilemeyen hatalar: Kullanıcının, alışveriş sepetini düzenlemeden önce
siparişi göndermeye devam edebilir. Örneğin, restoranın
kapalıysa
CLOSED
hata türündeFoodOrderError
ile yanıt verebilirsiniz. Google, kullanıcıyı bilgilendirir ve yeni bir bir restoran gibi. Yeni birCheckoutRequestMessage
için alışveriş sepeti.
Genel olarak, alışveriş sepeti düzeyindeki hataları giderilemez ve öğe düzeyindeki hatalar olarak belirleyin.
kurtarılabilir. Hata türlerinin ve anlamlarının tam listesi için bkz.
FoodOrderError
.
Fiyat değişikliklerini yönetme
Ödeme sırasında fiyat değişiklikleri
Bir müşterinin ödemesini işlerken fiyat sorunuyla karşılaşırsanız isteğinde bulunmak için aşağıdakileri yapın:
CheckoutRequestMessage
'a şu şekilde yanıt verin:FoodErrorExtension
içerenCheckoutResponseMessage
Hataları işleme konusunda açıklanmıştır.- Hata yanıtında fiyatı güncellemek için
correctedProposedOrder.cart
öğesini kullanın . Düzeltilen sipariş Google'a gönderilir ve yeni bir sipariş verebilir.CheckoutRequestMessage
.
Google, ödeme işleminden sonra son kullanıcıya bir sipariş onayı sayfası gösterir.
ProposedOrder
değiştirilip değiştirilmediğinden bağımsız olarak kontrol edilir.
Proposed Order düzeltildiyse, Google
kullanıcıyı değişikliklerden haberdar etme. Kullanıcı siparişi vermeyi kabul ederse,
artık ödeme isteği olmayacak. Akış, hem sipariş hem de yükleme sırasında
düzeltilmiş ProposedOrder
.
Ancak kullanıcı, fikrini değiştirerek alışveriş sepetini tekrar düzenleyebilir. Zaman
bu şekilde alışveriş sepeti güncellemelerini alırsa Google yeni bir CheckoutRequestMessage
gönderir.
Sipariş gönderme sırasında fiyat değişiklikleri
Siparişi gönderirken fiyat sorunuyla karşılaşırsanız
(actions.intent.TRANSACTION_DECISION
intent tetiklendi), yanıt vermeyin
yazarak veya yanıtınızdaki fiyatı güncelleyebilirsiniz. Fiyatlar, miktarlar,
SubmitOrderRequestMessage
dokümanındaki diğer ayrıntılar
olduğunu belirtmek için orderState
ile REJECTED
değerine ayarlanmış şekilde yanıt verin.
sipariş istenildiği gibi verilemiyor.
Ardından, sipariş ve ödeme ayrıntıları geçerliyse orderState
değerini CREATED
olarak ayarlayın.
veya CONFIRMED
. Ayrıca, actionOrderId
en iyi uygulamaları paylaşacağız. Sonraki güncellemeleri gönderirken bu kimlik kullanılmalıdır.
Ödemeyi işleyemiyorsanız ve
SubmitOrderRequestMessage
kullanıyorsanız,
orderState
ile AsyncOrderUpdateRequestMessage
, izin vermek için REJECTED
olarak ayarlandı
siparişin verilmeyeceğini bilebilir.
Sipariş gönderildikten sonra fiyat değişiklikleri
Bir fiyatın, müşteri tarafından dönüşüm gerçekleştirildiğinde kullanılan fiyattan farklı olduğunu tespit ederseniz
bir AsyncOrderUpdateRequestMessage
düzenleyebilirsiniz. Örneğin,
Eşzamansız Sipariş Güncellemelerini Uygulama bölümünde yeni fiyatla açıklanır.
Fiyatları eşzamansız sipariş güncellemelerini kullanarak güncellemek için:
lineItemUpdates[x].price
para birimini değiştirin. Bu değeri, eklentiler dahil olmak üzere öğenin toplam maliyetini yansıtır ve miktara göre hesaplayabilirsiniz. (Daha fazla bilgi içinLineItem
öğesininprice
alanı.)lineItemUpdates[x].reason
dilinde bir açıklama girin.lineItemUpdates[x].orderState
ayarla Hedef:CONFIRMED
.
Ödeme aracından ödeme almayı,
Async OrderUpdateRequestMessage hizmetini gönderin. İşlem başarısız olursa
(muhtemelen fiyat deltasının çok yüksek olduğu için) bir
Şuradaki ayarları içeren:
Hatayı Google'a bildirmek için OrderUpdate
:
orderState
değeriniREJECTED
olarak ayarlayın.label
alanında hatayı açıklayın.
Ödeme doğrulaması
4. Adım: Ödeme özelliğini uygulayın bölümünde açıklandığı gibi,
karşılama uç noktası, gelen her gelende doğrulama gerçekleştirmelidir
CheckoutRequestMessage
ve CheckoutResponseMessage
ile yanıt verin.
Başarılı bir etkinlik için CheckoutResponseMessage
doğrulama:
Kullanım alanı | Nasıl uygulanır? |
---|---|
Kullanım alanı 1: Doğrulama başarılı | Dönüş CheckoutResponse . Şunları içermelidir:
ProposedOrder ve PaymentOptions .
ProposedOrder , vergileri, ücretleri ve
alışveriş sepeti. |
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 adresi doğrulaması
Sipariş karşılama uç noktanız,
CheckoutRequestMessage
.
Teslimat adresiyle ilgili bir sorun varsa (ör. teslimat adresinin kapsama alanı dışında olması)
tarafından iade edilen CheckoutResponseMessage
sipariş karşılama, uygun türde bir FoodOrderError
içermelidir.
Kullanım alanı | Nasıl uygulanır? |
---|---|
Kullanım alanı 1: Teslimat adresi eksik olduğu için doğrulama başarısız oldu veya teslimat adresiyle ilgili bir sorun var | FoodErrorExtension öğesini FoodOrderError ile iade edin
OUT_OF_SERVICE_AREA hata türü. |
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 birinin minimum sipariş değerini doğrulamalıdır
CheckoutRequestMessage
.
Minimum sipariş değeri karşılanmazsa CheckoutResponseMessage
Sipariş karşılama işleminiz tarafından döndürülen hata türü FoodOrderError
içermelidir
REQUIREMENTS_NOT_MET
.
Kullanım alanı | Nasıl uygulanır? |
---|---|
Kullanım alanı 1: Minimum sipariş değeri nedeniyle doğrulama başarısız oldu karşılanmadı | FoodErrorExtension öğesini FoodOrderError ile iade edin
REQUIREMENTS_NOT_MET hata türü. |
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,
sıralama zaman aralığı CheckoutRequestMessage
.
Örneğin, restoran kapalıysa veya artık
an, sipariş karşılama tarafından döndürülen CheckoutResponseMessage
CLOSED
veya NO_CAPACITY
hata türünde bir FoodOrderError
içerir,
tıklayın.
Kullanım alanı | Nasıl uygulanır? |
---|---|
Kullanım alanı 1: Restoran kapalı olduğu veya artık desteklenmiyor | FoodErrorExtension öğesini FoodOrderError ile iade edin
CLOSED hata türü. |
Kullanım alanı 2: Restoran meşgul olduğundan doğrulama başarısız oldu şu anda sipariş almıyor | FoodErrorExtension öğesini FoodOrderError ile iade edin
NO_CAPACITY hata türü. |
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, her bir siparişin fiyatlandırmasını ve stok durumunu doğrulamalıdır.
CheckoutRequestMessage
içinde yer alan sepet öğesi.
Stok durumu veya fiyatlandırma değiştiyse CheckoutResponseMessage
Sipariş karşılama işleminiz tarafından döndürülen hata türü FoodOrderError
içermelidir
Sırasıyla AVAILABILITY_CHANGED
veya PRICE_CHANGED
.
Kullanım alanı | Nasıl uygulanır? |
---|---|
Kullanım alanı 1: Bazı menü öğeleri ve/veya özelleştirmeleri geçerli değil veya stokta yok | FoodErrorExtension için correctedProposedOrder ,
PaymentOptions ve FoodOrderError hata türü
AVAILABILITY_CHANGED . Geçersiz öğeler şuradan kaldırılmalıdır:
CorrectedProposedOrder |
Kullanım alanı 2: Bazı menü öğeleri ve/veya olduğunu ve stokta olmadığını doğruladığını belirtiyor. Düzeltilen alışveriş sepeti artık minimum sipariş değeri koşulunu karşılamıyor. | FoodErrorExtension öğesini FoodOrderError ile iade edin
AVAILABILITY_CHANGED ve
REQUIREMENTS_NOT_MET . |
Kullanım alanı 3: Bazı menü öğeleri ve/veya özelleştirme fiyatları değişti | FoodErrorExtension için correctedProposedOrder ,
PaymentOptions ve FoodOrderError hata türü
PRICE_CHANGED . Eski fiyatların güncellenmesi gerekiyor
CorrectedProposedOrder |
Kullanım alanı 4: Bazı menü öğeleri ve/veya özelleştirme fiyatları değişti. Düzeltilen alışveriş sepeti artık minimum sipariş değeri koşulu | FoodErrorExtension öğesini FoodOrderError ile iade edin
PRICE_CHANGED ve
REQUIREMENTS_NOT_MET . |
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önder
7. Adım: Sipariş Gönderme İşlemini Uygulama bölümünde belirtildiği gibi,
karşılama uç noktası, gelen her gelende doğrulama gerçekleştirmelidir
SubmitOrderRequestMessage
ve
SubmitOrderResponseMessage
.
Başarılı bir etkinlik için SubmitOrderResponseMessage
doğrulama:
Kullanım alanı | Nasıl uygulanır? |
---|---|
Kullanım alanı 1: Sipariş başarıyla oluşturuldu | CREATED sipariş içeren bir SubmitOrderResponseMessage
durumu. actionOrderId olmalıdır.
userVisibleId , orderManagementActions ve
estimatedFulfillmentTime . |
Kullanım alanı 2: Ödeme sorunları nedeniyle sipariş reddedildi | REJECTED sipariş içeren bir SubmitOrderResponseMessage
durumu. actionOrderId olmalıdır.
userVisibleId , orderManagementActions ve
PAYMENT_DECLINED türünde rejectionInfo . |
Kullanım alanı 3: Kullanıcı için sipariş reddedildi olarak işaretlendi | REJECTED sipariş içeren bir SubmitOrderResponseMessage
durumu. actionOrderId olmalıdır.
userVisibleId , orderManagementActions ve
INELIGIBLE türünde rejectionInfo . |
Kullanım alanı 4: Kullanıcı bilgileri eksik veya geçersiz | REJECTED sipariş içeren bir SubmitOrderResponseMessage
durumu. actionOrderId olmalıdır.
userVisibleId , orderManagementActions ve
INELIGIBLE türünde rejectionInfo . |
Kullanım alanı 5: Sipariş bilinmeyen bir nedenle reddedildi | REJECTED sipariş içeren bir SubmitOrderResponseMessage
durumu. actionOrderId olmalıdır.
userVisibleId , orderManagementActions ve
UNKNOWN türünde rejectionInfo . |
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" } } } ] } } } ] } } }