תהליך התשלום מופעל כשמשתמש יוצר עגלה. תוכן עגלת הקניות של המשתמש ופרטים על ההזמנה נשלחים לשירות האינטרנט של Order with Google. המידע הזה אומת על ידי שירות האינטרנט שלכם, ואז תוכלו להמשיך או לבצע שינויים בעגלת הקניות לפי הצורך.
ה-handler של הקופה לשירות האינטרנט חייב להגיב לבקשות POST. כשלקוח בוחר לבצע את התשלום, Google שולחת לשירות האינטרנט של Order with Google גוף בקשה של JSON בפורמט CheckoutRequestMessage
, שכולל את פרטי ה-Cart
של הלקוח. לאחר מכן, שירות האינטרנט יגיב באמצעות CheckoutResponseMessage
. התרשים הבא מדגים את התהליך.
כשתקבלו בקשה לתשלום, שירות האינטרנט של 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
.
- מידע על הגדרת עיבוד התשלומים מופיע בהמשך בקטע הגדרת Google Pay.
אתם יכולים להשתמש ב-placeholder של JSON ב-
דוגמה לתגובה מוצלחת
{
"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."
}
]
}
}
}
]
}
}
}