اقدامات تکمیلی پیشرفته را اجرا کنید

نقشه‌برداری فیدهای منو و اقلام سبد خرید

وقتی مشتریان مواردی را از فید منوی شما به سبد خرید خود اضافه می‌کنند و بررسی می‌کنند، Google آن موارد را به نقطه پایانی شما ارسال می‌کند تا قیمت و در دسترس بودن آنها را تأیید کند. پس از تایید قیمت و در دسترس بودن، مشتری می تواند سفارش را ثبت کند. این بخش نحوه نگاشت آیتم های خوراک منو به اقلام سبد خرید را نشان می دهد.

نمونه‌های موجود در این بخش، نسخه‌های پاک‌شده فید منو و طرح سبد خرید هستند. فقط فیلدهای مربوط به نشان دادن نگاشت بین خوراک منو و شی سبد خرید نشان داده می شوند. برای طرح‌واره‌های کامل، Menu و Cart را ببینید.

موارد موجود در فید Menu که به یک سبد خرید اضافه می شوند در شیء Cart هم برای تسویه حساب و هم برای ارسال سفارش ارسال می شوند.

  • یک MenuItem ساده به‌عنوان LineItem در آرایه lineItems نشان داده می‌شود که offerId offer.id مورد انتخابی منو در فید Menu است.
  • یک MenuItem با یک MenuItemOption مورد نیاز به‌عنوان یک LineItem در آرایه lineItems نشان داده می‌شود که offerId گزینه گزینه گزینه منوی offer.id از فید Menu است.
  • یک AddOnMenuItem از یک LineItem به عنوان یک FoodItemOption در آرایه options FoodItemExtension نشان داده می شود. هر گزینه دارای یک offerId است که با offer.id آیتم منوی افزودنی انتخاب شده از فید Menu مطابقت دارد. توجه داشته باشید که یک 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 است.

موارد منو در فید منو:

{
  "@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 است، پاسخ دهید. می توانید از این پاسخ برای شناسایی یک یا چند خطا که در حین پردازش رخ داده است استفاده کنید.

2 راه برای رسیدگی به خطاها وجود دارد:

  • خطاهای قابل بازیابی: کاربر برای ارسال سفارش نیازی به ویرایش سبد خرید خود ندارد. به عنوان مثال، اگر تشخیص دهید که یک کالا در Cart دارای تغییر قیمت است، می‌توانید با خطای FoodOrderError از نوع خطا PRICE_CHANGED ، همراه با correctedProposedOrder و paymentOptions پاسخ دهید. Google کاربر را از تغییر مطلع می‌کند، اما به کاربر اجازه می‌دهد تا با correctedProposedOrder سفارش ارسال کند. کاربر همچنین می تواند در صورت تمایل برگردد و سبد خرید خود را ویرایش کند. شما یا یک CheckoutRequestMessage یا یک SubmitOrderRequestMessage دریافت خواهید کرد.
  • خطاهای غیر قابل جبران: کاربر موظف است قبل از ارسال سفارش، سبد خرید خود را ویرایش کند. برای مثال، اگر تشخیص دادید که رستوران بسته است، می‌توانید با خطای FoodOrderError از نوع CLOSED پاسخ دهید. گوگل به کاربر اطلاع می دهد و تعامل را برای به روز رسانی به یک رستوران جدید مدیریت می کند. شما یک CheckoutRequestMessage جدید برای یک سبد خرید دریافت خواهید کرد.

به طور کلی، خطاهای سطح سبد خرید را غیرقابل بازیابی و خطاهای سطح مورد را قابل بازیابی کنید. برای فهرست کامل انواع خطا و معانی آنها، FoodOrderError را ببینید.

مدیریت تغییرات قیمت

تغییر قیمت در هنگام تسویه حساب

اگر هنگام پردازش درخواست تسویه حساب مشتری با مشکل قیمت مواجه شدید، موارد زیر را انجام دهید:

  1. همانطور که در Handling errors توضیح داده شده است، با یک CheckoutResponseMessage حاوی یک FoodErrorExtension به CheckoutRequestMessage پاسخ دهید.
  2. در پاسخ به خطا، از correctedProposedOrder.cart برای به روز رسانی قیمت به مقدار صحیح استفاده کنید. Google سفارش اصلاح شده را دریافت می کند و ممکن است یک CheckoutRequestMessage جدید صادر کند.

پس از پرداخت، گوگل یک صفحه تایید سفارش را به کاربر نهایی نمایش می دهد، صرف نظر از اینکه ProposedOrder تغییر کرده است یا خیر.

اگر سفارش پیشنهادی تصحیح شد، ممکن است Google اخطارهای بیشتری برای اطلاع کاربر از تغییرات نشان دهد. در صورت موافقت کاربر با ثبت سفارش، دیگر درخواست پرداخت وجود نخواهد داشت. این جریان به ارسال سفارش ادامه می‌دهد، با ProposedOrder اصلاح‌شده.

با این حال، کاربر همیشه می تواند نظر خود را تغییر دهد و دوباره سبد خرید خود را ویرایش کند. وقتی سبد خرید آنها به این روش به‌روزرسانی می‌شود، Google یک CheckoutRequestMessage جدید ارسال می‌کند.

تغییر قیمت در حین ارسال سفارش

اگر هنگام پردازش ارسال سفارش با مشکل قیمت مواجه شدید (هدف actions.intent.TRANSACTION_DECISION فعال شد)، با خطا پاسخ ندهید یا قیمت را در پاسخ خود به‌روزرسانی نکنید. اگر قیمت‌ها، مقادیر یا سایر جزئیات موجود در SubmitOrderRequestMessage با داده‌های شما مطابقت ندارد، با orderState که روی REJECTED تنظیم شده است پاسخ دهید تا نشان دهید که سفارش نمی‌تواند طبق درخواست انجام شود.

سپس، اگر جزئیات سفارش و پرداخت معتبر هستند، orderState را روی CREATED یا CONFIRMED تنظیم کنید. همچنین، یک actionOrderId برای نشان دادن شناسه سفارش در سیستم خود قرار دهید. این شناسه باید هنگام ارسال به روز رسانی های بعدی استفاده شود.

اگر نمی‌توانید پرداخت را پردازش کنید و قبلاً SubmitOrderRequestMessage ارسال کرده‌اید، می‌توانید یک AsyncOrderUpdateRequestMessage با orderState تنظیم شده روی REJECTED ارسال کنید تا به کاربر اطلاع دهید که سفارش انجام نمی‌شود.

تغییر قیمت پس از ارسال سفارش

اگر تشخیص دادید که قیمتی نسبت به قیمتی که هنگام ارسال سفارش مشتری استفاده می‌شد تغییر کرده است، می‌توانید یک AsyncOrderUpdateRequestMessage ، همانطور که در اجرای به‌روزرسانی‌های سفارش ناهمزمان توضیح داده شده است، با قیمت جدید صادر کنید.

برای به‌روزرسانی قیمت‌ها با استفاده از به‌روزرسانی‌های سفارش ناهمگام:

  1. قیمت را در lineItemUpdates[ x ].price تغییر دهید. این مقدار هزینه کل کالا را منعکس می کند، از جمله افزودنی ها و ضرب در مقدار. (برای اطلاعات بیشتر به توضیحات قسمت price LineItem مراجعه کنید.)
  2. توضیحی را در lineItemUpdates[ x ].reason وارد کنید.
  3. lineItemUpdates[ x ].orderState را روی CONFIRMED تنظیم کنید.

می‌توانید بنا به صلاحدید خود، قبل یا بعد از ارسال AsyncOrderUpdateRequestMessage، ابزار پرداخت را شارژ کنید. اگر تراکنش با شکست مواجه شد (احتمالاً به دلیل بالا بودن دلتای قیمت)، یک AsyncOrderUpdateRequestMessage با تنظیمات زیر در OrderUpdate ارسال کنید تا Google را از شکست مطلع کنید:

  • orderState را روی REJECTED تنظیم کنید.
  • خرابی را در قسمت label توضیح دهید.

اعتبار سنجی پرداخت

همانطور که در مرحله 4 بحث شد: اجرای Checkout ، نقطه پایانی شما باید اعتبارسنجی را در هر 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"
                    }
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}