הטמעת פעולות מתקדמות למילוי הזמנות

מיפוי של פידים בתפריט מיפוי ואת הפריטים בעגלת הקניות

כשלקוחות מוסיפים פריטים מפיד התפריט לעגלת הקניות ומבצעים תשלום, Google שולחת את הפריטים האלה לנקודת הקצה של מילוי ההזמנות כדי לאמת את המחיר שלהם זמינות. אחרי אימות התמחור והזמינות, הלקוח יוכל לבצע את ההזמנה. בקטע הזה מוסבר איך למפות את האפשרויות בפיד של התפריט אל פריטים בעגלת הקניות.

קטעים לדוגמה בקטע הזה הם גרסאות שהוסרו מפיד התפריט ומעגלת הקניות. של Google. רק שדות שרלוונטיים להמחשת המיפוי בין פיד התפריט לבין מוצג האובייקט Cart. לסכימות מלאות, ראו 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תפריטItem יכול לכלול גם תוספים מקוננים מסוג AddOnתפריטItem(s) שמיוצגים כ-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

בדוגמה הזו יש פריט בתפריט עם תוסף אחד או יותר AddOnSyncItems.

אפשרויות בתפריט בפיד של תפריטים:

{
  "@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

הדוגמה הזו מכילה אפשרות בתפריט עם אפשרויות בתפריט, AddOnOptionsItemItems, ו-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. אפשר להשתמש כדי לזהות שגיאה אחת או יותר שאירעה במהלך העיבוד.

יש 2 דרכים לטפל בשגיאות:

  • שגיאות הניתנות לשחזור: המשתמש לא נדרש לערוך את עגלת הקניות כדי לשלוח את הזמנה. לדוגמה, אם נקבע שלפריט בCart יש שינוי במחיר, אפשר להשיב FoodOrderError עם סוג שגיאה PRICE_CHANGED, וגם correctedProposedOrder ו-paymentOptions. Google מודיעה למשתמש על השינוי, אבל מאפשרת למשתמש לשלוח עם correctedProposedOrder המשתמש יכול גם לחזור ולערוך את עגלת הקניות שלו אם הרצויה. תקבלו CheckoutRequestMessage חדש או SubmitOrderRequestMessage
  • שגיאות שלא ניתן לשחזר: המשתמש נדרש לערוך את עגלת הקניות לפני כן שליחת ההזמנה. לדוגמה, אם קבעתם שהמסעדה סגור, תוכל להשיב עם FoodOrderError מסוג שגיאה CLOSED. Google מיידעת את המשתמש ומנהלת את האינטראקציה כדי לעדכן אותו מסעדה. נשלח לך CheckoutRequestMessage חדש עבור בעגלת הקניות.

באופן כללי, שגיאות ברמת עגלת הקניות יהיו בלתי ניתנות לשחזור ושגיאות ברמת הפריט. אפשר לשחזר. רשימה מלאה של סוגי השגיאות והמשמעות שלהם זמינה במאמר FoodOrderError

טיפול בשינויים במחירים

שינויים במחירים במהלך התשלום בקופה

אם נתקלתם בבעיה במחיר במהלך עיבוד התשלום של לקוח לבצע את הפעולות הבאות:

  1. להשיב ל-CheckoutRequestMessage עם CheckoutResponseMessage שמכיל FoodErrorExtension, כמו מתוארות במאמר טיפול בשגיאות.
  2. בתשובת השגיאה, משתמשים בפונקציה 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, כמו שמתואר ביישום של עדכוני הזמנות אסינכרוניים, עם המחיר החדש.

כדי לעדכן מחירים באמצעות עדכוני הזמנות אסינכרוניים:

  1. משנים את המחיר בlineItemUpdates[x].price. הזה value משקף את העלות הכוללת של הפריט, כולל תוספים ומכפיל בכמות. (למידע נוסף, עיינו בתיאור שדה price של LineItem).
  2. צריך להזין הסבר בlineItemUpdates[x].reason.
  3. הגדרה של lineItemUpdates[x].orderState אל CONFIRMED.

ניתן לנסות לחייב את אמצעי התשלום לפני או אחרי שליחת אמצעי התשלום AsyncOrderUpdateRequestMessage, לפי שיקול דעתכם. אם העסקה נכשלה (אולי בגלל שמחיר דלתא גבוה מדי), שלח AsyncOrderUpdateRequestMessage עם ההגדרות הבאות ב- OrderUpdate כדי להודיע ל-Google על התקלה:

  • מגדירים את orderState להיות REJECTED.
  • צריך לתאר את הכשל בשדה label.

אימות דף התשלום

כפי שצוין בשלב 4: הטמעת Google 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"
                    }
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}