การแมปฟีดเมนูและรายการในรถเข็นการดําเนินการตามคําสั่งซื้อ
เมื่อลูกค้าเพิ่มสินค้าจากฟีดเมนูลงในรถเข็นและชำระเงิน Google จะส่งสินค้าเหล่านั้นไปยังปลายทางการดำเนินการตามคำสั่งซื้อเพื่อยืนยันราคาและ เมื่อตรวจสอบราคาและความพร้อมจำหน่ายสินค้าแล้ว ลูกค้าจะทำสิ่งต่อไปนี้ได้ สั่งซื้อ ส่วนนี้จะแสดงวิธีแมปรายการฟีดในเมนูกับ ดำเนินการตามคำสั่งซื้อสินค้าในรถเข็น
ตัวอย่างในส่วนนี้เป็นเวอร์ชันที่มีการนำฟีดเมนูและรถเข็นออก
สคีมา เฉพาะช่องที่เกี่ยวข้องกับการแสดงการแมประหว่างฟีดเมนูกับ
จะแสดงออบเจ็กต์รถเข็น โปรดดูสคีมาทั้งหมดได้ที่ Menu
และ Cart
รายการในฟีด Menu
ที่เพิ่มลงในรถเข็นจะส่งไปที่ Cart
สำหรับทั้งการส่งการชำระเงินและคำสั่งซื้อ
MenuItem
แบบง่ายจะแสดงเป็นLineItem
ในlineItems
อาร์เรย์ที่มีofferId
เป็นoffer.id
ของรายการในเมนูที่เลือกไว้ในเมนู ฟีดMenuItem
ที่มีMenuItemOption
ที่จำเป็นจะแสดงเป็นLineItem
ในอาร์เรย์lineItems
ที่มีการเลือกofferId
เป็นoffer.id
ของตัวเลือกรายการในเมนูจากฟีดเมนูAddOnMenuItem
ของLineItem
จะแสดงเป็นFoodItemOption
ในอาร์เรย์options
ของFoodItemExtension
แต่ละตัวเลือกมีofferId
ที่สอดคล้องกับเมนูส่วนเสริมที่เลือกไว้offer.id
ของรายการจากฟีดเมนู โปรดทราบว่า AddOnMenuItem สามารถมี AddOnMenuItem ที่ฝัง ซึ่งแสดงเป็นsubOptions
อยู่ภายในแต่ละเมนู ตัวเลือก
ตัวอย่างต่อไปนี้แมปรายการในเมนูระหว่างฟีดเมนูกับการจำหน่าย รถเข็น
JSON
ตัวอย่างนี้มีรายการในเมนูแบบง่าย
รายการในเมนูในฟีดเมนู
{ "@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" } ] } ] }
รายการในเมนูที่แมปกับรถเข็นสำหรับการดำเนินการตามคำสั่งซื้อมีดังนี้
{ "@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
ตัวอย่างนี้มีรายการในเมนูที่มี AddOnMenuItems อย่างน้อย 1 รายการ
รายการในเมนูในฟีดเมนู
{ "@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" } ] } ] }
รายการในเมนูที่แมปกับรถเข็นสำหรับการดำเนินการตามคำสั่งซื้อมีดังนี้
{ "@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
ตัวอย่างนี้มีรายการในเมนูที่มีตัวเลือกรายการในเมนู เช่น AddOnMenuItems และ AddOnMenuItems ที่ฝังอยู่
รายการในเมนูในฟีดเมนู
{ "@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" } ] } ] } ] } ] } ] } } ] }
รายการในเมนูที่แมปกับรถเข็นสำหรับการดำเนินการตามคำสั่งซื้อมีดังนี้
{ "@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" } ] } ] } } ] }
การจัดการข้อผิดพลาด
หากพบปัญหาขณะประมวลผล CheckoutRequestMessage
โปรด
สามารถตอบกลับด้วย CheckoutResponseMessage
ที่มี
FoodErrorExtension
แทนที่จะเป็น CheckoutResponse คุณใช้
การตอบกลับเพื่อระบุข้อผิดพลาดอย่างน้อย 1 รายการที่เกิดขึ้นระหว่างการประมวลผล
การจัดการข้อผิดพลาดมี 2 วิธีดังนี้
- ข้อผิดพลาดที่กู้คืนได้: ผู้ใช้ไม่จำเป็นต้องแก้ไขรถเข็นเพื่อส่ง
คำสั่งซื้อ ตัวอย่างเช่น หากคุณเห็นว่ารายการใน
Cart
มี การเปลี่ยนแปลงราคา คุณสามารถตอบกลับโดยมีข้อผิดพลาดประเภทFoodOrderError
PRICE_CHANGED
รวมถึงcorrectedProposedOrder
และpaymentOptions
Google จะแจ้งให้ผู้ใช้ทราบเกี่ยวกับการเปลี่ยนแปลง แต่อนุญาตให้ผู้ใช้ส่งพร้อมcorrectedProposedOrder
นอกจากนี้ ผู้ใช้ยังกลับไปแก้ไขรถเข็นได้ในกรณีที่ ที่ต้องการ คุณจะได้รับCheckoutRequestMessage
ใหม่หรือSubmitOrderRequestMessage
- ข้อผิดพลาดที่กู้คืนไม่ได้: ผู้ใช้จะต้องแก้ไขรถเข็นก่อน
ส่งคำสั่งซื้อ ตัวอย่างเช่น หากคุณระบุว่าร้านอาหารนั้น
ปิดแล้ว คุณสามารถตอบกลับด้วย
FoodOrderError
ประเภทข้อผิดพลาดCLOSED
Google แจ้งให้ผู้ใช้ทราบและจัดการการโต้ตอบเพื่ออัปเดตเป็น ร้านอาหาร คุณจะได้รับCheckoutRequestMessage
ใหม่สำหรับบัญชี รถเข็น
โดยทั่วไป ทำให้ข้อผิดพลาดระดับรถเข็นกู้คืนไม่ได้และข้อผิดพลาดระดับสินค้า
กู้คืนได้ ดูรายการประเภทข้อผิดพลาดทั้งหมดและความหมายได้ที่
FoodOrderError
การจัดการการเปลี่ยนแปลงราคา
การเปลี่ยนแปลงราคาระหว่างการชำระเงิน
หากพบปัญหาเกี่ยวกับราคาขณะประมวลผลจุดชำระเงินของลูกค้า โปรดทำตามขั้นตอนต่อไปนี้
- ตอบกลับ
CheckoutRequestMessage
ด้วยCheckoutResponseMessage
ที่มีFoodErrorExtension
ในฐานะ ตามที่อธิบายไว้ในการจัดการข้อผิดพลาด - ในการตอบกลับข้อผิดพลาด ให้ใช้
correctedProposedOrder.cart
เพื่ออัปเดตราคา เป็นค่าที่ถูกต้อง Google ได้รับคำสั่งซื้อที่ได้รับการแก้ไขและอาจออกCheckoutRequestMessage
หลังการชำระเงิน Google จะแสดงหน้ายืนยันคำสั่งซื้อต่อผู้ใช้ปลายทาง
ไม่ว่า ProposedOrder
จะมีการเปลี่ยนแปลงหรือไม่
หาก ProposedOrder ถูกต้อง Google อาจแสดงคำเตือนเพิ่มเติมให้กับ
แจ้งให้ผู้ใช้ทราบถึงการเปลี่ยนแปลง หากผู้ใช้ตกลงที่จะสั่งซื้อ
จะไม่มีคำขอชำระเงินอีกต่อไป ขั้นตอนจะยังคงสั่งซื้อการส่งต่อไป โดยมี
ProposedOrder
ที่แก้ไขแล้ว
แต่ผู้ใช้สามารถเปลี่ยนใจและแก้ไขรถเข็นอีกครั้งได้ทุกเมื่อ วันและเวลา
การอัปเดตรถเข็นในลักษณะนี้ Google จะส่ง CheckoutRequestMessage
ใหม่
มีการเปลี่ยนแปลงราคาระหว่างการส่งคำสั่งซื้อ
หากพบปัญหาเกี่ยวกับราคาขณะประมวลผลการส่งคำสั่งซื้อ
(มีการทริกเกอร์ Intent ของ actions.intent.TRANSACTION_DECISION
) ไม่ต้องตอบสนอง
โดยมีข้อผิดพลาดหรืออัปเดตราคาในการตอบกลับ ถ้าราคา จำนวน
หรือรายละเอียดอื่นๆ ใน SubmitOrderRequestMessage
ไม่สอดคล้องกับ
ตอบกลับด้วยการตั้งค่า orderState
เป็น REJECTED
เพื่อระบุว่า
ไม่สามารถสั่งซื้อตามที่ขอ
จากนั้น หากรายละเอียดคำสั่งซื้อและการชำระเงินถูกต้อง ให้ตั้งค่า orderState
เป็น CREATED
หรือ CONFIRMED
นอกจากนี้ ให้ใส่ actionOrderId
เพื่อแสดงรหัสคำสั่งซื้อใน
ระบบของคุณ ต้องใช้รหัสนี้เมื่อส่งการอัปเดตครั้งต่อๆ ไป
หากคุณไม่สามารถประมวลผลการชำระเงินและได้ส่ง
SubmitOrderRequestMessage
คุณสามารถส่ง
ตั้งค่า AsyncOrderUpdateRequestMessage
ที่มี orderState
เป็น REJECTED
เพื่ออนุญาตให้
ผู้ใช้ทราบว่าคำสั่งซื้อจะไม่สำเร็จ
ราคาเปลี่ยนแปลงหลังจากส่งคำสั่งซื้อ
หากคุณพิจารณาแล้วว่าราคาได้เปลี่ยนแปลงไปจากราคาที่ใช้เมื่อลูกค้า
ส่งคำสั่งซื้อแล้ว คุณสามารถออก AsyncOrderUpdateRequestMessage
ได้
ตามที่อธิบายไว้ในการติดตั้งใช้งานการอัปเดตคำสั่งซื้อแบบอะซิงโครนัสด้วยราคาใหม่
วิธีอัปเดตราคาโดยใช้การอัปเดตคำสั่งซื้อแบบไม่พร้อมกัน
- เปลี่ยนราคาในสกุลเงิน
lineItemUpdates[x].price
ช่วงเวลานี้ แสดงค่าใช้จ่ายรวมของสินค้า ซึ่งรวมถึงส่วนเสริมและตัวคูณ ตามจำนวน (สำหรับข้อมูลเพิ่มเติม โปรดดูคำอธิบายของ ฟิลด์price
จากLineItem
) - ป้อนคำอธิบายเป็นภาษา
lineItemUpdates[x].reason
- ตั้งค่า
lineItemUpdates[x].orderState
ไปยังCONFIRMED
คุณสามารถพยายามเรียกเก็บเงินจากเครื่องมือการชำระเงินก่อนหรือหลังจากส่ง
AsyncOrderUpdateRequestMessage ตามการพิจารณาตามที่เห็นสมควร หากทำธุรกรรมไม่สำเร็จ
(อาจเป็นเพราะเดลต้าราคาสูงเกินไป) ให้ส่ง
AsyncOrderUpdateRequestMessage พร้อมการตั้งค่าต่อไปนี้ใน
OrderUpdate
เพื่อแจ้ง Google เกี่ยวกับความล้มเหลว:
- ตั้งค่า
orderState
เป็นREJECTED
- อธิบายความล้มเหลวในช่อง
label
การตรวจสอบความถูกต้องของจุดชำระเงิน
ดังที่อธิบายไว้ในขั้นตอนที่ 4: นำการชำระเงินไปใช้
ปลายทางของ Fulfillment ควรทำการตรวจสอบสำหรับขาเข้าทุกรายการ
CheckoutRequestMessage
แล้วตอบกลับด้วย CheckoutResponseMessage
ต่อไปนี้คือตัวอย่างของ CheckoutResponseMessage
ที่ประสบความสำเร็จ
การตรวจสอบความถูกต้อง:
กรณีการใช้งาน | วิธีติดตั้งใช้งาน |
---|---|
กรณีการใช้งาน 1: ตรวจสอบสำเร็จ | กลับ CheckoutResponse ต้องมี
ProposedOrder และ PaymentOptions
ProposedOrder รวมภาษี ค่าธรรมเนียม และราคารวมของ
รถเข็น |
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 } } } } } ] } } }
การตรวจสอบที่อยู่สำหรับจัดส่ง
ปลายทางของการดำเนินการตามคำสั่งซื้อควรตรวจสอบที่อยู่สำหรับจัดส่งที่มีอยู่ในแต่ละปลายทาง
CheckoutRequestMessage
หากที่อยู่สำหรับจัดส่งมีปัญหา เช่น อยู่นอกระยะ
บริการจัดส่ง CheckoutResponseMessage
ที่ส่งคืนโดย
Fulfillment ควรมีประเภทที่เหมาะสมเป็น FoodOrderError
กรณีการใช้งาน | วิธีติดตั้งใช้งาน |
---|---|
กรณีการใช้งาน 1: การตรวจสอบความถูกต้องล้มเหลวเนื่องจากที่อยู่สำหรับจัดส่งปิดอยู่ หรือมีปัญหาเกี่ยวกับที่อยู่สำหรับจัดส่ง | ส่งคืน FoodErrorExtension พร้อมกับ FoodOrderError
ของข้อผิดพลาดประเภท OUT_OF_SERVICE_AREA |
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." } ] } } } ] } } }
การตรวจสอบมูลค่าการสั่งซื้อขั้นต่ำ
ปลายทางการดำเนินการตามคำสั่งซื้อควรตรวจสอบมูลค่าการสั่งซื้อขั้นต่ำของแต่ละผลิตภัณฑ์
CheckoutRequestMessage
หากไม่ถึงมูลค่าการสั่งซื้อขั้นต่ำ ระบบจะสั่งซื้อ CheckoutResponseMessage
การแสดงผลโดยการดำเนินการของคุณควรมีประเภทข้อผิดพลาด FoodOrderError
REQUIREMENTS_NOT_MET
กรณีการใช้งาน | วิธีติดตั้งใช้งาน |
---|---|
กรณีการใช้งาน 1: การตรวจสอบความถูกต้องล้มเหลวเนื่องจากมูลค่าการสั่งซื้อขั้นต่ำ ไม่ตรง | ส่งคืน FoodErrorExtension พร้อมกับ FoodOrderError
ของข้อผิดพลาดประเภท REQUIREMENTS_NOT_MET |
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." } ] } } } ] } } }
การตรวจสอบกรอบเวลาการสั่งซื้อ
ปลายทางของการดำเนินการตามคำสั่งซื้อควรตรวจสอบปัจจัยที่อาจส่งผลต่อ
กรอบเวลาการสั่งซื้อของ CheckoutRequestMessage
แต่ละรายการ
ตัวอย่างเช่น หากร้านอาหารปิดหรือไม่รับคำสั่งซื้อที่
ในตอนนี้ CheckoutResponseMessage
ที่ส่งคืนโดยการดำเนินการตามคำสั่งซื้อ
มีข้อผิดพลาด FoodOrderError
ประเภท CLOSED
หรือ NO_CAPACITY
ตามลำดับ
กรณีการใช้งาน | วิธีติดตั้งใช้งาน |
---|---|
กรณีการใช้งาน 1: ตรวจสอบไม่สำเร็จเนื่องจากร้านอาหารปิดอยู่ หรือ ไม่รองรับอีกต่อไป | ส่งคืน FoodErrorExtension พร้อมกับ FoodOrderError
ของข้อผิดพลาดประเภท CLOSED |
กรณีการใช้งาน 2: ตรวจสอบไม่สำเร็จเนื่องจากร้านอาหารไม่ว่างและ ไม่รับคำสั่งซื้อในขณะนี้ | ส่งคืน FoodErrorExtension พร้อมกับ FoodOrderError
ของข้อผิดพลาดประเภท NO_CAPACITY |
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." } ] } } } ] } } }
การตรวจสอบรายการในรถเข็น
ปลายทางการดำเนินการตามคำสั่งซื้อควรตรวจสอบราคาและความพร้อมจำหน่ายสินค้าของผลิตภัณฑ์แต่ละรายการ
สินค้าในรถเข็นที่อยู่ใน CheckoutRequestMessage
หากความพร้อมจำหน่ายสินค้าหรือราคามีการเปลี่ยนแปลง CheckoutResponseMessage
การแสดงผลโดยการดำเนินการของคุณควรมีประเภทข้อผิดพลาด FoodOrderError
AVAILABILITY_CHANGED
หรือ PRICE_CHANGED
ตามลำดับ
กรณีการใช้งาน | วิธีติดตั้งใช้งาน |
---|---|
กรณีการใช้งาน 1: การตรวจสอบความถูกต้องล้มเหลวเนื่องจากรายการในเมนูบางรายการและ/หรือ การปรับแต่งของพวกเขาไม่ถูกต้องหรือหมด | ส่งคืน FoodErrorExtension พร้อมกับ correctedProposedOrder
PaymentOptions และ FoodOrderError ของประเภทข้อผิดพลาด
AVAILABILITY_CHANGED รายการที่ไม่ถูกต้องต้องถูกนำออกจาก
CorrectedProposedOrder |
กรณีการใช้งาน 2: การตรวจสอบความถูกต้องล้มเหลวเนื่องจากรายการในเมนูบางรายการและ/หรือ การกำหนดค่าไม่ถูกต้องหรือไม่มีในสต็อก รถเข็นที่แก้ไขแล้ว ไม่เป็นไปตามข้อกำหนดมูลค่าการสั่งซื้อขั้นต่ำอีกต่อไป | ส่งคืน FoodErrorExtension พร้อมกับ FoodOrderError
ของประเภทข้อผิดพลาด AVAILABILITY_CHANGED และ
REQUIREMENTS_NOT_MET |
กรณีการใช้งาน 3: การตรวจสอบความถูกต้องล้มเหลวเนื่องจากรายการในเมนูบางรายการและ/หรือ ราคาที่กำหนดเองมีการเปลี่ยนแปลง | ส่งคืน FoodErrorExtension พร้อมกับ correctedProposedOrder
PaymentOptions และ FoodOrderError ของประเภทข้อผิดพลาด
PRICE_CHANGED ต้องอัปเดตราคาที่ไม่เป็นปัจจุบันใน
CorrectedProposedOrder |
กรณีการใช้งาน 4: การตรวจสอบความถูกต้องล้มเหลวเนื่องจากรายการในเมนูบางรายการและ/หรือ ราคาที่ปรับได้มีการเปลี่ยนแปลง รถเข็นที่แก้ไขแล้วไม่เป็นไปตาม ข้อกำหนดมูลค่าการสั่งซื้อขั้นต่ำ | ส่งคืน FoodErrorExtension พร้อมกับ FoodOrderError
ของประเภทข้อผิดพลาด PRICE_CHANGED และ
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 } } ] } } } ] } } }
ส่งการตรวจสอบคำสั่งซื้อ
ตามที่อธิบายไว้ในขั้นตอนที่ 7: ใช้การส่งคำสั่งซื้อ
ปลายทางของ Fulfillment ควรทำการตรวจสอบสำหรับขาเข้าทุกรายการ
SubmitOrderRequestMessage
และตอบกลับด้วย
SubmitOrderResponseMessage
ต่อไปนี้คือตัวอย่างของ SubmitOrderResponseMessage
ที่ประสบความสำเร็จ
การตรวจสอบความถูกต้อง:
กรณีการใช้งาน | วิธีติดตั้งใช้งาน |
---|---|
กรณีการใช้งาน 1: สร้างคำสั่งซื้อเรียบร้อยแล้ว | SubmitOrderResponseMessage ที่มีคำสั่งซื้อ CREATED
ต้องมี actionOrderId
userVisibleId , orderManagementActions และ
estimatedFulfillmentTime |
กรณีการใช้งาน 2: คำสั่งซื้อถูกปฏิเสธเนื่องจากปัญหาด้านการชำระเงิน | SubmitOrderResponseMessage ที่มีคำสั่งซื้อ REJECTED
ต้องมี actionOrderId
userVisibleId , orderManagementActions และ
rejectionInfo ประเภท PAYMENT_DECLINED |
กรณีการใช้งาน 3: คำสั่งซื้อถูกปฏิเสธสำหรับผู้ใช้ที่มีการแจ้งว่าถูกแบน | SubmitOrderResponseMessage ที่มีคำสั่งซื้อ REJECTED
สถานะ ต้องมี actionOrderId
userVisibleId , orderManagementActions และ
rejectionInfo ประเภท INELIGIBLE |
กรณีการใช้งาน 4: คำสั่งซื้อถูกปฏิเสธเนื่องจากข้อมูลผู้ใช้ ไม่สมบูรณ์หรือไม่ถูกต้อง | SubmitOrderResponseMessage ที่มีคำสั่งซื้อ REJECTED
ต้องมี actionOrderId
userVisibleId , orderManagementActions และ
rejectionInfo ประเภท INELIGIBLE |
กรณีการใช้งาน 5: คำสั่งซื้อถูกปฏิเสธโดยไม่ทราบสาเหตุ | SubmitOrderResponseMessage ที่มีคำสั่งซื้อ REJECTED
ต้องมี actionOrderId
userVisibleId , orderManagementActions และ
rejectionInfo ประเภท UNKNOWN |
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" } } } ] } } } ] } } }