หลังจากลูกค้าส่งคำสั่งซื้ออาหารแล้ว คุณจะส่งข้อความอัปเดตคำสั่งซื้อไปที่ บริการสั่งซื้อแบบครบวงจรเพื่อแจ้งให้เราทราบถึงการเปลี่ยนแปลง
สาเหตุที่พบบ่อยบางประการสำหรับการส่งการอัปเดตคำสั่งซื้อมีดังนี้
- เวลาดำเนินการโดยประมาณสำหรับคำสั่งซื้อจะพร้อมใช้งานหรือมีการเปลี่ยนแปลง
- สถานะของคำสั่งซื้อมีการเปลี่ยนแปลง
- ไม่สามารถดำเนินการตามคำสั่งซื้อนี้ได้อีกต่อไป
- ราคาของรายการในเมนูที่รวมอยู่ในคำสั่งซื้อมีการเปลี่ยนแปลง
- ลูกค้ามีวิธีใหม่ในการจัดการคำสั่งซื้อ เช่น การสนับสนุนลูกค้า หรือหมายเลขโทรศัพท์ร้านอาหาร
- เห็นใบเสร็จของคำสั่งซื้อแล้ว
ส่วนถัดไปจะอธิบายรายละเอียดเกี่ยวกับวิธีจัดการกับสถานการณ์ต่างๆ เหล่านี้ โดยใช้การอัปเดตคำสั่งซื้อ
การเปลี่ยนแปลงสถานะคำสั่งซื้อ
คำสั่งซื้อมีสถานะที่เป็นไปได้ 6 สถานะ รัฐเหล่านี้และการเปลี่ยนแปลงที่เป็นไปได้ แสดงอยู่ในแผนภาพต่อไปนี้
เมื่อลูกค้าส่งคำสั่งซื้อเป็นครั้งแรก คำสั่งซื้อจะเริ่มต้นด้วยสถานะ
CREATED
, CONFIRMED
หรือ REJECTED
คุณสามารถส่งข้อความอัปเดตคำสั่งซื้อไปยัง
อัปเดตสถานะของคำสั่งซื้อ ตราบใดที่การเปลี่ยนสถานะถูกต้อง CREATED
ระบบจะใช้สถานะนี้เมื่อแพลตฟอร์มของพาร์ทเนอร์ยืนยันหรือปฏิเสธคำสั่งซื้อไม่ได้
ทันที ตัวอย่างกรณีการใช้งาน เช่น เมื่อลูกค้าสั่งซื้อผ่านการนำส่ง
ผู้รวบรวมข้อมูล ผู้รวบรวมข้อมูลการนำส่งจะได้รับการนำส่งจาก Google และ
ผู้รวบรวมข้อมูลจะส่งข้อมูลไปยังร้านอาหาร เมื่อร้านอาหารได้รับ
และได้ยืนยันความพร้อมจำหน่ายของคำสั่งซื้อแล้ว ตอนนี้รัฐเป็น CONFIRMED
ได้ ไม่เช่นนั้น
REJECTED
คำสั่งซื้อในสถานะ CONFIRMED
จะย้ายไปที่สถานะ IN_PREPARATION
ถัดไป ให้ใช้สถานะ READY_FOR_PICKUP
หรือ IN_TRANSIT
โดยขึ้นอยู่กับว่าคำสั่งซื้อนั้นเป็นบริการแบบไปรับเองหรือจัดส่งถึงที่ เมื่อมีการจัดส่งหรือไปรับอาหารแล้ว ระบบจะตั้งค่าคำสั่งซื้อเป็นรัฐFULFILLED
หากคุณอนุญาตให้ลูกค้ายกเลิกคำสั่งซื้อ คุณจะใช้สถานะ CANCELLED
ได้ คุณยกเลิกคำสั่งซื้อได้ขณะอยู่ในสถานะ CREATED
, CONFIRMED
, IN_PREPARATION
, READY_FOR_PICKUP
หรือ IN_TRANSIT
บริการสั่งซื้อแบบครบวงจรควรออกเงินคืนโดยขึ้นอยู่กับ
นโยบายการยกเลิกและสถานะการชำระเงิน ณ เวลาที่ยกเลิก
บริการสั่งซื้อแบบครบวงจรไม่จำเป็นต้องรองรับทุกสถานะที่มีอยู่
และทรานซิชัน อย่างไรก็ตาม สถานะสุดท้ายของคำสั่งซื้อต้องเป็น FULFILLED
REJECTED
หรือ CANCELLED
การระบุเวลาดำเนินการตามคำสั่งซื้อโดยประมาณ
คุณระบุช่วงเวลาโดยประมาณที่จะสั่งซื้อแก่ผู้ใช้ได้
พร้อมสำหรับการรับสินค้า (หรือจัดส่ง) ใช้ช่อง estimatedFulfillmentTimeIso8601
เป็น FoodOrderUpdateExtension
เพื่อระบุช่วงเวลาโดยประมาณเมื่อ
คำสั่งซื้อของลูกค้าจะพร้อมสำหรับการรับสินค้าหรือจัดส่ง
ส่ง estimatedFulfillmentTimeIso8601
เวลาต่อไปนี้
- เมื่อมีเวลาโดยประมาณ ควรเรียงตามลำดับ
CREATED
หรือ รัฐCONFIRMED
- เมื่อเวลาโดยประมาณเปลี่ยนไป เช่น อัปเดตเวลาโดยประมาณเป็น
แม่นยำยิ่งขึ้นเมื่อคำสั่งซื้อคือ
IN_TRANSIT
ในการจัดการความคาดหวังของผู้ใช้อย่างมีประสิทธิภาพ โปรดประเมินตัวเลขอย่างระมัดระวังและ ระบุช่วงวันที่และเวลาแทนที่จะเป็นวันที่และเวลาคงที่ คุณควร พิจารณาในรูปแบบต่างๆ เช่น สภาพการจราจรเมื่อใดก็ตามที่ทำได้ สำหรับ เช่น คุณอาจส่งเวลาโดยประมาณที่ 12:45 น. (ขอบเขตล่าง) ถึง 13:15 น. (ด้านบน) แน่นอน) สำหรับคำสั่งซื้อที่เวลานำส่งโดยประมาณคือ 13:00 น.
ให้บริการการดำเนินการจัดการคำสั่งซื้อ
เมื่อส่งการอัปเดตคำสั่งซื้อ คุณสามารถให้แหล่งข้อมูลแก่ลูกค้าที่ให้ความช่วยเหลือ
ธุรกิจจะจัดการคำสั่งซื้อได้ในรูปแบบ OrderManagementAction
หลังจาก
ลูกค้าสั่งซื้อ โดยพวกเขาอาจต้องติดต่อคุณหรือร้านอาหาร
ดำเนินการตามคำสั่งซื้อเพื่อติดตามความคืบหน้า เปลี่ยนแปลง หรือยกเลิกคำสั่งซื้อ
OrderManagementAction
ช่วยให้ลูกค้าส่งอีเมล โทร หรือลิงก์ไปยัง
URL จากอุปกรณ์ของผู้ใช้โดยตรง ใช้ข้อมูลเดียวกันใน
OrderManagementAction
ตามการยืนยันคำสั่งซื้อทางอีเมลที่คุณส่งไปยัง
ผู้ใช้
การดำเนินการจัดการคำสั่งซื้อประกอบด้วยประเภทต่อไปนี้
CUSTOMER_SERVICE
: ให้ลูกค้าดำเนินการเพื่อติดต่อลูกค้า service. ต้องระบุประเภทการดำเนินการจัดการนี้สำหรับการอัปเดตคำสั่งซื้อEMAIL
: แจ้งลูกค้าให้ส่งอีเมลไปยัง อีเมลCALL
: แจ้งให้ลูกค้าโทรหาหมายเลขโทรศัพท์ที่ระบุไว้VIEW_DETAIL
: ให้ลูกค้าดำเนินการเพื่อดูรายละเอียด คำสั่งซื้อ
การอัปเดตคำสั่งซื้อแต่ละรายการต้องมีการดำเนินการจัดการคำสั่งซื้ออย่างน้อย 1 รายการ อย่างไรก็ตาม
การดำเนินการจัดการคำสั่งซื้อที่ให้ไว้อาจแตกต่างกันไปตามสถานะของคำสั่งซื้อ
เช่น เมื่อคำสั่งซื้ออยู่ในสถานะ CONFIRMED
ระบบจะกำหนดค่า CUSTOMER_SERVICE
การดำเนินการอาจนำไปสู่หมายเลขโทรศัพท์ฝ่ายบริการลูกค้า เมื่อคำสั่งซื้อดังกล่าวมีสถานะ
การอัปเดต IN_TRANSIT
การดำเนินการ CUSTOMER_SERVICE
สามารถชี้ไปยัง
หมายเลขโทรศัพท์ของร้านอาหารเพื่อดำเนินการตามคำสั่งซื้อ
กำลังส่งการอัปเดตคำสั่งซื้อ
คุณใช้ข้อความประเภท AsyncOrderUpdateRequestMessage
ในการส่งคำสั่งซื้อ
อัปเดตเป็นบริการสั่งซื้อแบบครบวงจร Google จะตอบกลับด้วย
AsyncOrderUpdateResponseMessage
เช่น ถ้าต้องการแจ้งข้อมูล
ว่าคำสั่งซื้อของลูกค้านั้นถูกต้องและได้รับการยอมรับแล้ว คุณสามารถส่ง
AsyncOrderUpdateRequestMessage
เพื่อเปลี่ยนสถานะของคำสั่งซื้อเป็น CONFIRMED
ที่มีป้ายกำกับว่า Accepted by restaurant
กำลังตั้งค่าข้อความอัปเดตคำสั่งซื้อ
เมื่อส่ง AsyncOrderUpdateRequestMessage
ไปยัง Google คุณต้องระบุสิ่งต่อไปนี้
ข้อมูลเกี่ยวกับสถานะของคำสั่งซื้อโดยใช้ฟิลด์ OrderUpdate
ตัวอย่างต่อไปนี้แสดงตัวอย่าง AsyncOrderUpdateRequestMessage
สำหรับ
สถานะการสั่งซื้อแต่ละสถานะ:
ยืนยันแล้ว
ตัวอย่างนี้แสดงตัวอย่างคำขออัปเดตคำสั่งซื้อที่แจ้งให้ผู้ใช้ทราบ คำสั่งซื้อได้รับการยืนยันด้วยใบเสร็จและการจัดส่งโดยประมาณ
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "CONFIRMED", "label": "Provider confirmed" }, "receipt": { "userVisibleOrderId": "userVisibleId1234" }, "updateTime": "2017-07-17T12:00:00Z", "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ], "infoExtension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension", "estimatedFulfillmentTimeIso8601": "2017-07-17T13:00:00Z/2017-07-17T13:30:00Z" } } } }
ถูกปฏิเสธ
ตัวอย่างนี้แสดงตัวอย่างคำขออัปเดตคำสั่งซื้อที่แจ้งให้ผู้ใช้ทราบ ว่าคำสั่งซื้อถูกปฏิเสธโดยมีเหตุผลการปฏิเสธ
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "REJECTED", "label": "Order rejected" }, "updateTime": "2017-05-10T02:30:00.000Z", "rejectionInfo": { "type": "UNKNOWN", "reason": "Sorry, the restaurant cannot take your order right now." }, "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ], "infoExtension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension", "foodOrderErrors": [ { "error": "NO_CAPACITY", "description": "Sorry, the restaurant cannot take your order right now." } ] } } } }
ยกเลิกแล้ว
ตัวอย่างนี้แสดงตัวอย่างคำขออัปเดตคำสั่งซื้อที่แจ้งให้ผู้ใช้ทราบ ว่าคำสั่งซื้อถูกยกเลิกพร้อมเหตุผลการยกเลิก
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "CANCELLED", "label": "Order cancelled" }, "updateTime": "2017-05-10T02:30:00.000Z", "cancellationInfo": { "reason": "Customer requested" }, "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ] } } }
IN_PREPARATION
ตัวอย่างนี้แสดงตัวอย่างคำขออัปเดตคำสั่งซื้อที่แจ้งให้ผู้ใช้ทราบ ที่มีการเตรียมอาหารไว้
{ "isInSandbox":true, "customPushMessage":{ "orderUpdate":{ "actionOrderId":"sample_action_order_id", "orderState":{ "state":"IN_PREPARATION", "label":"Order is being prepared" }, "receipt": { "userVisibleOrderId": "userVisibleId1234" }, "updateTime":"2018-04-15T11:30:00Z", "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ], "infoExtension":{ "@type":"type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension", "estimatedFulfillmentTimeIso8601":"PT20M" } } } }
READY_FOR_PICKUP
ตัวอย่างนี้แสดงตัวอย่างคำขออัปเดตคำสั่งซื้อที่แจ้งให้ผู้ใช้ทราบ ว่ามีอาหารพร้อมให้ไปรับแล้ว
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "READY_FOR_PICKUP", "label": "Order is ready for pickup" }, "receipt": { "userVisibleOrderId": "userVisibleId1234" }, "updateTime": "2018-04-15T12:00:00Z", "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ], "infoExtension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension", "estimatedFulfillmentTimeIso8601": "PT20M" } } } }
IN_TRANSIT
ตัวอย่างนี้แสดงตัวอย่างคำขออัปเดตคำสั่งซื้อที่แจ้งให้ผู้ใช้ทราบ ว่าคำสั่งซื้ออยู่ระหว่างการขนส่งโดยมีเวลานำส่งโดยประมาณ
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "IN_TRANSIT", "label": "Order is on the way" }, "inTransitInfo": { "updatedTime": "2017-07-17T12:00:00Z" }, "updateTime": "2017-07-17T12:00:00Z", "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ], "infoExtension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension", "estimatedFulfillmentTimeIso8601": "PT20M" } } } }
เสร็จสมบูรณ์แล้ว
ตัวอย่างนี้แสดงตัวอย่างคำขออัปเดตคำสั่งซื้อที่แจ้งให้ผู้ใช้ทราบ มีการไปรับหรือนำส่งสินค้าที่สั่งซื้อ
{ "isInSandbox": true, "customPushMessage": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "FULFILLED", "label": "Order delivered" }, "updateTime": "2017-05-10T02:30:00.000Z", "fulfillmentInfo": { "deliveryTime": "2017-05-10T02:30:00.000Z" }, "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_RESTAURANT", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "CALL_DRIVER", "button": { "title": "Call driver", "openUrlAction": { "url": "tel:+16505554681" } } } ] } } }
สำหรับตัวอย่างเพิ่มเติมของคำขออัปเดตคำสั่งซื้อในกรณีการใช้งานต่างๆ โปรดอ่าน ใช้การอัปเดตคำสั่งซื้อขั้นสูง
สร้างโทเค็นการให้สิทธิ์และส่งข้อความ
การอัปเดตคำสั่งซื้อต้องมีโทเค็นการให้สิทธิ์เพื่อให้การสั่งซื้อแบบครบวงจร สามารถตรวจสอบว่าข้อความมาจากบริการเว็บแบบครบวงจรของการสั่งซื้อ
หากต้องการใช้การอัปเดตคำสั่งซื้อสำหรับโปรเจ็กต์ของคุณ ให้ทำตามขั้นตอนต่อไปนี้
- สร้างโทเค็นการให้สิทธิ์โดยทำตามขั้นตอนต่อไปนี้
- ใช้ไลบรารีการตรวจสอบสิทธิ์ของ Google เพื่ออ่านข้อมูลเข้าสู่ระบบจากบริการของคุณ ไฟล์ของบัญชี
- ขอโทเค็นโดยใช้ขอบเขต API ต่อไปนี้
https://www.googleapis.com/auth/actions.fulfillment.conversation
- ใช้โทเค็นนี้เพื่อส่งคำขอ HTTP POST ที่ผ่านการตรวจสอบสิทธิ์ไปยัง
ปลายทางต่อไปนี้:
https://actions.googleapis.com/v2/conversations:send
- ตั้งค่าส่วนหัว
Content-Type
เป็นapplication/json
ในคำขอ
ตัวอย่างต่อไปนี้สาธิตวิธีใช้การอัปเดตคำสั่งซื้อ
Node.js
โค้ดนี้ใช้ไลบรารีการตรวจสอบสิทธิ์ของ Google สำหรับ Node.js
const {auth} = require('google-auth-library') const request = require('request'); // The service account client secret file downloaded from the Google Cloud Console const serviceAccountJson = require('./service-account.json') // order-update.json is a file that contains the payload const jsonBody = require('./order-update.json') /** * Get the authorization token using a service account. */ async function getAuthToken() { let client = auth.fromJSON(serviceAccountJson) client.scopes = ['https://www.googleapis.com/auth/actions.fulfillment.conversation'] const tokens = await client.authorize() return tokens.access_token; } /** * Send an order update request */ async function sendOrderUpdate() { const token = await getAuthToken() request.post({ headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, url: 'https://actions.googleapis.com/v2/conversations:send', body: jsonBody, json: true }, (err, res, body) => { if (err) { return console.log(err); } console.log(`Response: ${JSON.stringify(res)}`) }) }
Python
โค้ดนี้ใช้ไลบรารีการตรวจสอบสิทธิ์ของ Google สำหรับ Python
from google.oauth2 import service_account from google.auth.transport.requests import AuthorizedSession import json # service-account.json is the service account client secret file downloaded from the # Google Cloud Console credentials = service_account.Credentials.from_service_account_file( 'service-account.json') scoped_credentials = credentials.with_scopes( ['https://www.googleapis.com/auth/actions.fulfillment.conversation']) authed_session = AuthorizedSession(scoped_credentials) # order-update.json is a file that contains the payload json_payload=json.load(open('order-update.json')) response = authed_session.post( 'https://actions.googleapis.com/v2/conversations:send', json=json_payload)
Java
โค้ดนี้ใช้ไลบรารีการตรวจสอบสิทธิ์ของ Google สำหรับ Java
/** * Get the authorization token using a service account. */ private static String getAuthToken() { InputStream serviceAccountFile = Example.class.getClassLoader().getResourceAsStream("service-account.json"); ServiceAccountCredentials.Builder credentialsSimpleBuilder = ServiceAccountCredentials.fromStream(serviceAccountFile).toBuilder(); credentialsSimpleBuilder.setScopes(ImmutableList.of("https://www.googleapis.com/auth/actions.fulfillment.conversation")); AccessToken accessToken = credentialsSimpleBuilder.build().refreshAccessToken(); return accessToken.getTokenValue(); } /** * Send an order update request */ public void sendOrderUpdate() { String authToken = getAuthToken(); // Execute POST request executePostRequest("https://actions.googleapis.com/v2/conversations:send", authToken, "update_order_example.json",); }
Google จะส่งคืนการตอบกลับ HTTP 200 เพื่อให้อัปเดตคำสั่งซื้อได้สำเร็จโดยไม่มีข้อผิดพลาด ด้วยเพย์โหลดที่ว่างเปล่า หากมีปัญหา เช่น การอัปเดต Google แสดงข้อผิดพลาดในรูปแบบที่ไม่ถูกต้อง