Müşteri bir yemek siparişi gönderdikten sonra, bu değişikliği bize bildirmek için Order with Google hizmetine bir sipariş güncelleme mesajı gönderebilirsiniz.
Sipariş güncellemelerinin yaygın olarak karşılaşılan bazı nedenleri aşağıda belirtilmiştir:
- Siparişin tahmini sipariş karşılama zamanı kullanılabilir hale gelir veya değişir.
- Siparişin durumu değişir.
- Sipariş artık yerine getirilemez.
- Siparişe dahil olan menü öğesinin fiyatı değişti.
- Müşterinin siparişini yönetmek için kullanabileceği yeni bir yöntem (ör. müşteri desteği veya restoran telefon numarası) var.
- Siparişin makbuzu hazır olur.
Sonraki bölümlerde, sipariş güncellemelerini kullanarak bu farklı senaryoların nasıl ele alınacağı hakkında ayrıntılar verilmiştir.
Geçiş sırası durumları
Bir siparişin altı durumu olabilir. Bu durumlar ve olası geçişleri aşağıdaki şemada açıklanmıştır:
Bir müşteri ilk kez sipariş gönderdiğinde sipariş CREATED
, CONFIRMED
veya REJECTED
durumuyla başlar. Durum geçişi geçerli olduğu sürece, bir siparişin durumunu güncellemek için sipariş güncelleme mesajı gönderebilirsiniz. CREATED
durumu, iş ortağının platformu siparişi hemen onaylayamadığında veya reddettiğinde kullanılır. Bir müşterinin teslimat toplayıcısı üzerinden sipariş vermesi buna örnek olarak verilebilir. Teslim toplayıcı, teslimatı Google'dan alır ve toplayıcı, bilgileri restorana gönderir. Restoran sipariş durumunu aldıktan ve onayladıktan sonra durum artık CONFIRMED
, aksi takdirde REJECTED
olabilir.
CONFIRMED
durumundaki bir sipariş IN_PREPARATION
durumuna taşınır. Siparişin teslim alma veya adrese teslim seçeneklerine bağlı olarak, READY_FOR_PICKUP
veya IN_TRANSIT
durumunu kullanın. Yemek teslim edildiğinde veya teslim alındığında, sipariş FULFILLED
durumuna ayarlanır.
Müşterilerin siparişleri iptal etmesine izin verirseniz CANCELLED
durumunu kullanabilirsiniz. Bir sipariş CREATED
, CONFIRMED
, IN_PREPARATION
, READY_FOR_PICKUP
veya IN_TRANSIT
durumundayken iptal edilebilir.
Order with Google hizmetiniz, iptal politikanıza ve iptal sırasındaki ödeme durumuna bağlı olarak geri ödeme yapmalıdır.
Order with Google hizmetinizin mevcut tüm eyaletleri ve geçişleri desteklemesi gerekmez. Bununla birlikte, siparişin son durumu FULFILLED
,
REJECTED
veya CANCELLED
olmalıdır.
Tahmini sipariş karşılama zamanı sağlama
Kullanıcılara, siparişlerinin teslim alınmaya (veya teslim edilmeye) hazır olacağı tahmini bir zaman aralığı sağlayabilirsiniz. Bir müşterinin siparişinin teslim alınmaya hazır olacağı veya teslim edileceği zamanı tahmini olarak belirten zaman aralığını sağlamak için FoodOrderUpdateExtension
estimatedFulfillmentTimeIso8601
alanını kullanın.
estimatedFulfillmentTimeIso8601
öğesini şu zamanlarda gönderin:
- Tahmini süre kullanılabilir olduğunda ideal olarak
CREATED
veyaCONFIRMED
sırasına göre. - Tahmini süre değiştirildiğinde (ör. sipariş
IN_TRANSIT
olduğunda tahmini zamanı daha doğru olacak şekilde güncelleme).
Kullanıcı beklentilerini etkili bir şekilde yönetmek için tahminlerinizde kısıtlı olun ve sabit bir tarih ve saat yerine bir tarih ve saat aralığı sağlayın. Mümkünse trafik koşulları gibi varyasyonları dikkate almanız gerekir. Örneğin, tahmini teslimat süresi 13:00 olan bir sipariş için 12:45 (alt sınır) tahminini 13:15'e (üst sınır) gönderebilirsiniz.
Sipariş yönetimi işlemleri sağlama
Sipariş güncellemesi gönderirken, müşterilere OrderManagementAction
biçiminde siparişlerini yönetmelerine yardımcı olacak kaynaklar sağlayabilirsiniz. Bir sipariş verdikten sonra müşterinin, ilerlemeyi takip etmek, değişiklik yapmak veya siparişini iptal etmek için sizinle ya da siparişi yerine getiren restoranla iletişime geçmesi gerekebilir.
OrderManagementAction
, müşterilerin doğrudan cihazlarından e-posta göndermesine, URL'yi aramasına veya URL'ye bağlantı vermesine olanak tanır. OrderManagementAction
bölümünde, kullanıcıya gönderdiğiniz e-posta sipariş onayındaki bilgilerle aynı bilgileri kullanın.
Sipariş yönetimi işlemleri aşağıdaki türleri içerir:
CUSTOMER_SERVICE
: Müşterilere, müşteri hizmetleriyle iletişime geçmeleri için bir işlem sunun. Sipariş güncellemeleri için bu yönetim işlemi türü gereklidir.EMAIL
: Müşterilere, belirtilen e-posta adresine e-posta göndermelerini sağlayacak bir işlem sunun.CALL
: Müşterilere, sağlanan telefon numarasını arayabilecekleri bir işlem sunun.VIEW_DETAIL
: Müşterilere siparişlerinin ayrıntılarını görüntülemek için bir işlem sunun.
Her sipariş güncellemesi en az bir sipariş yönetimi işlemi içermelidir. Ancak, sağlanan sipariş yönetimi işlemleri siparişin durumuna göre değişiklik gösterebilir.
Örneğin, bir sipariş CONFIRMED
durumundayken CUSTOMER_SERVICE
işlemi, müşteri hizmetleri telefon numaranızı gösterebilir. Bu sipariş durumu IN_TRANSIT
olarak güncellendiğinde CUSTOMER_SERVICE
işlemi, sipariş karşılama restoranının telefon numarasına işaret edebilir.
Sipariş güncellemeleri gönderiliyor
Order with Google hizmetine sipariş güncellemesi göndermek için AsyncOrderUpdateRequestMessage
mesaj türünü kullanırsınız. Google AsyncOrderUpdateResponseMessage
ile yanıt verir. Örneğin, bir müşteriye siparişinin geçerli ve kabul edildiğini bildirmek istiyorsanız AsyncOrderUpdateRequestMessage
etiketini kullanarak siparişin durumunu Accepted by restaurant
etiketiyle CONFIRMED
olarak değiştirebilirsiniz.
Sipariş güncelleme mesajı ayarlanıyor
Google'a AsyncOrderUpdateRequestMessage
gönderirken OrderUpdate
alanını kullanarak siparişin durumuyla ilgili bilgileri eklemeniz gerekir.
Aşağıdaki örneklerde her sipariş durumu için örnek bir AsyncOrderUpdateRequestMessage
gösterilmektedir:
ONAYLANDI
Bu örnek, kullanıcıya siparişin makbuzla birlikte onaylandığını ve tahmini teslimat süresini bildiren örnek bir sipariş güncelleme isteği gösterir.
{ "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" } } } }
REDDEDİLDİ
Bu örnekte, kullanıcıya siparişin ret nedeniyle reddedildiğini bildiren örnek bir sipariş güncelleme isteği gösterilmektedir.
{ "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." } ] } } } }
İPTAL EDİLDİ
Bu örnekte, siparişin iptal nedeniyle kullanıcıya iptal edildiğini bildiren örnek bir sipariş güncelleme isteği gösterilmektedir.
{ "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" } } } ] } } }
GİRİŞ
Bu örnekte, kullanıcıyı yemeğin şu anda hazırlandığı konusunda bilgilendiren örnek bir sipariş güncelleme isteği gösterilmektedir.
{ "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" } } } }
PAKETLER İÇİN HAZIR
Bu örnekte, kullanıcıya yemeğin teslime hazır olduğunu bildiren örnek bir sipariş güncelleme isteği gösterilmektedir.
{ "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
Bu örnekte, kullanıcıya tahmini bir teslimat süresiyle birlikte siparişin verildiğini bildiren örnek bir sipariş güncelleme isteği gösterilmektedir.
{ "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" } } } }
TAMAMLANDI
Bu örnekte, kullanıcıya siparişin teslim edildiğini veya teslim edildiğini bildiren örnek bir sipariş güncelleme isteği gösterilmektedir:
{ "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" } } } ] } } }
Farklı kullanım alanlarında sipariş güncelleme istekleriyle ilgili daha fazla örnek için Gelişmiş sipariş güncellemelerini uygulama konusunu okuyun.
Yetkilendirme jetonu oluşturma ve mesajı gönderme
Sipariş güncellemeleri, Order with Google hizmetinin, mesajın Order with Google web hizmetinizden geldiğini doğrulayabilmesi için bir yetkilendirme jetonu gerektirir.
Projenizde sipariş güncellemelerini uygulamak için aşağıdaki adımları uygulayın:
- Aşağıdaki adımları uygulayarak bir yetkilendirme jetonu oluşturun:
- Hizmet hesabı dosyanızdaki kimlik bilgilerini okumak için Google Auth Kitaplığı'nı kullanın.
- Aşağıdaki API kapsamını kullanarak jeton isteyin:
https://www.googleapis.com/auth/actions.fulfillment.conversation
- Aşağıdaki uç noktaya bir kimliği doğrulanmış HTTP POST isteği göndermek için bu jetonu kullanın:
https://actions.googleapis.com/v2/conversations:send
- İsteğinizin bir parçası olarak
Content-Type
başlığınıapplication/json
olarak ayarlayın.
Aşağıdaki örnekler, sipariş güncellemelerinin nasıl uygulanacağını göstermektedir:
Node.js
Bu kod, Node.js için Google kimlik doğrulama kitaplığını kullanır.
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
Bu kod, Python için Google kimlik doğrulama kitaplığını kullanır.
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
Bu kod, Java için Google kimlik doğrulama kitaplığını kullanır.
/** * 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, hatasız sipariş güncellemeleri için boş yük içeren bir HTTP 200 yanıtı döndürür. Güncellemenin bozulması gibi bir sorun varsa Google bir hata döndürür.