הגדרת Checkout

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

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

CheckoutCheckoutMessage מחזירה את עגלת הקניות שלא שונתה על ידי הלקוח או שגיאה.

כשתקבלו בקשה לתשלום, שירות האינטרנט של Order with Google חייב לבצע את הפעולות הבאות:

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

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

הודעת בקשה לתשלום בקופה

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

הנתונים הכלולים ב-CheckoutRequestMessage כוללים:

  • Intent: השדה 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
}

הודעת תגובה לתשלום בקופה

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

הבקשה בטיפול

אם הבקשה לתשלום תתבצע בהצלחה, CheckoutResponseMessage צריך לכלול את ProposedOrder ואת PaymentOptions:

  • ProposedOrder

    • cart: אובייקט cart זהה לעגלה שסופקה ב-CheckoutRequestMessage. אם צריך לשנות את התוכן של עגלת הקניות, הערך של CheckoutResponseMessage צריך לכלול את השדה FoodErrorExtension עם הערך ProposedOrder המתוקן.
    • otherItems: פריטים שנוספו על ידי הספק, למשל חיובי משלוח, מיסים ועמלות אחרות. עשוי להכיל גם תיאור מקום שנוסף על ידי המשתמש.
    • totalPrice: המחיר הכולל של ההזמנה.
    • extension: המאפיין FoodOrderExtension שמגדיר פרטי מילוי הזמנה, כמו זמן אספקה.
  • PaymentOptions

    • מידע על הגדרת עיבוד התשלומים מופיע בהמשך בקטע הגדרת Google Pay. אתם יכולים להשתמש ב-placeholder של JSON ב-CheckoutResponseMessage עד שתהיו מוכנים להטמיע את עיבוד התשלומים.
    • כדי להוסיף אפשרויות placeholder לתשלום ב-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."
                }
              ]
            }
          }
        }
      ]
    }
  }
}