תהליך התשלום מופעל כשמשתמש יוצר עגלת קניות. התוכן של עגלת הקניות של המשתמש ופרטים על ההזמנה יישלחו לדף האינטרנט של התכונה 'הזמנות' לאחר השיפור. מידע זה מאומת על ידי שירות האינטרנט, ולאחר מכן אתה יכול להמשיך או לבצע שינויים בעגלת הקניות לפי הצורך.
ה-handler של דף התשלום לשירות האינטרנט שלכם חייב להגיב לבקשות POST. כאשר
הלקוח בוחר לשלם, Google שולחת לשירות האינטרנט 'הזמנה' מקצה לקצה'
גוף בקשת JSON בצורת CheckoutRequestMessage
, שמכיל את הפונקציה
פרטים על Cart
של לקוח. לאחר מכן תקבלו תשובה משירות האינטרנט עם
CheckoutResponseMessage
התרשים הבא מדגים את התהליך.
עם קבלת הבקשה לקופה, שירות האינטרנט מקצה לקצה של ההזמנות הבאים:
- לבדוק את תוקף עגלת הקניות על סמך מחירי הפריטים הנוכחיים, הזמינות שלה והספק.
- מחשבים את המחיר הכולל (כולל הנחות, מיסים ודמי משלוח) עמלות).
- אם הפעולה בוצעה ללא שגיאות, עליכם להשיב עם עגלה שלא שונתה.
- אם הפעולה נכשלה, יש להשיב עם הודעת שגיאה והצעה חדשה להזמנה.
לפני שמתחילים להטמיע את תהליך התשלום, מומלץ לעיין בטופס מילוי ההזמנה סקירה כללית התיעוד.
הודעה לגבי בקשה לתשלום
כדי לאמת את עגלת הקניות של הלקוח, כשלקוח בוחר לשלם,
Google שולחת בקשה לשירות האינטרנט שלכם באמצעות גוף JSON בצורת
CheckoutRequestMessage
הזמנת הלקוח נשלחת רק בשלב מאוחר יותר
הזמנת התהליך מקצה לקצה.
נתונים שנכללים
CheckoutRequestMessage
כולל:
- כוונה:
inputs[0].intent
השדה בכל גוף בקשת תשלום מכיל את ערך מחרוזתactions.foodordering.intent.CHECKOUT
. - עגלת קניות: השדה
inputs[0].arguments[0].extension
בבקשה לתשלום מכיל אובייקטCart
שמייצג את עגלת הקניות של הלקוח. - משלוח או ייצוא נתונים: שדה התוסף של האובייקט
Cart
מכיל אובייקטFoodCartExtension
שמציין מאפיינים להעברה או טייק אוויי:- בהזמנות משלוח, האובייקט
FoodCartExtension
כולל את האובייקט כתובת למשלוח. - בהזמנות באיסוף עצמי או באיסוף עצמי, האובייקט
FoodCartExtension
לא מכילים נתוני מיקום כלשהם.
- בהזמנות משלוח, האובייקט
- Sandbox: השדה
isInSandbox
של בקשת תשלום מכיל ערך בוליאני שמציין אם העסקה משתמשת בתשלומים ב-Sandbox.
דוגמה לבקשת תשלום
דוגמה ל-CheckoutRequestMessage
:
{
"user": {},
"conversation": {
"conversationId": "CTZbZfUlHCybEdcz_5PB3Ttf"
},
"inputs": [
{
"intent": "actions.foodordering.intent.CHECKOUT",
"arguments": [
{
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.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"
]
}
}
}
}
}
]
}
],
"directActionOnly": true,
"isInSandbox": true
}
הודעת תגובה לבקשת תשלום
לאחר קבלת בקשה משירות ההזמנות מקצה לקצה, דף התשלום באינטרנט
השירות חייב לעבד אותו ולהגיב עם CheckoutResponseMessage
.
CheckoutResponseMessage
צריך לכלול מידע שהסתיים בהצלחה או נכשל
בקשה.
בקשה שמבוצעת בהצלחה
אם בקשת התשלום תאושר, CheckoutResponseMessage
צריך לכלול
ProposedOrder
וגם
PaymentOptions
:
ProposedOrder
cart
: אובייקטcart
שזהה לעגלת הקניות שצוינהCheckoutRequestMessage
. אם חלק מהתוכן בעגלת הקניות צריך להיות הערך השתנה, במקום זאתCheckoutResponseMessage
צריך לכלולFoodErrorExtension
עםProposedOrder
מתוקן.otherItems
: פריטים שהספק הוסיף, כמו דמי משלוח, מיסים ועמלות אחרות. עשוי לכלול גם טעם מיותר שנוסף על ידי המשתמש.totalPrice
: המחיר הכולל של ההזמנה.extension
:FoodOrderExtension
שמגדיר את פרטי האספקה לגבי ההזמנה, למשל זמן האספקה.
PaymentOptions
- בהמשך תוכלו לקרוא על הגדרת עיבוד התשלומים הגדרת Google
משלמים.
אפשר להשתמש בקובץ JSON כ-placeholder ב-
CheckoutResponseMessage
עד מוכן להטמעת עיבוד תשלומים. - כדי להוסיף אפשרויות תשלום למעקב אחרי ביקורים אל
CheckoutResponseMessage
, בדוגמה שלמטה, שמשתמשת דוגמה לשער תשלום עבורPaymentOptions
.
- בהמשך תוכלו לקרוא על הגדרת עיבוד התשלומים הגדרת Google
משלמים.
אפשר להשתמש בקובץ JSON כ-placeholder ב-
דוגמה לתגובה מוצלחת
{
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"checkoutResponse": {
"proposedOrder": {
"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"
]
}
}
}
},
"totalPrice": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "AUD",
"units": "43",
"nanos": 100000000
}
},
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension",
"availableFulfillmentOptions": [
{
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "P0M"
}
}
}
]
},
"otherItems": [
{
"name": "Delivery fee",
"price": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "AUD",
"units": "3",
"nanos": 500000000
}
},
"type": "DELIVERY"
}
]
},
"paymentOptions": {
"googleProvidedOptions": {
"facilitationSpecification": "{\"apiVersion\":2,\"apiVersionMinor\":0,\"merchantInfo\":{\"merchantName\":\"merchantName\"},\"allowedPaymentMethods\":[{\"type\":\"CARD\",\"parameters\":{\"allowedAuthMethods\":[\"PAN_ONLY\"],\"allowedCardNetworks\":[\"VISA\",\"MASTERCARD\"],\"billingAddressRequired\":true,\"cvcRequired\":false},\"tokenizationSpecification\":{\"type\":\"PAYMENT_GATEWAY\",\"parameters\":{\"gatewayMerchantId\":\"YOUR_MERCHANT_ID\",\"gateway\":\"cybersource\"}}}],\"transactionInfo\":{\"currencyCode\":\"AUD\",\"totalPriceStatus\":\"ESTIMATED\",\"totalPrice\":\"43.1\"}} "
}
},
"additionalPaymentOptions": [
{
"actionProvidedOptions": {
"paymentType": "ON_FULFILLMENT",
"displayName": "Pay when you get your food.",
"onFulfillmentPaymentData": {
"supportedPaymentOptions": []
}
}
}
]
}
}
}
]
}
}
}
הבקשה לא הצליחה
אם הבקשה לדף התשלום לא מצליחה, CheckoutResponseMessage
צריכה
כוללים את FoodErrorExtension
, שמכילה רשימה של
FoodOrderError
פריטים שמתארים שגיאות שאירעו. אם יש פריטים שניתן לשחזר
שגיאות בהזמנה, כמו שינוי מחיר של פריט בעגלת הקניות,
FoodErrorExtension
חייב לכלול את correctedProposedOrder
.
דוגמה לתשובה שנכשלה
{
"expectUserResponse": false,
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"error": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension",
"foodOrderErrors": [
{
"error": "CLOSED",
"description": "The restaurant is closed."
}
]
}
}
}
]
}
}
}
הטמעת דף התשלום
במהלך הטמעת התשלום, יש לבצע את השלבים הבאים.
אימות השירות
החזרת FoodOrderError עבור התנאי הראשון של שגיאת שירות נמצא. לא ניתן לשחזר את השגיאות האלה, לכן אתם אמורים לראות את השגיאה הראשונה הוחזרו. אפשר למצוא תיאור של טיפול בשגיאות שגיאות הניתנות לשחזור.
- קראו את המאפיין FulfillmentOptionInfo בקובץ
כדי לקבוע אם סוג האספקה הוא
delivery
אוpickup
. במקרה הצורך, מחזירים את סוגי השגיאות הבאים:
סוג השגיאה תרחיש לדוגמה לא תקין סוג מילוי ההזמנות לא תקין. NOT_FOUND סוג האספקה לא נמצא. סגור - אין חלונות מסוג OperationHours להזמנה.
- ההזמנה היא הזמנה בהקדם האפשרי ואין כרגע ServiceHours זמינים כרגע.
- יש סגירה במקרה חירום או שהשירות
isDisabled
מוגדר כ-true.
UNAVAILABLE_SLOT אי אפשר למלא את ההזמנה מראש. NO_CAPACITY המסעדה עמוסה ולא מקבלת הזמנות כרגע. OUT_OF_SERVICE_AREA לא ניתן לשלוח את ההזמנה לכתובת של המשתמש. לדוגמה, אפשר לעיין באימות כתובת למשלוח. NO_COURIER_AVAILABLE אי אפשר למסור את ההזמנה כי מספר העובדים מוגבל.
אימות ותמחרו של עגלת הקניות
חיפוש כל עגלת קניות.
lineItems
ואימות באמצעות הנתונים הנוכחיים ב: במערכת או במערכת של המוכר. MenuItemOffer.sku
ערך מישות הפיד נכלל בתור LineItem.offerId
. לכתוב FoodOrderError בכל פריט, אם יש צורך. לכתוב שגיאה אחת לכל היותר לכל פריט. מחזירים את סוגי השגיאות הבאים אם נדרש:סוג השגיאה תרחיש לדוגמה ניתנת לשחזור לא תקין נתוני הפריט או אחד מנתוני האפשרויות לא תקינים. לא NOT_FOUND הפריט או אחת מהאפשרויות לא נמצאו. לא PRICE_CHANGED המחיר של פריט או שילוב של תוספים השתנה. ניתן להתייחס לשגיאה הזו כשגיאה שניתן לשחזר. כן AVAILABILITY_CHANGED הסכום המבוקש עבור הפריטים או כל אחת מהאפשרויות אינו זמין. כן REQUIREMENTS_NOT_MET לא הגעת לערך המינימלי או המקסימלי להזמנה. כדי לקבוע זאת, אפשר לבדוק אם מחיר עגלת הקניות נמוך מהעמלה. eligibleTransactionVolumeMin
או גבוה מהעמלה.eligibleTransactionVolumeMax
. אפשר לעיין בדוגמה במאמר אימות של ערך הזמנה מינימלי.לא החזרת הרשימה המאומתת של פריטים עם LineItemType
REGULAR
. הסכום של כל מחירי הפריטים בעגלת הקניות הוא מחיר עגלת הקניות אוSUBTOTAL
ראו דוגמאות בקטע אימות של פריטים בעגלת הקניות.
חישוב עמלות השירות
- מחפשים את ישות העמלה הנכונה של השירות לפי
eligibleRegion
,validFrom
,validThrough
וגםpriority
. - מחשבים את סכום העמלה לפי אם הישות הוגדרה עם
price
, נכסpercentageOfCart
אוpricePerMeter
. - החזרת עמלת השירות של משלוח או איסוף עצמי בתור LineItem עם
LineItemType
DELIVERY
אוFEE
בהתאמה. הוספת העמלה לרשימה עגלת הקניות.otherItems
.
החלת מבצעים
- מחפשים את הישות Deal לפי
המבצע.
coupon
עם המבצע.dealCode
. מאמתים את המבצע ומחזירים את ערך FoodOrderError במידת הצורך. ניתן להתייחס לשגיאות האלה כשגיאות שניתן לשחזר. להחזיר את סוגי השגיאות הבאים במקרה הצורך:
סוג השגיאה תרחיש לדוגמה PROMO_NOT_RECOGNIZED קוד השובר לא זוהה. PROMO_EXPIRED תוקף העסקה פג. PROMO_ORDER_INELIGIBLE ההזמנה לא זכאית לקבל את השובר. PROMO_NOT_APPLICABLE כל סיבה אחרת. מחשבים את סכום מחיר העסקה לפי Deal.
discount
או מבצע.discountPercentage
.מציינים את סכום מחיר המבצע על סמך הסכום הכולל של עגלת הקניות או העמלה, בהתאם מבצע.
dealType
.החזרת עגלת הקניות.
promotions
עם המבצע שהוחל.החזרת המבצע בתור LineItem עם LineItemType
DISCOUNT
. מוסיפים את ההנחה עגלת קניות.otherItems
עם מחיר שלילי.
החזרת התשובה
- יוצרים את ProposedOrder.
cart
, עגלת התגובות היא זהה לעגלת הקניות אם לא אירעו שגיאות במהלך האימות. - מחזירה את הרשימה ProposedOrder.
otherItems
כולל את מס, עמלות, תשואה והנחה אם רלוונטי. ראו תפוקה עבור פרטים נוספים על ההגדרה של פריט התשר. - כוללים את ProposedOrder.
totalPrice
על ידי הוספת עגלת הקניות מחיר, עמלות, הנחה, מיסים ותשר. - להחזיר את
FoodOrderExtension.
availableFulfillmentOptions
עם את FulfillmentOption המתאים. עדכון הערכים המשוערים עד למועד המסירה המשוער או עד למועד המסירה המשוער. - אם יש שגיאות FoodOrderError שנוצרו מבדיקות האימות הקודמות:
- כוללים את StructuredResponse.
error
ואת הרשימה של שגיאות ב-FoodErrorExtension.foodOrderErrors
. - מחזירים את ProposedOrder
שדה
correctedProposedOrder
אם אפשר לשחזר את כל השגיאות. - החזרת PaymentOptions ב-
paymentOptions
בשדה הזה אם אפשר לשחזר את כל השגיאות. - אופציונלי: אפשר לכלול את
additionalPaymentOptions
אם יש עוד אפשרויות התשלום הזמינות וכל השגיאות ניתנות לתיקון.
- כוללים את StructuredResponse.
- אם אין שגיאות אימות, מוחזר
proposedOrder
,paymentOptions
באובייקט CheckoutResponse. אופציונלי: אפשר לכלול אתadditionalPaymentOptions
אם יש עוד אפשרויות התשלום הזמינות.