หลังจากการโทรเพื่อชำระเงินแล้ว ผู้ใช้จะตรวจสอบรถเข็นที่อัปเดตแล้วซึ่งมีภาษี ค่าธรรมเนียมการนำส่ง ส่วนลด และค่าธรรมเนียมอื่นๆ ที่คุณคืน ผู้ใช้ยืนยันและส่งคำสั่งซื้อ แล้ว Google จะส่งคำขอ JSON ที่มีข้อมูลคำสั่งซื้อไปยังปลายทางการดำเนินการตามคำสั่งซื้อของคุณ เว็บเซอร์วิสของคุณต้องได้รับคำสั่งซื้อนี้ ประมวลผล และตอบกลับ Google พร้อมสถานะคำสั่งซื้อ
ส่วนนี้จะอธิบายรูปแบบข้อความคำขอสั่งซื้อที่ Google ส่ง ซึ่งเรียกว่า SubmitOrderRequestMessage
และรูปแบบข้อความตอบกลับที่คุณต้องส่ง ซึ่งเรียกว่า SubmitOrderResponseMessage
ดูข้อมูลเพิ่มเติมเกี่ยวกับวงจรการสั่งซื้อได้ที่หัวข้อภาพรวมการจำหน่าย
การติดตั้งใช้งานการดำเนินการตามคำสั่งซื้อ
เว็บเซอร์วิสการสั่งซื้อแบบครบวงจรที่คุณสร้างเพื่อทํางานร่วมกับการสั่งซื้อแบบครบวงจรต้องมี URL ปลายทางสําหรับรับข้อความคําสั่งซื้อจาก Google สําหรับการประมวลผลคำสั่งซื้อ เว็บเซอร์วิสของคุณจะได้รับ SubmitOrderRequestMessage
ในรูปแบบ JSON เป็นคําขอ POST จาก Google คำขอนี้มีคำสั่งซื้อของลูกค้า รวมถึงภาษี ค่าธรรมเนียม และข้อมูลการชำระเงิน เมื่อได้รับคำขอส่งคำสั่งซื้อ เว็บเซอร์วิสของคุณต้องทำดังนี้
- ตรวจสอบสิทธิ์การทำธุรกรรม เช่น การยืนยันบัตรหรือการตรวจจับการประพฤติมิชอบ
- สร้างคำสั่งซื้อในระบบ
- ให้สิทธิ์วิธีการชำระเงินและเรียกใช้ Charge API ของผู้ประมวลผลการชำระเงินของคุณ (หากมี)
- ตอบกลับพร้อมสถานะคำสั่งซื้อที่เหมาะสม ซึ่งได้แก่
CREATED
,CONFIRMED
หรือREJECTED
หลังจากประมวลผลคำสั่งซื้อแล้ว รหัสการจำหน่ายของคุณต้องส่งการตอบกลับในรูปแบบข้อความ SubmitOrderResponseMessage
JSON กลับไปยัง Google
ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อกำหนดในการติดตั้งใช้งานเว็บเซอร์วิสการดำเนินการตามคำสั่งซื้อจากต้นทางถึงปลายทางได้ที่ภาพรวมการดำเนินการตามคำสั่งซื้อ
ข้อความคำขอสั่งซื้อ
เมื่อลูกค้าเลือกสั่งซื้อระหว่างขั้นตอนการสั่งซื้อจากต้นทางถึงปลายทาง
Google จะส่งคำขอไปยังเว็บเซอร์วิสของคุณพร้อมข้อความ JSON ที่เรียกว่า SubmitOrderRequestMessage
ซึ่งมีข้อมูลต่อไปนี้
- Intent: ช่อง
inputs[0].intent
ของเนื้อหาคําขอส่งคําสั่งซื้อทุกรายการมีสตริงค่าactions.intent.TRANSACTION_DECISION
- คำสั่งซื้อ: ฟิลด์
inputs[0].arguments[0].transactionDecisionValue
ของคำขอส่งคำสั่งซื้อประกอบด้วยออบเจ็กต์Order
ที่แสดงถึงคำสั่งซื้อของลูกค้าที่จะทำการสั่งซื้อ พร้อมกับรายละเอียดการชำระเงิน - Flag Sandbox: ช่อง
isInSandbox
ของคำขอส่งคำสั่งซื้อจะระบุว่าธุรกรรมใช้การชำระเงินใน Sandbox หรือไม่
ตัวอย่างคำขอสั่งซื้อ
ตัวอย่าง SubmitOrderRequestMessage
มีดังนี้
{ "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 }
ข้อความตอบกลับคำสั่งซื้อ
หลังจากได้รับคำขอแล้ว เว็บเซอร์วิสการสั่งซื้อแบบ End-to-End จะประมวลผลคำขอและส่ง 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
มีดังนี้
{ "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
เพื่ออธิบายประเภทข้อผิดพลาด
ตัวอย่างการตอบกลับที่ไม่สําเร็จ
{ "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" } } } ] } } } ] } } }
ส่งการใช้งานคําสั่งซื้อ
คุณควรทำตามขั้นตอนต่อไปนี้เมื่อติดตั้งใช้งาน Submit Order API
การตรวจสอบความถูกต้อง
- ตรวจสอบบริการ รถเข็น และโปรโมชันตามที่ระบุไว้ในตั้งค่าการชำระเงิน
- แสดงผล RejectionInfo ที่มีประเภทใดประเภทหนึ่งต่อไปนี้ หากจำเป็น
RejectionInfoType | กรณีการใช้งาน |
---|---|
UNAVAILABLE_SLOT |
เวลานำส่งใช้ไม่ได้อีกต่อไป |
PROMO_USER_INELIGIBLE |
ใช้อีเมลในออบเจ็กต์ Contact ในคำขอเพื่อตรวจสอบสิทธิ์รับโปรโมชันของผู้ใช้ ดูตัวอย่างในการใช้การส่งคำสั่งซื้อพร้อมโปรโมชัน |
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