非同期の注文更新

お客様が料理の注文を送信したら、注文更新メッセージを 注文エンドツーエンド サービスを通じて Google に変更を通知します。

注文の更新情報を送信する一般的な理由は次のとおりです。

  • 注文の発送予定日が確定するか変更されます。
  • 注文の状態が変更される。
  • 注文を処理できなくなりました。
  • 注文に含まれるメニューの価格が変更された。
  • お客様が注文を管理するための新しい方法(カスタマー サポートなど)を利用できる場合 またはレストランの電話番号です。
  • 注文の領収書が利用できるようになります。

以降のセクションでは、このようなさまざまなシナリオへの対処方法について詳しく説明します。 注文の更新を使用します

注文ステータスの移行

注文には 6 つのステータスがあります。これらの状態と想定される遷移 次の図に概要を示します。

注文状態の遷移

お客様が初めて注文を送信したとき、その注文のステータスは CREATEDCONFIRMED、または REJECTED。注文更新メッセージを 状態遷移が有効である限り、注文の状態を更新する。CREATED ステータスは、パートナーのプラットフォームで注文を確定または拒否できない場合に使用されます。 すぐに通知されます。ユースケースの一例として、顧客が配達で注文する場合 アグリゲータアグリゲータは Google から配送を受け取り、 アグリゲータがレストランに情報を送信します。レストランがメッセージを受信すると 注文の在庫状況を確認しました。ステータスは CONFIRMED になります。それ以外の場合は、 REJECTED

CONFIRMED 状態の注文は、次に IN_PREPARATION 状態に移行します。注文が受け取りか宅配かに応じて、次に READY_FOR_PICKUP または IN_TRANSIT ステータスを使用します。食品の配達または受け取りが完了すると、注文は FULFILLED ステータスに設定されます。

ユーザーに注文のキャンセルを許可する場合は、CANCELLED ステータスを使用できます。CREATEDCONFIRMEDIN_PREPARATIONREADY_FOR_PICKUPIN_TRANSIT のいずれかのステータスの注文はキャンセルできます。 注文処理のエンドツーエンド サービスでは、 キャンセル ポリシーと、キャンセル時のお支払い状況。

注文エンドツーエンド サービスが、利用可能なすべての州に対応している必要はありません。 3 つありますただし、注文の最終状態は FULFILLED である必要がありますREJECTEDCANCELLED など)。

配送予定日を提示する

注文が配送されるおおよその期間をお客様に提供できます。 受け取り可能(または配送済み)です。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"
            }
          }
        }
      ]
    }
  }
}
    

さまざまなユースケースでの注文更新リクエストのその他の例については、 注文の事前更新を実装する

認証トークンを生成してメッセージを送信する

注文の更新には認証トークンが必要です。これにより、エンドツーエンドの サービスは、メッセージがお客様の注文エンドツーエンド ウェブサービスから送信されていることを確認できます。

プロジェクトの注文更新を実装する手順は次のとおりです。

  1. 次の手順で認証トークンを生成します。 <ph type="x-smartling-placeholder">
      </ph>
    1. Google Auth ライブラリを使用してサービスから認証情報を読み取る 表示されます。
    2. 次の API スコープを使用してトークンをリクエストします。 https://www.googleapis.com/auth/actions.fulfillment.conversation
  2. このトークンを使用して、認証済みの HTTP POST リクエストを エンドポイント https://actions.googleapis.com/v2/conversations:send
  3. リクエストの一部として、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 はエラーを返します。