پس از اینکه مشتری سفارش غذا را ارسال کرد، میتوانید یک پیام بهروزرسانی سفارش را به سرویس پایان به انتها سفارش ارسال کنید تا ما را از تغییر مطلع کند.
در اینجا چند دلیل متداول برای ارسال بهروزرسانی سفارش آورده شده است:
- زمان برآوردی انجام سفارش در دسترس می شود یا تغییر می کند.
- وضعیت یک سفارش تغییر می کند.
- سفارش دیگر قابل انجام نیست.
- قیمت یک آیتم منوی موجود در سفارش تغییر کرد.
- مشتری روش جدیدی برای مدیریت سفارش خود دارد، مانند شماره تلفن پشتیبانی مشتری یا رستوران.
- رسید سفارش در دسترس می شود.
بخشهای بعدی جزئیاتی در مورد نحوه رسیدگی به این سناریوهای مختلف با استفاده از بهروزرسانیهای سفارش ارائه میدهند.
حالت های انتقالی
یک سفارش دارای شش حالت ممکن است. این حالت ها و انتقال های احتمالی آنها در نمودار زیر نشان داده شده است:
هنگامی که مشتری برای اولین بار سفارشی را ارسال می کند، سفارش با حالت 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
FulfillmentTimeIso8601 را در زمان های زیر ارسال کنید:
- زمانی که زمان تخمینی در دسترس باشد، در حالت ایدهآل در حالت
CREATED
یاCONFIRMED
. - زمانی که زمان تخمینی تغییر میکند، مانند بهروزرسانی زمان تخمینی برای دقیقتر شدن زمانی که سفارش
IN_TRANSIT
است.
برای مدیریت موثر انتظارات کاربر، در برآوردهای خود محافظه کار باشید و به جای تاریخ و زمان ثابت، محدوده تاریخ و زمانی را ارائه دهید. تا حد امکان باید تغییراتی مانند شرایط ترافیکی را در نظر بگیرید. به عنوان مثال، می توانید برای سفارشی که زمان تخمینی تحویل آن ساعت 13:00 است، تخمینی از 12:45 بعد از ظهر (کران پایین) تا 1:15 بعد از ظهر (کران بالایی) ارسال کنید.
ارائه اقدامات مدیریت سفارش
هنگام ارسال بهروزرسانی سفارش، میتوانید منابعی را در اختیار مشتریان قرار دهید که به آنها در مدیریت سفارش خود در قالب OrderManagementAction
کمک میکند. پس از اینکه مشتری سفارش داد، ممکن است لازم باشد با شما یا رستورانی که سفارش را انجام می دهد تماس بگیرد تا پیشرفت را پیگیری کند، تغییراتی ایجاد کند یا سفارش خود را لغو کند.
OrderManagementAction
به مشتریان امکان می دهد مستقیماً از دستگاه خود ایمیل بزنند، تماس بگیرند یا به URL پیوند دهند. در OrderManagementAction
از همان اطلاعاتی که در تأیید سفارش ایمیلی که برای کاربر ارسال میکنید استفاده کنید.
اقدامات مدیریت سفارش شامل انواع زیر است:
-
CUSTOMER_SERVICE
: به مشتریان اقدامی برای تماس با خدمات مشتری ارائه دهید. این نوع اقدام مدیریتی برای بهروزرسانی سفارش لازم است. -
EMAIL
: به مشتریان اقدامی برای ارسال ایمیل به آدرس ایمیل ارائه شده ارائه دهید. -
CALL
: به مشتریان اقدامی برای تماس با شماره تلفن ارائه شده ارائه دهید. -
VIEW_DETAIL
: برای مشاهده جزئیات سفارش به مشتریان اقدامی ارائه دهید.
هر بهروزرسانی سفارش باید حداقل یک اقدام مدیریت سفارش داشته باشد. با این حال، اقدامات مدیریت سفارش ارائه شده می تواند بر اساس وضعیت سفارش متفاوت باشد. به عنوان مثال، هنگامی که یک سفارش در وضعیت CONFIRMED
شده است، عملکرد CUSTOMER_SERVICE
می تواند به شماره تلفن خدمات مشتری شما اشاره کند. هنگامی که وضعیت سفارش به IN_TRANSIT
بهروزرسانی میشود، اقدام CUSTOMER_SERVICE
میتواند به شماره تلفن رستوران تکمیلی اشاره کند.
ارسال به روز رسانی سفارش
شما از نوع پیام AsyncOrderUpdateRequestMessage
برای ارسال به روز رسانی سفارش به سرویس Ordering End-to-End استفاده می کنید. 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 Auth برای خواندن اطلاعات کاربری از فایل حساب سرویس خود استفاده کنید.
- درخواست رمز با استفاده از محدوده 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)}`) }) }
پایتون
این کد از کتابخانه اعتبار گوگل برای پایتون استفاده می کند.
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)
جاوا
این کد از کتابخانه تایید گوگل برای جاوا استفاده می کند.
/** * 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 خطایی را برمیگرداند.