หลังจากการโทรที่จุดชำระเงิน ผู้ใช้จะตรวจสอบรถเข็นที่อัปเดตพร้อมภาษี ค่าธรรมเนียมการนำส่ง ส่วนลด และค่าใช้จ่ายอื่นๆ ที่คุณส่งคืน ผู้ใช้ยืนยันและส่งคำสั่งซื้อ และ Google จะส่งคำขอ JSON ที่มีข้อมูลสำหรับคำสั่งซื้อของคุณให้กับปลายทาง Fulfillment บริการบนเว็บของคุณต้องได้รับคำสั่งซื้อนี้ ประมวลผลคำสั่งซื้อ และตอบกลับ Google พร้อมสถานะของคำสั่งซื้อ
ส่วนนี้จะอธิบายรูปแบบข้อความคำขอสั่งซื้อที่ Google ส่ง ซึ่งเรียกว่า SubmitOrderRequestMessage
และรูปแบบของข้อความตอบกลับที่คุณต้องระบุ ซึ่งเรียกว่า SubmitOrderResponseMessage
ดูข้อมูลเพิ่มเติมเกี่ยวกับวงจรการดำเนินการตามคำสั่งซื้อได้ที่ภาพรวมของการดำเนินการตามคำสั่งซื้อ
การใช้การดำเนินการตามคำสั่งซื้อ
บริการเว็บการสั่งซื้อจากต้นทางถึงปลายทางที่คุณสร้างขึ้นเพื่อทำงานร่วมกับการสั่งซื้อจากต้นทางถึงปลายทาง ต้องมีปลายทาง URL สำหรับรับข้อความการสั่งซื้อจาก Google สำหรับการประมวลผลคำสั่งซื้อ บริการบนเว็บจะได้รับ SubmitOrderRequestMessage
ในรูปแบบ JSON เป็นคำขอ POST จาก Google คำขอนี้มีคำสั่งซื้อของลูกค้า รวมถึงภาษี ค่าธรรมเนียม และข้อมูลการชำระเงิน เมื่อได้รับคำขอให้ส่ง
บริการผ่านเว็บของคุณต้องดำเนินการดังนี้
- ตรวจสอบการมีสิทธิ์ทำธุรกรรม เช่น การยืนยันบัตรหรือการตรวจจับการฉ้อโกง
- สร้างคำสั่งซื้อในระบบ
- ให้สิทธิ์วิธีการชำระเงินและเรียกใช้ API การเรียกเก็บเงินของผู้ประมวลผลการชำระเงิน (หากมี)
- ตอบกลับด้วยสถานะที่เหมาะสมของคำสั่งซื้อ:
CREATED
,CONFIRMED
หรือREJECTED
หลังจากประมวลผลคำสั่งซื้อแล้ว โค้ด Fulfillment ของคุณจะต้องส่งการตอบกลับในรูปแบบข้อความ JSON ของ SubmitOrderResponseMessage
กลับไปยัง Google
ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อกำหนดในการติดตั้งใช้งานบริการเว็บสำหรับดำเนินการตามคำสั่งซื้อแบบต้นทางถึงปลายทางได้ที่ภาพรวมของการดำเนินการตามคำสั่งซื้อ
ข้อความคำขอการสั่งซื้อ
เมื่อลูกค้าเลือกสั่งซื้อระหว่างขั้นตอนการสั่งซื้อจากต้นทางถึงปลายทาง Google จะส่งคำขอไปยังบริการบนเว็บของคุณด้วยข้อความ JSON ที่เรียกว่า SubmitOrderRequestMessage
ซึ่งประกอบด้วยข้อมูลต่อไปนี้
- Intent: ช่อง
inputs[0].intent
ของเนื้อหาคำขอสั่งซื้อที่ส่งทุกรายการมีค่าสตริงactions.intent.TRANSACTION_DECISION
- คำสั่งซื้อ: ช่อง
inputs[0].arguments[0].transactionDecisionValue
ของคำขอส่งคำสั่งซื้อมีออบเจ็กต์Order
ที่แสดงคำสั่งซื้อของลูกค้าและรายละเอียดการชำระเงิน - แฟล็กแซนด์บ็อกซ์: ช่อง
isInSandbox
ของคำขอส่งคำสั่งซื้อจะระบุว่าธุรกรรมดังกล่าวใช้การชำระเงินด้วยแซนด์บ็อกซ์หรือไม่
ตัวอย่างคำขอสั่งซื้อ
ต่อไปนี้เป็นตัวอย่าง SubmitOrderRequestMessage
:
JSON
{ "user": {}, "conversation": { "conversationId": "CTKbKfUlHCyDEdcz_5PBJTtf" }, "inputs": [ { "intent": "actions.intent.TRANSACTION_DECISION", "arguments": [ { "transactionDecisionValue": { "order": { "finalOrder": { "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" ] } }, "contact": { "displayName": "Hab Sy", "email": "hab9878.sy@gmail.com", "phoneNumber": "+61000000000", "firstName": "Hab", "lastName": "Sy" } } }, "otherItems": [ { "name": "Delivery fee", "type": "DELIVERY", "price": { "type": "ESTIMATE", "amount": { "currencyCode": "AUD", "units": "3", "nanos": 500000000 } } }, { "name": "Subtotal", "type": "SUBTOTAL", "price": { "type": "ESTIMATE", "amount": { "currencyCode": "AUD", "units": "39", "nanos": 600000000 } } } ], "totalPrice": { "type": "ESTIMATE", "amount": { "currencyCode": "AUD", "units": "43", "nanos": 100000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension" } }, "googleOrderId": "01412971004192156198", "orderDate": "2020-10-22T09:02:06.173Z", "paymentInfo": { "displayName": "Pay when you get your food", "paymentType": "ON_FULFILLMENT" } } } } ] } ], "directActionOnly": true, "isInSandbox": true }
ข้อความตอบกลับคำสั่งซื้อ
หลังจากได้รับคำขอ บริการเว็บที่ให้บริการสั่งซื้อจากต้นทางถึงปลายทางจะดำเนินการตามคำขอและส่ง SubmitOrderResponseMessage
ที่มีข้อมูลต่อไปนี้กลับมา
OrderUpdate
: ออบเจ็กต์สถานะของคำสั่งซื้อและการดำเนินการหลังการสั่งซื้อที่ผู้ใช้จะใช้ได้ เช่น การติดต่อฝ่ายสนับสนุนและการดูรายละเอียดคำสั่งซื้อซึ่งคุณกำหนดไว้ในช่องfinalResponse.richResponse.items[0].structuredResponse.orderUpdate
ของคำตอบ
ช่องอัปเดตคำสั่งซื้อ
เมื่อบริการเว็บของคุณส่ง SubmitOrderResponseMessage
บริการนั้นจะมีช่อง OrderUpdate
ที่ประกอบด้วยช่องต่อไปนี้
actionOrderId
: รหัสที่ไม่ซ้ำกันของคำสั่งซื้อ ซึ่งใช้เพื่อระบุคำสั่งซื้อในระบบได้อย่างไม่ซ้ำกันและใช้เพื่ออ้างอิงเมื่อส่งการอัปเดตคำสั่งซื้อครั้งต่อๆ ไปorderState
: ออบเจ็กต์OrderState
ที่แสดงสถานะของคำสั่งซื้อorderManagementActions
: การดำเนินการหลังการสั่งซื้อที่ทำได้สำหรับผู้ใช้ เช่น การติดต่อฝ่ายสนับสนุนลูกค้าและการดูรายละเอียดคำสั่งซื้อtotalPrice
: ราคารวมของคำสั่งซื้อ ขั้นตอนนี้ไม่บังคับ ให้ส่งเฉพาะในกรณีที่ราคารวมของคำสั่งซื้อมีการเปลี่ยนแปลงหลังจากที่ส่งคำสั่งซื้อ
คำสั่งซื้ออาจอยู่ในสถานะใดสถานะหนึ่งต่อไปนี้
CREATED
: ปลายทางการดำเนินการตามคำสั่งซื้อประมวลผลคำสั่งซื้อเรียบร้อยแล้ว แต่ผู้ให้บริการยังไม่ได้ยืนยันคำสั่งซื้อCONFIRMED
: ปลายทางการดำเนินการตามคำสั่งซื้อประมวลผลคำสั่งซื้อเรียบร้อยแล้ว และผู้ให้บริการได้ยืนยันคำสั่งซื้อแล้วREJECTED
: มีปัญหาและปลายทางการดำเนินการตามคำสั่งซื้อสร้างหรือยืนยันคำสั่งซื้อไม่ได้ ซึ่งอาจรวมถึงปัญหาเกี่ยวกับการชำระเงิน
หากตั้งค่าคำสั่งซื้อเป็นสถานะ REJECTED
ให้ระบุเหตุผลในช่อง rejectionInfo
ของ OrderUpdate
ใช้ค่า FoodOrderUpdateExtension.FoodOrderErrors
ร่วมกับ rejectionInfo
ประเภท UNKNOWN
และใส่คำอธิบาย
ตัวอย่างการตอบกลับคำสั่งซื้อ
ต่อไปนี้เป็นตัวอย่าง SubmitOrderResponseMessage
:
JSON
{ "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "orderUpdate": { "actionOrderId": "1603357328160", "orderState": { "state": "CONFIRMED", "label": "Pending" }, "updateTime": "2020-10-22T02:02:08-07:00", "orderManagementActions": [ { "type": "CUSTOMER_SERVICE", "button": { "title": "Call customer service", "openUrlAction": { "url": "tel:+61234561000" } } }, { "type": "VIEW_DETAILS", "button": { "title": "View order details", "openUrlAction": { "url": "https://partner.com/view/orderstatus" } } } ], "receipt": { "userVisibleOrderId": "BXZ-1603357328" } } } } ] } } }
คำขอไม่สำเร็จ
หากส่งคำขอไม่สำเร็จ SubmitOrderResponseMessage
ต้องตั้งค่า OrderState.state
เป็น REJECTED
การตอบกลับต้องมี RejectionInfo ซึ่งมีออบเจ็กต์ RejectionType
เพื่ออธิบายประเภทข้อผิดพลาด
ตัวอย่างการตอบกลับที่ไม่สำเร็จ
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "REJECTED", "label": "Order rejected" }, "updateTime": "2017-05-10T02:30:00.000Z", "rejectionInfo": { "type": "PAYMENT_DECLINED", "reason": "Insufficient funds" }, "orderManagementActions": [ { "type": "CUSTOMER_SERVICE", "button": { "title": "Contact customer service", "openUrlAction": { "url": "mailto:support@example.com" } } }, { "type": "EMAIL", "button": { "title": "Email restaurant", "openUrlAction": { "url": "mailto:person@example.com" } } }, { "type": "CALL", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "VIEW_DETAILS", "button": { "title": "View order", "openUrlAction": { "url": "https://orderview.partner.com?orderid=sample_action_order_id" } } } ] } } } ] } } }
ส่งการใช้งานคำสั่งซื้อ
คุณควรทําตามขั้นตอนต่อไปนี้เมื่อใช้ Send order API
การตรวจสอบความถูกต้อง
- ตรวจสอบบริการ รถเข็น และโปรโมชันเช่นเดียวกับที่ทำในตั้งค่าจุดชำระเงิน
- แสดง RejectionInfo ด้วยหนึ่งในประเภทต่อไปนี้หากจำเป็น
RejectionInfoType | Use Case |
---|---|
UNAVAILABLE_SLOT |
เวลาดำเนินการตามคำสั่งซื้อใช้ไม่ได้แล้ว |
PROMO_USER_INELIGIBLE |
ใช้อีเมลในออบเจ็กต์รายชื่อติดต่อในคำขอเพื่อตรวจสอบการมีสิทธิ์ในโปรโมชันสำหรับผู้ใช้ ดูตัวอย่างในใช้งานคำสั่งซื้อการส่งที่มีโปรโมชัน |
INELIGIBLE |
|
PAYMENT_DECLINED |
ประมวลผลการชำระเงินไม่ได้ เช่น อาจเป็นเพราะเงินไม่เพียงพอ |
UNKNOWN |
สำหรับข้อผิดพลาดในการตรวจสอบอื่นๆ |
ตั้งค่า OrderState.state
เป็น REJECTED
หากพบข้อผิดพลาดในการตรวจสอบ หรือคุณจะระบุเหตุผลการปฏิเสธที่เจาะจงโดยใช้ FoodOrderUpdateExtensionfoodOrderErrors
ก็ได้ ดูตัวอย่างในส่งการตรวจสอบคำสั่งซื้อ
ประมวลผลการชำระเงิน
- คำนวณ
totalPrice
โดยเพิ่มราคาในรถเข็น ค่าธรรมเนียม ส่วนลด ภาษี และค่าธรรมเนียมtotalPrice
ควรตรงกับtotalPrice
ที่ส่งคืนใน CheckoutResponseMessage บวกกับการเปลี่ยนแปลงจำนวนเงินให้ทิป หากผู้ใช้แก้ไขทิปได้ ดูรายละเอียดเพิ่มเติมได้ที่การเปลี่ยนแปลงราคาระหว่างการส่งคำสั่งซื้อ - ประมวลผลคำสั่งซื้อและการชำระเงินหากคุณตอบกลับมาพร้อมสถานะคำสั่งซื้อ
CREATED
หรือCONFIRMED
- ตรวจสอบว่าระบบส่งกลับรูปแบบการตอบสนองที่ถูกต้องโดยใช้ประเภทที่สร้างขึ้นจากสคีมาตามที่อธิบายไว้ในการสร้างไลบรารีไคลเอ็นต์
- ใช้
GoogleProvidedPaymentInstrument.
instrumentToken
ในการประมวลผลการชำระเงิน แสดงผล RejectionInfo พร้อมประเภทPAYMENT_DECLINED
หากประมวลผลการชำระเงินไม่ได้ ดูรายละเอียดเพิ่มเติมได้ที่ดำเนินการชำระเงิน - แจ้งผู้ใช้ทันทีหลังจากที่มีการประมวลผลคำสั่งซื้อทางอีเมลและหรือ SMS
ตอบกลับ
- ตั้งค่า OrderState.
state
เป็นCREATED
หรือCONFIRMED
หากไม่มีข้อผิดพลาด - ตั้งค่า OrderState.
state
เป็นREJECTED
หากพบข้อผิดพลาดและรวมออบเจ็กต์ RejectionInfo ที่มี RejectionInfoType ที่เกี่ยวข้องไว้ด้วย - ตั้งค่า OrderUpdate
orderManagementActions