הגדרת Google Checkout

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

ה-handler של דף התשלום לשירות האינטרנט שלכם חייב להגיב לבקשות POST. כאשר הלקוח בוחר לשלם, Google שולחת לשירות האינטרנט 'הזמנה' מקצה לקצה' גוף בקשת JSON בצורת CheckoutRequestMessage, שמכיל את הפונקציה פרטים על Cart של לקוח. לאחר מכן תקבלו תשובה משירות האינטרנט עם CheckoutResponseMessage התרשים הבא מדגים את התהליך.

ה-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.

דוגמה לתגובה מוצלחת

{
    "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 עבור התנאי הראשון של שגיאת שירות נמצא. לא ניתן לשחזר את השגיאות האלה, לכן אתם אמורים לראות את השגיאה הראשונה הוחזרו. אפשר למצוא תיאור של טיפול בשגיאות שגיאות הניתנות לשחזור.

  1. קראו את המאפיין FulfillmentOptionInfo בקובץ כדי לקבוע אם סוג האספקה הוא delivery או pickup.
  2. במקרה הצורך, מחזירים את סוגי השגיאות הבאים:

    סוג השגיאה תרחיש לדוגמה
    לא תקין סוג מילוי ההזמנות לא תקין.
    NOT_FOUND סוג האספקה לא נמצא.
    סגור
    • אין חלונות מסוג OperationHours להזמנה.
    • ההזמנה היא הזמנה בהקדם האפשרי ואין כרגע ServiceHours זמינים כרגע.
    • יש סגירה במקרה חירום או שהשירות isDisabled מוגדר כ-true.
    חשוב לדעת שחלונות מיוחדים מקבלים קדימות על פני חלונות רגילים. בקישורים הבאים אפשר למצוא דוגמאות לאימות חלון הזמנה ולהסרה של ישויות שירות באופן זמני.
    UNAVAILABLE_SLOT אי אפשר למלא את ההזמנה מראש.
    NO_CAPACITY המסעדה עמוסה ולא מקבלת הזמנות כרגע.
    OUT_OF_SERVICE_AREA לא ניתן לשלוח את ההזמנה לכתובת של המשתמש. לדוגמה, אפשר לעיין באימות כתובת למשלוח.
    NO_COURIER_AVAILABLE אי אפשר למסור את ההזמנה כי מספר העובדים מוגבל.

אימות ותמחרו של עגלת הקניות

  1. חיפוש כל עגלת קניות.lineItems ואימות באמצעות הנתונים הנוכחיים ב: במערכת או במערכת של המוכר. MenuItemOffer.sku ערך מישות הפיד נכלל בתור LineItem.offerId. לכתוב FoodOrderError בכל פריט, אם יש צורך. לכתוב שגיאה אחת לכל היותר לכל פריט. מחזירים את סוגי השגיאות הבאים אם נדרש:

    סוג השגיאה תרחיש לדוגמה ניתנת לשחזור
    לא תקין נתוני הפריט או אחד מנתוני האפשרויות לא תקינים. לא
    NOT_FOUND הפריט או אחת מהאפשרויות לא נמצאו. לא
    PRICE_CHANGED המחיר של פריט או שילוב של תוספים השתנה. ניתן להתייחס לשגיאה הזו כשגיאה שניתן לשחזר. כן
    AVAILABILITY_CHANGED הסכום המבוקש עבור הפריטים או כל אחת מהאפשרויות אינו זמין. כן
    REQUIREMENTS_NOT_MET לא הגעת לערך המינימלי או המקסימלי להזמנה. כדי לקבוע זאת, אפשר לבדוק אם מחיר עגלת הקניות נמוך מהעמלה.eligibleTransactionVolumeMin או גבוה מהעמלה.eligibleTransactionVolumeMax. אפשר לעיין בדוגמה במאמר אימות של ערך הזמנה מינימלי. לא
  2. החזרת הרשימה המאומתת של פריטים עם LineItemType REGULAR. הסכום של כל מחירי הפריטים בעגלת הקניות הוא מחיר עגלת הקניות או SUBTOTAL

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

חישוב עמלות השירות

  1. מחפשים את ישות העמלה הנכונה של השירות לפי eligibleRegion, validFrom, validThrough וגם priority.
  2. מחשבים את סכום העמלה לפי אם הישות הוגדרה עם price, נכס percentageOfCart או pricePerMeter.
  3. החזרת עמלת השירות של משלוח או איסוף עצמי בתור LineItem עם LineItemType DELIVERY או FEE בהתאמה. הוספת העמלה לרשימה עגלת הקניות.otherItems.

החלת מבצעים

  1. מחפשים את הישות Deal לפי המבצע.coupon עם המבצע.dealCode.
  2. מאמתים את המבצע ומחזירים את ערך FoodOrderError במידת הצורך. ניתן להתייחס לשגיאות האלה כשגיאות שניתן לשחזר. להחזיר את סוגי השגיאות הבאים במקרה הצורך:

    סוג השגיאה תרחיש לדוגמה
    PROMO_NOT_RECOGNIZED קוד השובר לא זוהה.
    PROMO_EXPIRED תוקף העסקה פג.
    PROMO_ORDER_INELIGIBLE ההזמנה לא זכאית לקבל את השובר.
    PROMO_NOT_APPLICABLE כל סיבה אחרת.
  3. מחשבים את סכום מחיר העסקה לפי Deal.discount או מבצע.discountPercentage.

  4. מציינים את סכום מחיר המבצע על סמך הסכום הכולל של עגלת הקניות או העמלה, בהתאם מבצע.dealType.

  5. החזרת עגלת הקניות.promotions עם המבצע שהוחל.

  6. החזרת המבצע בתור LineItem עם LineItemType DISCOUNT. מוסיפים את ההנחה עגלת קניות.otherItems עם מחיר שלילי.

החזרת התשובה

  1. יוצרים את ProposedOrder.cart, עגלת התגובות היא זהה לעגלת הקניות אם לא אירעו שגיאות במהלך האימות.
  2. מחזירה את הרשימה ProposedOrder.otherItems כולל את מס, עמלות, תשואה והנחה אם רלוונטי. ראו תפוקה עבור פרטים נוספים על ההגדרה של פריט התשר.
  3. כוללים את ProposedOrder.totalPrice על ידי הוספת עגלת הקניות מחיר, עמלות, הנחה, מיסים ותשר.
  4. להחזיר את FoodOrderExtension.availableFulfillmentOptions עם את FulfillmentOption המתאים. עדכון הערכים המשוערים עד למועד המסירה המשוער או עד למועד המסירה המשוער.
  5. אם יש שגיאות FoodOrderError שנוצרו מבדיקות האימות הקודמות:
    • כוללים את StructuredResponse.error ואת הרשימה של שגיאות ב-FoodErrorExtension.foodOrderErrors.
    • מחזירים את ProposedOrder שדה correctedProposedOrder אם אפשר לשחזר את כל השגיאות.
    • החזרת PaymentOptions ב-paymentOptions בשדה הזה אם אפשר לשחזר את כל השגיאות.
    • אופציונלי: אפשר לכלול את additionalPaymentOptions אם יש עוד אפשרויות התשלום הזמינות וכל השגיאות ניתנות לתיקון.
  6. אם אין שגיאות אימות, מוחזר proposedOrder, paymentOptions באובייקט CheckoutResponse. אופציונלי: אפשר לכלול את additionalPaymentOptions אם יש עוד אפשרויות התשלום הזמינות.