אחרי התשלום בקופה call, המשתמש מעיין בעגלת הקניות המעודכנת שכוללת מיסים, דמי משלוח, הנחות חיובים אחרים שתחזירו. המשתמש מאשר ושולח את ההזמנה Google שולחת לנקודת הקצה של מילוי ההזמנות בקשת JSON שמכילה את פרטי ההזמנה. שירות האינטרנט שלך חייב לקבל את ההזמנה הזו, לעבד אותה ולהשיב ל-Google ולציין את מצב הצו.
בקטע הזה מתואר הפורמט של הודעה לבקשת הזמנה שנשלחה על ידי Google,
שנקרא SubmitOrderRequestMessage
, והפורמט של הודעת התשובה
שצריך לספק, שנקראת
SubmitOrderResponseMessage
.
לקבלת מידע נוסף על מחזור החיים של אספקת הזמנות, אפשר לעיין
סקירה כללית בנושא אספקה
יישום של אספקת הזמנות
שירות האינטרנט 'הזמנה מקצה לקצה' שאתם יוצרים כדי לעבוד עם 'הזמנה מקצה לקצה' חייב
לכלול נקודת קצה של כתובת URL לקבלת הודעות על הזמנות מ-Google. להזמנה
בתהליך עיבוד, שירות האינטרנט שלך מקבל SubmitOrderRequestMessage
ב-JSON
בפורמט של בקשת POST מ-Google. הבקשה הזו מכילה הזמנת לקוח,
כולל מיסים, עמלות ופרטי תשלום. עם קבלת ההזמנה
שירות האינטרנט חייב לבצע את הפעולות הבאות:
- לבדוק זכאות לעסקאות, למשל אימות כרטיס או זיהוי הונאות.
- יוצרים הזמנה במערכת.
- מאשרים את אמצעי התשלום וקוראים לממשק ה-API של החיוב של ספק שירותי התשלומים, כשהדבר רלוונטי.
- עליך להשיב במצב המתאים לפי הצו:
CREATED
,CONFIRMED
אוREJECTED
.
לאחר עיבוד ההזמנה, קוד האספקה חייב לספק תשובה
בפורמט של הודעת JSON מסוג SubmitOrderResponseMessage
בחזרה ל-Google.
למידע נוסף על שירות האינטרנט של מילוי הזמנות מקצה לקצה לעיון בדרישות ההטמעה, ראו סקירה כללית בנושא מילוי הזמנות.
הודעה על בקשת הזמנה
כשלקוח בוחר לבצע הזמנה בתהליך ההזמנה מקצה לקצה,
Google שולחת בקשה לשירות האינטרנט שלכם באמצעות הודעת JSON שנקראת
SubmitOrderRequestMessage
שמכיל את הנתונים הבאים:
- Intent: השדה
inputs[0].intent
בכל גוף של בקשת הזמנה לשליחה מכיל את ערך המחרוזתactions.intent.TRANSACTION_DECISION
. - סדר: השדה
inputs[0].arguments[0].transactionDecisionValue
ב- בקשת ההזמנה מכילה אובייקטOrder
שמייצג את לביצוע ההזמנה של הלקוח, יחד עם פרטי התשלום. - דגל 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 של שליחת ההזמנות, צריך לבצע את הפעולות הבאות.
אימות
- מבצעים אימותים של שירותים, עגלות קניות ומבצעים, כפי שמתואר בקטע הגדרה לתשלום.
- הפונקציה מחזירה RejectionInfo עם אחד מהסוגים הבאים, אם נדרש:
RejectionInfoType | תרחיש לדוגמה |
---|---|
UNAVAILABLE_SLOT |
מועד האספקה כבר לא בתוקף. |
PROMO_USER_INELIGIBLE |
משתמשים ב'אימייל' שבאובייקט Contact בבקשה כדי לאמת את הזכאות למבצע עבור המשתמש. דוגמה: הטמעת הזמנה עם מבצעים |
INELIGIBLE |
|
PAYMENT_DECLINED |
לא ניתן לעבד את התשלום. לדוגמה, יכול להיות שהסיבה לכך היא שאין מספיק כסף בחשבון. |
UNKNOWN |
לכל שגיאת אימות אחרת. |
מגדירים את הערך OrderState.state
לערך REJECTED
אם יש אימות
שגיאות שהתרחשו. לחלופין, אפשר לציין סיבה ספציפית לדחייה
באמצעות FoodOrderUpdateExtension.foodOrderErrors
. הצגת דוגמאות ב
שולחים את אימות ההזמנה.
עיבוד התשלום
- מחשבים את ה
totalPrice
על ידי הוספת מחיר עגלת הקניות, העמלות, ההנחה, המיסים חינם. הערך של 'totalPrice
' צריך להיות זהה לערך של השדה 'totalPrice
' שהוחזר ב-CheckoutResponseMessage וכן השינוי ב- סכום התשר אם המשתמש יכול לשנות את התמריצים. להצגת מחיר שינויים במהלך שליחת ההזמנה לקבלת פרטים נוספים. - אם מחזירים תשובה עם מצב הזמנה, צריך לעבד את ההזמנה והתשלום.
של
CREATED
אוCONFIRMED
. - מוודאים שמוחזר פורמט תגובה תקין באמצעות הסוגים שנוצרו נוצר מהסכימה שמתוארת ליצור ספריות לקוח.
- משתמשים ב
GoogleProvidedPaymentInstrument.
instrumentToken
כדי לעבד את התשלום. החזרת RejectionInfo בסוגPAYMENT_DECLINED
אם לא ניתן לעבד את התשלום. לעיון בתהליך payments לקבלת פרטים נוספים. - להודיע למשתמש מיד לאחר עיבוד ההזמנה באמצעות אימייל ואו הודעת SMS.
החזרת התשובה
- מגדירים את OrderState.
state
לערךCREATED
אוCONFIRMED
אם אין שגיאות. - מגדירים את OrderState.
state
לערךREJECTED
אם יש שגיאות והוא יכלול את האובייקט RejectionInfo ההגדרה המתאימה, RejectionInfoType. - מגדירים את הפרמטר OrderUpdate.
orderManagementActions
.