หลังจากที่ลูกค้าส่งคําสั่งซื้ออาหาร คุณสามารถส่งข้อความอัปเดตคําสั่งซื้อไปที่บริการ "สั่งซื้อผ่าน Google" เพื่อแจ้งให้เราทราบถึงการเปลี่ยนแปลงดังกล่าว
สาเหตุทั่วไปในการส่งการอัปเดตคําสั่งซื้อมีดังนี้
- เวลาที่ทําได้โดยประมาณสําหรับการสั่งซื้อสามารถเปลี่ยนแปลงได้
- สถานะของคําสั่งซื้อจะเปลี่ยนแปลง
- ดําเนินการตามคําสั่งซื้อไม่ได้
- ราคาของรายการเมนูที่อยู่ในคําสั่งซื้อมีการเปลี่ยนแปลง
- ลูกค้ามีวิธีใหม่ในการจัดการคําสั่งซื้อ เช่น การสนับสนุนลูกค้าหรือหมายเลขโทรศัพท์ของร้านอาหาร
- ใบเสร็จของใบสั่งซื้อจะพร้อมใช้งาน
ส่วนถัดไปจะแสดงรายละเอียดเกี่ยวกับวิธีจัดการกับสถานการณ์ต่างๆ เหล่านี้โดยใช้การอัปเดตคําสั่งซื้อ
การเปลี่ยนแปลงสถานะคําสั่งซื้อ
คําสั่งซื้อจะมีสถานะที่เป็นไปได้หกสถานะ รัฐและการเปลี่ยนที่เป็นไปได้เหล่านี้แสดงอยู่ในแผนผังต่อไปนี้
เมื่อลูกค้าส่งคําสั่งซื้อเป็นครั้งแรก คําสั่งซื้อจะเริ่มต้นด้วยสถานะของ 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
บริการ "สั่งซื้อผ่าน Google" ของคุณควรคืนเงินตามนโยบายการยกเลิกของคุณและสถานะการชําระเงิน ณ เวลาที่ยกเลิก
บริการ "สั่งซื้อผ่าน Google" ไม่จําเป็นต้องรองรับสถานะและการเปลี่ยนทั้งหมดที่ให้บริการ แต่สถานะสุดท้ายของคําสั่งซื้อต้องเป็น FULFILLED
,
REJECTED
หรือ CANCELLED
ระบุเวลาที่จะได้รับสินค้าโดยประมาณ
คุณสามารถระบุช่วงเวลาโดยประมาณที่ผู้ใช้สามารถรับสินค้า (หรือจัดส่ง) ได้ ใช้ช่อง estimatedFulfillmentTimeIso8601
ของ FoodOrderUpdateExtension
เพื่อระบุช่วงเวลาโดยประมาณที่คําสั่งซื้อของลูกค้าจะพร้อมสําหรับการรับสินค้าหรือจัดส่ง
ส่ง estimatedFulfillmentTimeIso8601
ในเวลาต่อไปนี้
- เมื่อถึงเวลาโดยประมาณ ควรใช้ในลําดับ
CREATED
หรือCONFIRMED
- เมื่อเวลาโดยประมาณเปลี่ยนแปลง เช่น การอัปเดตเวลาโดยประมาณเพื่อให้แม่นยํามากขึ้นเมื่อคําสั่งซื้อมีค่าเป็น
IN_TRANSIT
ในการจัดการความคาดหวังของผู้ใช้อย่างมีประสิทธิภาพ คุณควรประเมินอย่างระมัดระวังและให้ข้อมูลวันที่และเวลาแทนที่จะใช้วันที่และเวลาที่ตายตัว คุณควรคํานึงถึงปัจจัยต่างๆ เช่น สภาพการจราจรเมื่อเป็นไปได้ เช่น คุณจะส่งเวลาโดยประมาณ 12.45 น. (ขอบเขตล่าง) ถึง 13.15 น. (ขอบเขตบน) สําหรับคําสั่งซื้อที่มีเวลาจัดส่งโดยประมาณคือ 13.00 น.
การดําเนินการจัดการคําสั่งซื้อ
เมื่อส่งการอัปเดตคําสั่งซื้อ คุณสามารถให้ทรัพยากรเพื่อช่วยลูกค้าจัดการคําสั่งซื้อในรูปแบบ OrderManagementAction
หลังจากที่ลูกค้าทําการสั่งซื้อ ลูกค้าอาจต้องติดต่อคุณหรือร้านอาหารซึ่งกรอกคําสั่งซื้อเพื่อติดตามความคืบหน้า ทําการเปลี่ยนแปลง หรือยกเลิกคําสั่งซื้อของลูกค้า
OrderManagementAction
ช่วยให้ลูกค้าส่งอีเมล โทร หรือลิงก์ไปยัง URL จากอุปกรณ์ของพวกเขาได้โดยตรง ใช้ข้อมูลใน OrderManagementAction
เหมือนกับในอีเมลยืนยันคําสั่งซื้อที่คุณส่งถึงผู้ใช้
การทํางานในการจัดการคําสั่งซื้อประกอบไปด้วยประเภทต่อไปนี้
CUSTOMER_SERVICE
: ให้ลูกค้าดําเนินการเพื่อติดต่อฝ่ายบริการลูกค้า ต้องระบุประเภทการดําเนินการในการจัดการนี้เพื่ออัปเดตคําสั่งซื้อEMAIL
: ให้การกระทําแก่ลูกค้าเพื่อส่งอีเมลไปยังที่อยู่อีเมลที่ระบุCALL
: เสนอการดําเนินการเพื่อโทรหาหมายเลขโทรศัพท์ที่ระบุVIEW_DETAIL
: ให้ลูกค้าดําเนินการเพื่อดูรายละเอียดคําสั่งซื้อ
การอัปเดตคําสั่งซื้อแต่ละรายการต้องมีการดําเนินการจัดการคําสั่งซื้ออย่างน้อย 1 รายการ อย่างไรก็ตาม การทํางานในการจัดการคําสั่งซื้ออาจแตกต่างกันออกไปตามสถานะของคําสั่งซื้อ
ตัวอย่างเช่น เมื่อคําสั่งซื้ออยู่ในสถานะ CONFIRMED
การดําเนินการ CUSTOMER_SERVICE
อาจชี้ไปยังหมายเลขโทรศัพท์ฝ่ายบริการลูกค้าของคุณ เมื่อสถานะคําสั่งซื้อมีการอัปเดตเป็น IN_TRANSIT
การดําเนินการ "CUSTOMER_SERVICE
" อาจชี้ไปยังหมายเลขโทรศัพท์ของร้านอาหารที่ดําเนินการตามคําสั่งซื้อ
กําลังส่งการอัปเดตคําสั่งซื้อ
คุณใช้ประเภทข้อความ AsyncOrderUpdateRequestMessage
เพื่อส่งการอัปเดตคําสั่งซื้อไปยังบริการ "สั่งซื้อด้วย Google" 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" } } } ] } } }
การเตรียมการ
ตัวอย่างนี้แสดงตัวอย่างคําขออัปเดตคําสั่งซื้อที่แจ้งให้ผู้ใช้ทราบว่ากําลังเตรียมอาหารอยู่
{ "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" } } } }
สามารถอ่านได้
ตัวอย่างนี้แสดงตัวอย่างคําขออัปเดตคําสั่งซื้อที่แจ้งให้ผู้ใช้ทราบว่าอาหารพร้อมสําหรับการไปรับ
{ "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" } } } }
อยู่ระหว่างการขนส่ง
ตัวอย่างนี้แสดงตัวอย่างคําขออัปเดตคําสั่งซื้อที่แจ้งให้ผู้ใช้ทราบว่าคําสั่งซื้ออยู่ระหว่างการขนส่งด้วยเวลานําส่งโดยประมาณ
{ "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" ยืนยันได้ว่าข้อความมาจากบริการผ่านเว็บ "สั่งซื้อผ่าน Google"
วิธีการใช้การอัปเดตคําสั่งซื้อสําหรับโครงการ ให้ทําตามขั้นตอนต่อไปนี้
- สร้างโทเค็นการให้สิทธิ์โดยทําตามขั้นตอนต่อไปนี้
- ใช้ไลบรารีการตรวจสอบสิทธิ์ของ 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 จะแสดงข้อผิดพลาด