จะมีการเรียกใช้กระบวนการชำระเงินเมื่อผู้ใช้สร้างรถเข็น เนื้อหาของ รถเข็นของผู้ใช้และรายละเอียดเกี่ยวกับคำสั่งซื้อจะถูกส่งไปยังเว็บการสั่งซื้อแบบครบวงจร service. ข้อมูลนี้ได้รับการตรวจสอบโดยบริการบนเว็บของคุณ จากนั้นคุณจะสามารถ ดำเนินการหรือปรับค่าใช้จ่ายในรถเข็นได้ตามต้องการ
เครื่องจัดการการชำระเงินสำหรับบริการเว็บของคุณต้องตอบสนองต่อคำขอ 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
จะไม่แสดง มีข้อมูลตำแหน่งใดๆ ก็ตาม
- สำหรับคำสั่งซื้อแบบจัดส่ง ออบเจ็กต์
- แซนด์บ็อกซ์: ช่อง
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
ชำระเงิน
คุณจะใช้ JSON แบบตัวยึดตำแหน่งใน
CheckoutResponseMessage
ได้จนกว่าคุณจะ พร้อมที่จะใช้การประมวลผลการชำระเงินแล้ว - วิธีเพิ่มตัวเลือกการชำระเงินตัวยึดตำแหน่งใน
CheckoutResponseMessage
โปรดดูตัวอย่างด้านล่าง ซึ่งใช้ ตัวอย่างเกตเวย์การชำระเงินสำหรับPaymentOptions
- การตั้งค่าการประมวลผลการชำระเงินครอบคลุมภายหลังในตั้งค่า Google
ชำระเงิน
คุณจะใช้ 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."
}
]
}
}
}
]
}
}
}
การใช้งานการชำระเงิน
คุณควรทำตามขั้นตอนต่อไปนี้เมื่อใช้การชำระเงิน
ตรวจสอบบริการ
แสดงผล FoodOrderError สำหรับเงื่อนไขข้อผิดพลาดของบริการครั้งแรก พบ ข้อผิดพลาดเหล่านี้ไม่สามารถกู้คืนได้ ดังนั้นข้อผิดพลาดแรกที่พบควรเป็น ส่งคืนแล้ว ดูการจัดการข้อผิดพลาดสำหรับคำอธิบายเกี่ยวกับ ที่กู้คืนได้
- อ่านพร็อพเพอร์ตี้ FulfillmentOptionInfo ใน
คำขอเพื่อระบุว่าประเภทการดำเนินการมีไว้สำหรับ
delivery
หรือpickup
แสดงผลประเภทข้อผิดพลาดต่อไปนี้หากจำเป็น
ประเภทข้อผิดพลาด กรณีการใช้งาน ไม่ถูกต้อง ประเภทการจำหน่ายไม่ถูกต้อง NOT_FOUND ไม่พบประเภทการดำเนินการตามคำสั่งซื้อ ปิดแล้ว - ไม่มีกรอบเวลา OperationHours สำหรับคำสั่งซื้อนี้
- คำสั่งซื้อดังกล่าวเป็นคำสั่งซื้อแบบโดยเร็วที่สุดและไม่มี ASAP ServiceHours ที่พร้อมใช้งานในขณะนี้
- มีการปิดฉุกเฉินหรือบริการ
isDisabled
เป็นจริง
UNAVAILABLE_SLOT ดำเนินการตามคำสั่งซื้อล่วงหน้าไม่ได้ NO_CAPACITY ร้านอาหารไม่ว่างในขณะนี้และไม่มีการรับคำสั่งซื้อ OUT_OF_SERVICE_AREA นำส่งคำสั่งซื้อไปยังที่อยู่ของผู้ใช้ไม่ได้ ดูตัวอย่างการตรวจสอบที่อยู่สำหรับจัดส่ง NO_COURIER_AVAILABLE ไม่สามารถนำส่งคำสั่งซื้อได้เนื่องจากเจ้าหน้าที่จัดส่งมีจำนวนจำกัด
ตรวจสอบความถูกต้องและกำหนดราคารถเข็น
ค้นหารถเข็นช็อปปิ้งแต่ละรายการ
lineItems
และตรวจสอบด้วยข้อมูลปัจจุบันใน หรือในระบบของผู้ขาย รวมค่า MenuItemOffer.sku
จากเอนทิตีฟีดแล้ว เป็นLineItemofferId
สร้าง FoodOrderError สำหรับสินค้าแต่ละรายการหากจำเป็น สร้าง ข้อผิดพลาดสูงสุด 1 รายการสำหรับแต่ละรายการ แสดงผลประเภทข้อผิดพลาดต่อไปนี้หาก ต้องการ:ประเภทข้อผิดพลาด กรณีการใช้งาน กู้คืนได้ ไม่ถูกต้อง ข้อมูลสินค้าหรือข้อมูลตัวเลือกไม่ถูกต้อง ไม่ได้ 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
ตามลำดับ เพิ่มค่าธรรมเนียม ไว้ในรายการ Cart.otherItems
ใช้โปรโมชัน
- ค้นหาเอนทิตีดีลตามการจับคู่
ค่าโปรโมชัน
coupon
จากดีลdealCode
ตรวจสอบดีลและแสดงผล FoodOrderError หากจำเป็น โดยข้อผิดพลาดเหล่านี้จะถือว่ากู้คืนได้ แสดงผลประเภทข้อผิดพลาดต่อไปนี้ หากจำเป็น
ประเภทข้อผิดพลาด กรณีการใช้งาน PROMO_NOT_RECOGNIZED ไม่รู้จักรหัสคูปอง PROMO_EXPIRED ข้อตกลงหมดอายุ PROMO_ORDER_INELIGIBLE คำสั่งซื้อนี้ไม่มีสิทธิ์ใช้คูปอง PROMO_NOT_APPLICABLE เหตุผลอื่นๆ คำนวณจำนวนเงินของราคาดีลตามดีล
discount
หรือ ดีลdiscountPercentage
ใช้จำนวนเงินราคาดีลโดยใช้ยอดรวมของรถเข็นหรือยอดรวมค่าธรรมเนียมโดยขึ้นอยู่กับ ดีล
dealType
ส่งคืนรถเข็น
promotions
ที่มีโปรโมชันที่ใช้แสดงโปรโมชันเป็นLineItemที่มี LineItemType
DISCOUNT
เพิ่มส่วนลดไปยัง รายการ Cart.otherItems
ที่มีราคาเป็นลบ
ส่งคืนคำตอบ
- สร้าง ProposedOrder.
cart
รถเข็นการตอบกลับคือ เหมือนกับรถเข็นหากไม่พบข้อผิดพลาดระหว่างการตรวจสอบ - แสดงรายการ ProposedOrder.
otherItems
ซึ่งประกอบด้วย ภาษี ค่าธรรมเนียม ทิปส์ และส่วนลด หากมี ดูค่าตอบแทนสำหรับ รายละเอียดเพิ่มเติมเกี่ยวกับวิธีกำหนดค่ารายการให้ทิป - ระบุ ProposedOrder.
totalPrice
ด้วยการเพิ่มรถเข็น ราคา ค่าธรรมเนียม ส่วนลด ภาษี และค่าตอบแทนพิเศษ - ส่งคืน
FoodOrderExtension.
availableFulfillmentOptions
พร้อม FulfillmentOption ที่เกี่ยวข้อง อัปเดตค่าประมาณ เวลารับสินค้าหรือการนำส่งเป็นเวลาที่คาดไว้ - หากมี FoodOrderErrors จากการตรวจสอบความถูกต้องก่อนหน้านี้ ให้ดำเนินการดังนี้
- รวม StructuredResponse.
error
และรายการ ใน FoodErrorExtensionfoodOrderErrors
- แสดงผล ProposedOrder ใน
correctedProposedOrder
หากข้อผิดพลาดทั้งหมดกู้คืนได้ - แสดง PaymentOptions ใน
paymentOptions
หากข้อผิดพลาดทั้งหมดสามารถกู้คืนได้ - (ไม่บังคับ) ใส่
additionalPaymentOptions
หากมี ตัวเลือกการชำระเงินที่ใช้ได้ และข้อผิดพลาดทั้งหมดสามารถเรียกคืนได้
- รวม StructuredResponse.
- หากไม่มีข้อผิดพลาดในการตรวจสอบ ให้แสดง
proposedOrder
paymentOptions
ในออบเจ็กต์ CheckoutResponse (ไม่บังคับ) ใส่additionalPaymentOptions
หากมี ตัวเลือกการชำระเงินที่มีให้บริการ