お客様が料理の注文を送信したら、注文更新メッセージを 注文エンドツーエンド サービスを通じて Google に変更を通知します。
注文の更新情報を送信する一般的な理由は次のとおりです。
- 注文の発送予定日が確定するか変更されます。
- 注文の状態が変更される。
- 注文を処理できなくなりました。
- 注文に含まれるメニューの価格が変更された。
- お客様が注文を管理するための新しい方法(カスタマー サポートなど)を利用できる場合 またはレストランの電話番号です。
- 注文の領収書が利用できるようになります。
以降のセクションでは、このようなさまざまなシナリオへの対処方法について詳しく説明します。 注文の更新を使用します
注文ステータスの移行
注文には 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
のいずれかのステータスの注文はキャンセルできます。
注文処理のエンドツーエンド サービスでは、
キャンセル ポリシーと、キャンセル時のお支払い状況。
注文エンドツーエンド サービスが、利用可能なすべての州に対応している必要はありません。
3 つありますただし、注文の最終状態は FULFILLED
である必要があります。
REJECTED
、CANCELLED
など)。
配送予定日を提示する
注文が配送されるおおよその期間をお客様に提供できます。
受け取り可能(または配送済み)です。estimatedFulfillmentTimeIso8601
フィールドを使用する
予測期間を FoodOrderUpdateExtension
に調整して、
受け取りまたは配達の準備ができます。
次の時間に estimatedFulfillmentTimeIso8601
を送信します。
- 予想時間が利用可能になったとき。できれば
CREATED
またはCONFIRMED
状態。 - 推定時間が変更された場合(推定時間の更新など)は、
注文が
IN_TRANSIT
の場合の精度が向上します。
ユーザーの期待値を効果的に管理するには、控えめな見積もりを心がけ、 固定の日時ではなく日時の範囲を指定する。すべきこと 可能な限り、交通状況などの変動を考慮する必要があります。対象 たとえば、午後 12 時 45 分(下限)から午後 1 時 15 分(上限 (配送予定日の午後 1 時の注文)
注文管理アクションの提供
注文の最新情報を送信する際、お客様に役立つリソースを提供できます。
OrderManagementAction
の形式で注文を管理します。アフター
顧客が注文すると、店舗またはレストランに問い合わせなければならない場合があります
注文の進捗状況の追跡、変更、キャンセルを行うための
OrderManagementAction
を使用すると、顧客はメール、電話、または
できます。同じ情報を
OrderManagementAction
(次の宛先に送信した注文確認メールと同じ)
できます。
注文管理アクションには次のタイプがあります。
CUSTOMER_SERVICE
: お客様に連絡するためのアクションを提示します あります。注文の更新には、この管理操作の種類が必須です。EMAIL
: 指定されたアドレスにメールを送信するよう、お客様に案内します。 入力します。CALL
: 指定した電話番号に電話をかける操作をユーザーに提示します。VIEW_DETAIL
: 詳細を表示する操作を顧客に提供します できます。
それぞれの注文の更新には、少なくとも 1 つの注文管理アクションが含まれている必要があります。ただし、
提供される注文管理アクションは、注文の状態によって異なる場合があります。
たとえば、注文のステータスが CONFIRMED
の場合、CUSTOMER_SERVICE
カスタマー サービスの電話番号を指定できます。注文ステータスが
IN_TRANSIT
を更新した場合、CUSTOMER_SERVICE
アクションは
フルフィルメントレストランの電話番号
注文の更新情報を送信する
AsyncOrderUpdateRequestMessage
メッセージ タイプを使用して注文を送信する
Ordering End-to-End サービスに更新しました。Google からレスポンス
AsyncOrderUpdateResponseMessage
。たとえば、データに
確認できた場合は、代わりに
AsyncOrderUpdateRequestMessage
: 注文の状態を CONFIRMED
に変更します。
ラベル Accepted by restaurant
を付けます。
注文更新メッセージの設定
AsyncOrderUpdateRequestMessage
を Google に送信する場合は、
注文の状態に関する情報を OrderUpdate
フィールドを使用して取得します。
次の例は、AsyncOrderUpdateRequestMessage
各注文ステータス:
CONFIRMED
この例では、ユーザーに通知する注文更新リクエストのサンプルを示します。 注文に領収書と配達予定日が記載されていること あります。
{ "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." } ] } } } }
CANCELLED
この例では、ユーザーに通知する注文更新リクエストのサンプルを示します。 注文がキャンセルの理由でキャンセルされたことを示します。
{ "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" } } } }
FULFILLED
この例では、ユーザーに通知する注文更新リクエストのサンプルを示します。 注文の集荷または配送の状況を確認する
{ "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" } } } ] } } }
さまざまなユースケースでの注文更新リクエストのその他の例については、 注文の事前更新を実装する。
認証トークンを生成してメッセージを送信する
注文の更新には認証トークンが必要です。これにより、エンドツーエンドの サービスは、メッセージがお客様の注文エンドツーエンド ウェブサービスから送信されていることを確認できます。
プロジェクトの注文更新を実装する手順は次のとおりです。
- 次の手順で認証トークンを生成します。
<ph type="x-smartling-placeholder">
- </ph>
- 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
このコードでは、Node.js 用の Google 認証ライブラリを使用します。
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
このコードでは Python 用の Google 認証ライブラリを使用します。
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
このコードでは Java 用 Google 認証ライブラリを使用します。
/** * 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 はエラーを返します。