הגדרת האפשרות 'שליחת הזמנה'

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

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

יישום של אספקת הזמנות

שירות האינטרנט 'הזמנה מקצה לקצה' שאתם יוצרים כדי לעבוד עם 'הזמנה מקצה לקצה' חייב לכלול נקודת קצה של כתובת URL לקבלת הודעות על הזמנות מ-Google. להזמנה בתהליך עיבוד, שירות האינטרנט שלך מקבל SubmitOrderRequestMessage ב-JSON בפורמט של בקשת POST מ-Google. הבקשה הזו מכילה הזמנת לקוח, כולל מיסים, עמלות ופרטי תשלום. עם קבלת ההזמנה שירות האינטרנט חייב לבצע את הפעולות הבאות:

  • לבדוק זכאות לעסקאות, למשל אימות כרטיס או זיהוי הונאות.
  • יוצרים הזמנה במערכת.
  • מאשרים את אמצעי התשלום וקוראים לממשק ה-API של החיוב של ספק שירותי התשלומים, כשהדבר רלוונטי.
  • עליך להשיב במצב המתאים לפי הצו: CREATED, CONFIRMED או REJECTED.

לאחר עיבוד ההזמנה, קוד האספקה חייב לספק תשובה בפורמט של הודעת JSON מסוג SubmitOrderResponseMessage בחזרה ל-Google.

למידע נוסף על שירות האינטרנט של מילוי הזמנות מקצה לקצה לעיון בדרישות ההטמעה, ראו סקירה כללית בנושא מילוי הזמנות.

הודעה על בקשת הזמנה

כשלקוח בוחר לבצע הזמנה בתהליך ההזמנה מקצה לקצה, Google שולחת בקשה לשירות האינטרנט שלכם באמצעות הודעת JSON שנקראת SubmitOrderRequestMessage שמכיל את הנתונים הבאים:

  1. Intent: השדה inputs[0].intent בכל גוף של בקשת הזמנה לשליחה מכיל את ערך המחרוזת actions.intent.TRANSACTION_DECISION.
  2. סדר: השדה inputs[0].arguments[0].transactionDecisionValue ב- בקשת ההזמנה מכילה אובייקט Order שמייצג את לביצוע ההזמנה של הלקוח, יחד עם פרטי התשלום.
  3. דגל Sandbox: השדה isInSandbox של בקשת הזמנה מציין האם העסקה כוללת תשלומים ב-Sandbox.

דוגמה לבקשת הזמנה

למשל, SubmitOrderRequestMessage:

JSON

{
    "user": {},
    "conversation": {
        "conversationId": "CTKbKfUlHCyDEdcz_5PBJTtf"
    },
    "inputs": [
        {
            "intent": "actions.intent.TRANSACTION_DECISION",
            "arguments": [
                {
                    "transactionDecisionValue": {
                        "order": {
                            "finalOrder": {
                                "cart": {
                                    "merchant": {
                                        "id": "restaurant/Restaurant/QWERTY",
                                        "name": "Tep Tep Chicken Club"
                                    },
                                    "lineItems": [
                                        {
                                            "name": "Spicy Fried Chicken",
                                            "type": "REGULAR",
                                            "id": "299977679",
                                            "quantity": 2,
                                            "price": {
                                                "type": "ESTIMATE",
                                                "amount": {
                                                    "currencyCode": "AUD",
                                                    "units": "39",
                                                    "nanos": 600000000
                                                }
                                            },
                                            "offerId": "MenuItemOffer/QWERTY/scheduleId/496/itemId/143",
                                            "extension": {
                                                "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension"
                                            }
                                        }
                                    ],
                                    "extension": {
                                        "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
                                        "fulfillmentPreference": {
                                            "fulfillmentInfo": {
                                                "delivery": {
                                                    "deliveryTimeIso8601": "P0M"
                                                }
                                            }
                                        },
                                        "location": {
                                            "coordinates": {
                                                "latitude": -33.8376441,
                                                "longitude": 151.0868736
                                            },
                                            "formattedAddress": "Killoola St, 1, Concord West NSW 2138",
                                            "zipCode": "2138",
                                            "city": "Concord West",
                                            "postalAddress": {
                                                "regionCode": "AU",
                                                "postalCode": "2138",
                                                "administrativeArea": "NSW",
                                                "locality": "Concord West",
                                                "addressLines": [
                                                    "Killoola St",
                                                    "1"
                                                ]
                                            }
                                        },
                                        "contact": {
                                            "displayName": "Hab Sy",
                                            "email": "hab9878.sy@gmail.com",
                                            "phoneNumber": "+61000000000",
                                            "firstName": "Hab",
                                            "lastName": "Sy"
                                        }
                                    }
                                },
                                "otherItems": [
                                    {
                                        "name": "Delivery fee",
                                        "type": "DELIVERY",
                                        "price": {
                                            "type": "ESTIMATE",
                                            "amount": {
                                                "currencyCode": "AUD",
                                                "units": "3",
                                                "nanos": 500000000
                                            }
                                        }
                                    },
                                    {
                                        "name": "Subtotal",
                                        "type": "SUBTOTAL",
                                        "price": {
                                            "type": "ESTIMATE",
                                            "amount": {
                                                "currencyCode": "AUD",
                                                "units": "39",
                                                "nanos": 600000000
                                            }
                                        }
                                    }
                                ],
                                "totalPrice": {
                                    "type": "ESTIMATE",
                                    "amount": {
                                        "currencyCode": "AUD",
                                        "units": "43",
                                        "nanos": 100000000
                                    }
                                },
                                "extension": {
                                    "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension"
                                }
                            },
                            "googleOrderId": "01412971004192156198",
                            "orderDate": "2020-10-22T09:02:06.173Z",
                            "paymentInfo": {
                                "displayName": "Pay when you get your food",
                                "paymentType": "ON_FULFILLMENT"
                            }
                        }
                    }
                }
            ]
        }
    ],
    "directActionOnly": true,
    "isInSandbox": true
}
    

הודעה על מענה להזמנה

אחרי שתקבלו בקשה, שירות האינטרנט של 'הזמנה מקצה לקצה' מעבד את נשלחת ושולחת בחזרה SubmitOrderResponseMessage שכולל את הנתונים הבאים:

  • OrderUpdate: אובייקט שמכיל את מצב הצו, וכל פעולות לאחר ההזמנה שזמינות למשתמש, כמו פנייה לתמיכה צפייה בפרטי הזמנות, שאותם מגדירים שדה finalResponse.richResponse.items[0].structuredResponse.orderUpdate מתוך את התשובה.

שדה לעדכון ההזמנה

כששירות האינטרנט שולח SubmitOrderResponseMessage, הוא מכיל שדה OrderUpdate שכולל את השדות הבאים:

  • actionOrderId: המזהה הייחודי של ההזמנה, המשמש באופן ייחודי זיהוי ההזמנה במערכת ועיון בה כששולחים עדכוני הזמנות.
  • orderState: אובייקט OrderState שמייצג את מצב ההזמנה.
  • orderManagementActions: פעולות לאחר ההזמנה שזמינות למשתמש, כמו ליצירת קשר עם תמיכת הלקוחות והצגת פרטי ההזמנה.
  • totalPrice: המחיר הכולל של ההזמנה. הפעולה הזאת אופציונלית. שליחה בלבד אם המחיר הכולל של ההזמנה השתנה לאחר שליחת ההזמנה.

הזמנה יכולה להיות באחד מהסטטוסים הבאים:

  • CREATED: נקודת הקצה למילוי הזמנות עיבדה את ההזמנה בהצלחה, אבל הספק עדיין לא אישר את ההזמנה.
  • CONFIRMED: נקודת הקצה למילוי הזמנות עיבדה את ההזמנה בהצלחה, והספק אישר את ההזמנה.
  • REJECTED: הייתה בעיה ולא ניתן היה לנקודת הקצה של מילוי ההזמנות ליצור או לאשר את ההזמנה, כולל בעיות בתשלום.

אם מגדירים הזמנה למצב REJECTED, צריך לציין את הסיבה בעמודה שדה rejectionInfo של OrderUpdate. כדאי להשתמש ערכי FoodOrderUpdateExtension.FoodOrderErrors בשילוב עם rejectionInfo מסוג UNKNOWN ולספק תיאור.

דוגמה לתגובה להזמנה

למשל, SubmitOrderResponseMessage:

JSON

{
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "orderUpdate": {
              "actionOrderId": "1603357328160",
              "orderState": {
                "state": "CONFIRMED",
                "label": "Pending"
              },
              "updateTime": "2020-10-22T02:02:08-07:00",
              "orderManagementActions": [
                {
                  "type": "CUSTOMER_SERVICE",
                  "button": {
                    "title": "Call customer service",
                    "openUrlAction": {
                      "url": "tel:+61234561000"
                    }
                  }
                },
                {
                  "type": "VIEW_DETAILS",
                  "button": {
                    "title": "View order details",
                    "openUrlAction": {
                      "url": "https://partner.com/view/orderstatus"
                    }
                  }
                }
              ],
              "receipt": {
                "userVisibleOrderId": "BXZ-1603357328"
              }
            }
          }
        }
      ]
    }
  }
}

הבקשה לא הצליחה

אם בקשת השליחה נכשלת, צריך להגדיר SubmitOrderResponseMessage OrderState.state אל REJECTED. התגובה חייבת לכלול גם כוללים את הערך RejectionInfo, שמכיל RejectionType לתיאור של סוג השגיאה.

דוגמה לתשובה שנכשלה

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"
                    }
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}
    

שליחת הטמעת ההזמנה

כשמטמיעים את ה-API של שליחת ההזמנות, צריך לבצע את הפעולות הבאות.

אימות

  1. מבצעים אימותים של שירותים, עגלות קניות ומבצעים, כפי שמתואר בקטע הגדרה לתשלום.
  2. הפונקציה מחזירה RejectionInfo עם אחד מהסוגים הבאים, אם נדרש:
RejectionInfoType תרחיש לדוגמה
UNAVAILABLE_SLOT מועד האספקה כבר לא בתוקף.
PROMO_USER_INELIGIBLE משתמשים ב'אימייל' שבאובייקט Contact בבקשה כדי לאמת את הזכאות למבצע עבור המשתמש. דוגמה: הטמעת הזמנה עם מבצעים
INELIGIBLE
  • פרטי המשתמש, כמו מספר הטלפון או האימייל, לא תקינים.
  • מנוע הסיכון מזהה הונאה.
PAYMENT_DECLINED לא ניתן לעבד את התשלום. לדוגמה, יכול להיות שהסיבה לכך היא שאין מספיק כסף בחשבון.
UNKNOWN לכל שגיאת אימות אחרת.

מגדירים את הערך OrderState.state לערך REJECTED אם יש אימות שגיאות שהתרחשו. לחלופין, אפשר לציין סיבה ספציפית לדחייה באמצעות FoodOrderUpdateExtension.foodOrderErrors. הצגת דוגמאות ב שולחים את אימות ההזמנה.

עיבוד התשלום

  1. מחשבים את הtotalPrice על ידי הוספת מחיר עגלת הקניות, העמלות, ההנחה, המיסים חינם. הערך של 'totalPrice' צריך להיות זהה לערך של השדה 'totalPrice' שהוחזר ב-CheckoutResponseMessage וכן השינוי ב- סכום התשר אם המשתמש יכול לשנות את התמריצים. להצגת מחיר שינויים במהלך שליחת ההזמנה לקבלת פרטים נוספים.
  2. אם מחזירים תשובה עם מצב הזמנה, צריך לעבד את ההזמנה והתשלום. של CREATED או CONFIRMED.
  3. מוודאים שמוחזר פורמט תגובה תקין באמצעות הסוגים שנוצרו נוצר מהסכימה שמתוארת ליצור ספריות לקוח.
  4. משתמשים ב GoogleProvidedPaymentInstrument.instrumentToken כדי לעבד את התשלום. החזרת RejectionInfo בסוג PAYMENT_DECLINED אם לא ניתן לעבד את התשלום. לעיון בתהליך payments לקבלת פרטים נוספים.
  5. להודיע למשתמש מיד לאחר עיבוד ההזמנה באמצעות אימייל ואו הודעת SMS.

החזרת התשובה

  1. מגדירים את OrderState.state לערך CREATED או CONFIRMED אם אין שגיאות.
  2. מגדירים את OrderState.state לערך REJECTED אם יש שגיאות והוא יכלול את האובייקט RejectionInfo ההגדרה המתאימה, RejectionInfoType.
  3. מגדירים את הפרמטר OrderUpdate.orderManagementActions.