ระบบจะเรียกใช้กระบวนการชำระเงินเมื่อผู้ใช้สร้างรถเข็น เนื้อหาในรถเข็นของผู้ใช้และรายละเอียดเกี่ยวกับคำสั่งซื้อจะส่งไปยังบริการเว็บสำหรับการสั่งซื้อจากต้นทางถึงปลายทาง ข้อมูลนี้ได้รับการตรวจสอบโดยบริการเว็บของคุณ จากนั้นคุณจะดำเนินการต่อหรือปรับเปลี่ยนรถเข็นได้ตามต้องการ
เครื่องจัดการการชำระเงินสำหรับบริการบนเว็บต้องตอบสนองต่อคำขอ POST เมื่อลูกค้าเลือกชำระเงิน Google จะส่งเนื้อหาคำขอ JSON ในรูปแบบ CheckoutRequestMessage
ซึ่งประกอบด้วยรายละเอียด Cart
ของลูกค้าไปยังบริการเว็บสั่งซื้อจากต้นทางถึงปลายทาง จากนั้นบริการเว็บจะตอบกลับด้วย CheckoutResponseMessage
แผนภาพต่อไปนี้จะแสดงกระบวนการ
เมื่อได้รับคำขอชำระเงิน บริการบนเว็บสำหรับการสั่งซื้อจากต้นทางถึงปลายทางจะต้องทำดังนี้
- ตรวจสอบความถูกต้องของรถเข็นตามราคาสินค้าปัจจุบัน ความพร้อมจำหน่ายสินค้า และบริการของผู้ให้บริการ
- คำนวณราคารวม (รวมถึงส่วนลด ภาษี และค่าธรรมเนียมการนำส่ง)
- หากสำเร็จ ให้ตอบกลับด้วยรถเข็นที่ไม่มีการแก้ไข
- หากไม่สำเร็จ ให้ตอบกลับด้วยข้อความแสดงข้อผิดพลาดและคำสั่งซื้อใหม่ที่เสนอ
ก่อนที่จะเริ่มใช้การชำระเงิน เราขอแนะนำให้อ่านเอกสารภาพรวมการดำเนินการ
ข้อความคำขอการชำระเงิน
เพื่อตรวจสอบรถเข็นของลูกค้า เมื่อลูกค้าเลือกที่จะชำระเงิน
Google จะส่งคำขอไปยังบริการบนเว็บของคุณพร้อมเนื้อหา JSON ในรูปแบบ CheckoutRequestMessage
ระบบจะไม่ส่งคำสั่งซื้อของลูกค้าจนกว่าจะถึงช่วงท้ายของขั้นตอนการสั่งซื้อจากต้นทางถึงปลายทาง
ข้อมูลที่อยู่ใน CheckoutRequestMessage
ประกอบด้วยข้อมูลต่อไปนี้
- Intent: ช่อง
inputs[0].intent
ของเนื้อความคำขอชำระเงินทุกช่องมีค่าสตริงactions.foodordering.intent.CHECKOUT
- รถเข็น: ช่อง
inputs[0].arguments[0].extension
ของคำขอชำระเงินมีออบเจ็กต์Cart
ที่แสดงถึงรถเข็นของลูกค้า - การนำส่งหรือการถ่ายโอน: ช่องส่วนขยายของออบเจ็กต์
Cart
มีออบเจ็กต์FoodCartExtension
ที่ระบุพร็อพเพอร์ตี้สำหรับการนำส่งหรือการถ่ายโอน ดังนี้- สำหรับคำสั่งซื้อแบบนำส่ง ออบเจ็กต์
FoodCartExtension
จะมีที่อยู่สำหรับจัดส่ง - สำหรับคำสั่งซื้อแบบไปรับเองหรือสั่งกลับบ้าน ออบเจ็กต์
FoodCartExtension
จะไม่มีข้อมูลตำแหน่ง
- สำหรับคำสั่งซื้อแบบนำส่ง ออบเจ็กต์
- แซนด์บ็อกซ์: ช่อง
isInSandbox
ของคำขอชำระเงินจะมีค่าบูลีนที่ระบุว่าธุรกรรมใช้การชำระเงินแซนด์บ็อกซ์หรือไม่
ตัวอย่างคำขอชำระเงิน
ด้านล่างนี้เป็นตัวอย่างของ 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 Pay
คุณใช้ JSON ของตัวยึดตำแหน่งใน
CheckoutResponseMessage
ได้จนกว่าคุณจะพร้อมดำเนินการชำระเงิน - หากต้องการเพิ่มตัวเลือกการชำระเงินตัวยึดตำแหน่งใน
CheckoutResponseMessage
โปรดดูตัวอย่างด้านล่าง ซึ่งใช้ตัวอย่างเกตเวย์การชำระเงินสำหรับPaymentOptions
- โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าการประมวลผลการชำระเงินในหัวข้อตั้งค่า Google Pay
คุณใช้ 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."
}
]
}
}
}
]
}
}
}
การใช้งาน Checkout
คุณควรทําตามขั้นตอนต่อไปนี้เมื่อใช้การชําระเงิน
ตรวจสอบบริการ
แสดงผล FoodOrderError สำหรับสภาวะข้อผิดพลาดของบริการแรกที่พบ ข้อผิดพลาดเหล่านี้กู้คืนไม่ได้ ระบบจึงควรแสดงข้อผิดพลาดแรกที่พบ ดูคำอธิบายการจัดการข้อผิดพลาดสำหรับคำอธิบายข้อผิดพลาดที่กู้คืนได้
- อ่านพร็อพเพอร์ตี้ FulfillmentOptionInfo ในคำขอเพื่อดูว่าประเภท Fulfillment เป็นของ
delivery
หรือpickup
แสดงผลประเภทข้อผิดพลาดต่อไปนี้หากจำเป็น
ประเภทข้อผิดพลาด Use Case INVALID ประเภท Fulfillment ไม่ถูกต้อง NOT_FOUND ไม่พบประเภท Fulfillment ปิด - ไม่มีกรอบเวลาOperationHoursสำหรับคำสั่งซื้อ
- คำสั่งซื้อนี้เป็นคำสั่งซื้อโดยเร็วที่สุดและไม่มี ServiceHours โดยเร็วที่สุดสำหรับเวลาปัจจุบัน
- มีการปิดฉุกเฉินหรือบริการ
isDisabled
เป็นจริง
UNAVAILABLE_SLOT ไม่สามารถดำเนินการตามคำสั่งซื้อล่วงหน้าได้ NO_CAPACITY ขณะนี้ร้านอาหารมีผู้เข้าใช้บริการจำนวนมากและไม่รับคำสั่งซื้อ OUT_OF_SERVICE_AREA ไม่สามารถส่งคำสั่งซื้อไปยังที่อยู่ของผู้ใช้ ดูการตรวจสอบที่อยู่สำหรับจัดส่งสำหรับตัวอย่าง NO_COURIER_AVAILABLE นำส่งคำสั่งซื้อไม่ได้เนื่องจากพนักงานในการจัดส่งมีจำกัด
ตรวจสอบความถูกต้องและกำหนดราคารถเข็น
ค้นหารถเข็นแต่ละรายการ
lineItems
และตรวจสอบด้วยข้อมูลปัจจุบันในระบบของคุณหรือในระบบของผู้ขาย ค่า MenuItemOffer.sku
จากเอนทิตีฟีดจะรวมเป็น LineItem.offerId
สร้าง FoodOrderError ไว้สำหรับแต่ละรายการโฆษณา หากจำเป็น โดยให้สร้างข้อผิดพลาด สูงสุด 1 รายการสำหรับแต่ละรายการ แสดงผลประเภทข้อผิดพลาดต่อไปนี้หากจำเป็นประเภทข้อผิดพลาด Use Case กู้คืนได้ INVALID ข้อมูลสินค้าหรือข้อมูลตัวเลือกใดๆ ไม่ถูกต้อง ไม่ได้ 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
ใช้โปรโมชัน
- ค้นหาเอนทิตีดีลตามการจับคู่ค่าโปรโมชัน
coupon
ที่มีดีลdealCode
ตรวจสอบดีลและแสดงผล FoodOrderError หากจำเป็น ข้อผิดพลาดเหล่านี้จัดว่ากู้คืนได้ แสดงผลประเภทข้อผิดพลาดต่อไปนี้ หากจำเป็น
ประเภทข้อผิดพลาด Use Case PROMO_NOT_RECOGNIZED ไม่รู้จักรหัสคูปอง PROMO_EXPIRED ความถูกต้องของดีลหมดอายุแล้ว PROMO_ORDER_INELIGIBLE คำสั่งซื้อนี้ไม่มีสิทธิ์ใช้คูปอง PROMO_NOT_APPLICABLE เหตุผลอื่นๆ ใช้จำนวนราคาดีลโดยใช้ยอดรวมในรถเข็นหรือรวมค่าธรรมเนียมโดยขึ้นอยู่กับดีล
dealType
ส่งคืนรถเข็น
promotions
โดยใช้โปรโมชันที่ใช้แสดงโปรโมชันเป็น LineItem พร้อม LineItemType
DISCOUNT
เพิ่มส่วนลดลงในรายการรถเข็นotherItems
ด้วยราคาติดลบ
ตอบกลับ
- สร้าง ProposedOrder
cart
โดยรถเข็นการตอบกลับจะเหมือนกับรถเข็นคำขอหากไม่พบข้อผิดพลาดระหว่างการตรวจสอบ - แสดงรายการ ProposedOrder.
otherItems
ซึ่งรวมถึงภาษี ค่าธรรมเนียม ค่าตอบแทน และส่วนลด หากมี ดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีกำหนดค่ารายการให้ทิปได้ที่ค่าธรรมเนียม - ระบุ ProposedOrder
totalPrice
โดยใส่ราคาในรถเข็น ค่าธรรมเนียม ส่วนลด ภาษี และค่าธรรมเนียม - แสดงผล FoodOrderExtension.
availableFulfillmentOptions
พร้อม FulfillmentOption ที่เกี่ยวข้อง อัปเดตเวลารับสินค้าหรือเวลานำส่งโดยประมาณเป็นเวลาที่คาดไว้ - หากมี FoodOrderErrors ที่สร้างขึ้นจากการตรวจสอบความถูกต้องก่อนหน้านี้ ให้ทําดังนี้
- รวม StructuredResponse.
error
และรายการข้อผิดพลาดใน FoodErrorExtensionfoodOrderErrors
- แสดงผล ProposedOrder ในช่อง
correctedProposedOrder
หากสามารถแก้ไขข้อผิดพลาดทั้งหมดได้ - แสดง PaymentOptions ในช่อง
paymentOptions
หากสามารถแก้ไขข้อผิดพลาดทั้งหมดได้ - (ไม่บังคับ) ใส่
additionalPaymentOptions
ด้วยหากมีตัวเลือกการชำระเงินอื่นๆ ที่ใช้ได้และแก้ไขข้อผิดพลาดทั้งหมดได้
- รวม StructuredResponse.
- หากไม่มีข้อผิดพลาดในการตรวจสอบความถูกต้อง ให้แสดง
proposedOrder
,paymentOptions
ในออบเจ็กต์ CheckoutResponse หรือใส่additionalPaymentOptions
ก็ได้หากมีตัวเลือกการชำระเงินอื่นๆ ที่ใช้ได้