ربط خلاصات القائمة وعناصر سلة التسوّق لتوصيل الطلبات
عندما يضيف العملاء أصنافًا من خلاصة القائمة إلى سلة التسوّق ويدفعون الرسوم، ترسل Google هذه السلع إلى نقطة نهاية توصيل الطلبات للتحقّق من سعرها مدى التوفر. وبعد التحقق من السعر ومدى التوفّر، يمكن للعميل تقديم الطلب. يوضّح هذا القسم كيفية ربط عناصر الخلاصة في القائمة عناصر سلة التسوق المخصصة لتوصيل الطلبات.
النماذج في هذا القسم هي إصدارات مجردة من خلاصة القائمة وعربة التسوق
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
من خلاصة القائمة. يُرجى العِلم أنّه يمكن أيضًا أن يحتوي AddOn MenuItem AddOnقائمةItems مدمَجة يتم تمثيلها كـ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
يحتوي هذا المثال على عنصر قائمة يحتوي على عنصر AddOn MenuItems واحد أو أكثر.
السلع في القائمة في خلاصة قائمة:
{ "@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
يحتوي هذا المثال على عنصر قائمة به خيارات عناصر القائمة، AddOn MenuItems، وAddOnقائمةItems مدمجة
السلع في القائمة في خلاصة قائمة:
{ "@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. يمكنك استخدام هذه الصفحة
لتحديد خطأ أو أكثر حدث أثناء المعالجة.
هناك طريقتان للتعامل مع الأخطاء:
- الأخطاء التي يمكن استردادها: لا يُطلب من المستخدم تعديل سلة التسوق لإرسال
طلبك. على سبيل المثال، إذا قررت أنّ عنصرًا في
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
جديدة.
التغييرات في الأسعار أثناء إرسال الطلب
في حال مواجهة مشكلة في السعر أثناء معالجة عملية إرسال الطلب
(تم تشغيل الغرض 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: تنفيذ عملية الدفع،
يجب أن تُجري نقطة نهاية التنفيذ عملية تحقق على كل رسالة واردة
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
التي أرجعها
يجب أن يحتوي طريقة التنفيذ على 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: تنفيذ "إرسال الطلب"، يجب تنفيذ
يجب أن تُجري نقطة نهاية التنفيذ عملية تحقق على كل رسالة واردة
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" } } } ] } } } ] } } }