購入手続きは、ユーザーがカートを作成すると呼び出されます。このファイルの内容 ユーザーのカートと注文の詳細が注文手続きのエンドツーエンド ウェブに送信される あります。この情報はウェブサービスによって検証され、 必要に応じてカートに 調整を加えます
ウェブサービスの購入手続きハンドラは、POST リクエストに応答する必要があります。特定の
お客様がご購入手続きを選択すると、Google は注文に関するエンドツーエンド ウェブサービスを
CheckoutRequestMessage
形式の JSON リクエスト本文。次の内容が含まれます。
顧客のCart
の詳細情報です。ウェブサービスは
CheckoutResponseMessage
。次の図は、このプロセスを示しています。
購入手続きリクエストを受け取ったら、エンドツーエンドの注文ウェブサービスでは、 次のとおりです。
- 現在の商品価格、在庫状況、 構成します。
- 合計金額(割引、税金、配送料を含む)を計算する あります。
- 成功した場合は、変更されていないカートで応答します。
- 失敗した場合は、エラー メッセージと新しい注文の提案を返信します。
購入手続きの実装を開始する前に、Fulfillment 概要 ご覧ください
決済リクエスト メッセージ
お客様のカートを検証するために、お客様がご購入手続きを選択した際に、
Google は、次の形式の JSON 本文を含むリクエストをウェブサービスに送信します。
CheckoutRequestMessage
。顧客の注文は、
エンドツーエンドの注文フロー。
格納されるデータ
CheckoutRequestMessage
次の内容が含まれます。
- インテント:
inputs[0].intent
フィールドには、このフィールドにactions.foodordering.intent.CHECKOUT
の文字列値。 - Cart: 購入手続きリクエストの
inputs[0].arguments[0].extension
フィールド には、顧客のカートを表すCart
オブジェクトが含まれます。 - 宅配またはテイクアウト:
Cart
オブジェクトの拡張フィールドには 配信または配信用のプロパティを指定するFoodCartExtension
オブジェクト データ エクスポート: <ph type="x-smartling-placeholder">- </ph>
- 配送注文の場合、
FoodCartExtension
オブジェクトには 配送先住所。 - テイクアウトの注文の場合、
FoodCartExtension
オブジェクトは受け取りません。 位置情報が含まれます。
- 配送注文の場合、
- サンドボックス: 購入手続きリクエストの
isInSandbox
フィールドにブール値が含まれる 取引でサンドボックス決済を使用するかどうかを示す値。
決済リクエストの例
CheckoutRequestMessage
の例を次に示します。
{
"user": {},
"conversation": {
"conversationId": "CTZbZfUlHCybEdcz_5PB3Ttf"
},
"inputs": [
{
"intent": "actions.foodordering.intent.CHECKOUT",
"arguments": [
{
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.Cart",
"merchant": {
"id": "restaurant/Restaurant/QWERTY",
"name": "Tep Tep Chicken Club"
},
"lineItems": [
{
"name": "Spicy Fried Chicken",
"type": "REGULAR",
"id": "299977679",
"quantity": 2,
"price": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "AUD",
"units": "39",
"nanos": 600000000
}
},
"offerId": "MenuItemOffer/QWERTY/scheduleId/496/itemId/143",
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension"
}
}
],
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
"fulfillmentPreference": {
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "P0M"
}
}
},
"location": {
"coordinates": {
"latitude": -33.8376441,
"longitude": 151.0868736
},
"formattedAddress": "Killoola St, 1, Concord West NSW 2138",
"zipCode": "2138",
"city": "Concord West",
"postalAddress": {
"regionCode": "AU",
"postalCode": "2138",
"administrativeArea": "NSW",
"locality": "Concord West",
"addressLines": [
"Killoola St",
"1"
]
}
}
}
}
}
]
}
],
"directActionOnly": true,
"isInSandbox": true
}
購入手続きの応答メッセージ
注文エンドツーエンド サービスからリクエストを受け取ると、購入手続きのウェブ
サービスはそれを処理し、CheckoutResponseMessage
を返す必要があります。「
CheckoutResponseMessage
は成功または失敗のいずれかをカバーする必要があります。
リクエストできます。
リクエストに成功しました
決済リクエストが成功した場合は、CheckoutResponseMessage
に以下の情報を含める必要があります。
ProposedOrder
および
PaymentOptions
:
ProposedOrder
cart
:cart
CheckoutRequestMessage
。カートの中身をCheckoutResponseMessage
に代わりにFoodErrorExtension
と修正済みのProposedOrder
。otherItems
: プロバイダが追加したアイテム(配送料など) かかる可能性があります。ユーザーが追加したチップが含まれる場合があります。totalPrice
: 注文の合計金額。extension
: フルフィルメント情報を定義するFoodOrderExtension
配送予定日などが表示されます。
PaymentOptions
- 決済処理の設定については、後述の「Google
お支払い。
次の状態になるまで、
CheckoutResponseMessage
でプレースホルダ JSON を使用できます。 支払い処理を実装する準備が整いました CheckoutResponseMessage
でプレースホルダのお支払い方法を追加するには: 下記の例をご覧ください。この例では、PaymentOptions
の支払いゲートウェイの例。
- 決済処理の設定については、後述の「Google
お支払い。
次の状態になるまで、
正常なレスポンスの例
{
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"checkoutResponse": {
"proposedOrder": {
"cart": {
"merchant": {
"id": "restaurant/Restaurant/QWERTY",
"name": "Tep Tep Chicken Club"
},
"lineItems": [
{
"name": "Spicy Fried Chicken",
"type": "REGULAR",
"id": "299977679",
"quantity": 2,
"price": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "AUD",
"units": "39",
"nanos": 600000000
}
},
"offerId": "MenuItemOffer/QWERTY/scheduleId/496/itemId/143",
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension"
}
}
],
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
"fulfillmentPreference": {
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "P0M"
}
}
},
"location": {
"coordinates": {
"latitude": -33.8376441,
"longitude": 151.0868736
},
"formattedAddress": "Killoola St, 1, Concord West NSW 2138",
"zipCode": "2138",
"city": "Concord West",
"postalAddress": {
"regionCode": "AU",
"postalCode": "2138",
"administrativeArea": "NSW",
"locality": "Concord West",
"addressLines": [
"Killoola St",
"1"
]
}
}
}
},
"totalPrice": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "AUD",
"units": "43",
"nanos": 100000000
}
},
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension",
"availableFulfillmentOptions": [
{
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "P0M"
}
}
}
]
},
"otherItems": [
{
"name": "Delivery fee",
"price": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "AUD",
"units": "3",
"nanos": 500000000
}
},
"type": "DELIVERY"
}
]
},
"paymentOptions": {
"googleProvidedOptions": {
"facilitationSpecification": "{\"apiVersion\":2,\"apiVersionMinor\":0,\"merchantInfo\":{\"merchantName\":\"merchantName\"},\"allowedPaymentMethods\":[{\"type\":\"CARD\",\"parameters\":{\"allowedAuthMethods\":[\"PAN_ONLY\"],\"allowedCardNetworks\":[\"VISA\",\"MASTERCARD\"],\"billingAddressRequired\":true,\"cvcRequired\":false},\"tokenizationSpecification\":{\"type\":\"PAYMENT_GATEWAY\",\"parameters\":{\"gatewayMerchantId\":\"YOUR_MERCHANT_ID\",\"gateway\":\"cybersource\"}}}],\"transactionInfo\":{\"currencyCode\":\"AUD\",\"totalPriceStatus\":\"ESTIMATED\",\"totalPrice\":\"43.1\"}} "
}
},
"additionalPaymentOptions": [
{
"actionProvidedOptions": {
"paymentType": "ON_FULFILLMENT",
"displayName": "Pay when you get your food.",
"onFulfillmentPaymentData": {
"supportedPaymentOptions": []
}
}
}
]
}
}
}
]
}
}
}
リクエストに失敗しました
購入手続きリクエストが失敗した場合、CheckoutResponseMessage
は次のことを行う必要があります
含まれる FoodErrorExtension
には、
FoodOrderError
発生したエラーを説明する項目です復元可能な Pod に
注文に関するエラー(カート内の商品の価格変更など)
FoodErrorExtension
には correctedProposedOrder
を含める必要があります。
失敗のレスポンスの例
{
"expectUserResponse": false,
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"error": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension",
"foodOrderErrors": [
{
"error": "CLOSED",
"description": "The restaurant is closed."
}
]
}
}
}
]
}
}
}
購入手続きの実装
購入手続きを実装する際は、次の手順を行う必要があります。
サービスを検証する
最初のサービスエラーに対しては FoodOrderError を返します。 できます。これらのエラーは復元できないため、最初に発生したエラーは 返されます。詳細については、エラーの処理をご覧ください。 検出できます。
- FulfillmentOptionInfo プロパティを
フルフィルメント タイプが
delivery
かpickup
かを判断するリクエスト。 必要に応じて、次のエラータイプを返します。
エラーのタイプ ユースケース 無効 フルフィルメント タイプが無効です。 NOT_FOUND フルフィルメント タイプが見つかりません。 クローズ - 注文に OperationHours 時間枠はありません。
- 注文はできるだけ早く注文であり、現在の時間で利用できる ASAP ServiceHours はありません。
- 緊急閉鎖であるか、サービス
isDisabled
が true です。
UNAVAILABLE_SLOT 事前注文を処理することはできません。 NO_CAPACITY レストランは混み合っており、現在注文を受け付けていません。 OUT_OF_SERVICE_AREA 注文をお客様の住所に配送できない。例については、配送先住所の検証をご覧ください。 NO_COURIER_AVAILABLE 配達担当者が不足しているため、注文を配達できません。
カートの検証と価格設定
各 Cart.
lineItems
を参照し、 販売者のシステムにあるかを確認します「 MenuItemOffer.sku
の値が含まれています。 LineItem として設定します。offerId
。作成: FoodOrderError が返されます。作成: 各商品アイテムにつき最大 1 件のエラーが表示されます。次のエラータイプを返します。 必要な場合:エラーのタイプ ユースケース 回復できる 無効 商品データかオプション データのいずれかが無効です。 いいえ NOT_FOUND アイテムまたはいずれかのオプションが見つかりません。 いいえ PRICE_CHANGED アイテムまたはアドオンの組み合わせの価格が変更された。このエラーは回復可能なものとして扱うことができます。 ○ AVAILABILITY_CHANGED 広告申込情報またはいずれかのオプションに対してリクエストされた金額は使用できません。 ○ REQUIREMENTS_NOT_MET 最低注文額または最高注文額に達していません。判断するには、カートの価格が料金. eligibleTransactionVolumeMin
を下回っているか、料金を上回っているかどうかを確認します。eligibleTransactionVolumeMax
。最低注文額の検証の例をご覧ください。いいえ 広告申込情報の検証済みのリスト(LineItemType を含む)を返します。
REGULAR
。カートのすべての広告申込情報の価格の合計が、SUBTOTAL
。
カートアイテムの検証の例をご覧ください。
サービス手数料を計算する
- 以下に基づいて、サービスの正しい [Fee] エンティティを見つけます。
eligibleRegion
、validFrom
、validThrough
、priority
- エンティティが
price
で定義されているかどうかに基づいて、料金を計算します。percentageOfCart
またはpricePerMeter
プロパティ。 - 宅配またはテイクアウトのサービス料金を LineItem として返します。
LineItemType は
DELIVERY
またはFEE
です。料金を追加する Cart.otherItems
リストに追加します。
プロモーションの適用
- 一致条件に基づいて [Deal] エンティティを見つけます。
プロモーション.
coupon
の値を Deal に置き換える。dealCode
取引を検証し、必要に応じて FoodOrderError を返します。 これらのエラーは回復可能なものとして扱うことができます。次のエラータイプを返す 必要な場合:
エラーのタイプ ユースケース PROMO_NOT_RECOGNIZED クーポンコードを認識できませんでした。 PROMO_EXPIRED ディールの有効期間が切れています。 PROMO_ORDER_INELIGIBLE 注文にクーポンを適用できません。 PROMO_NOT_APPLICABLE その他の理由。 状況に応じて、カートの合計または手数料の合計を使用して、ディール価格を適用します。 お得。
dealType
。プロモーションを適用したカート.
promotions
を返します。プロモーションを、次の内容を含む LineItem として返します。 LineItemType
DISCOUNT
。割引を Cart。価格が負のotherItems
リスト。
レスポンスを返す
- ProposedOrder.
cart
を作成します。レスポンス カートは 検証中にエラーが発生しない場合はリクエスト カートと同じになります。 - ProposedOrder.
otherItems
リストを返します。リストには 税金、手数料、チップ、割引が適用される場合。Gratuity を参照: チップを設定する詳しい方法を確認できます。 - カートを追加して ProposedOrder.
totalPrice
を含めます 料金、手数料、割引、税金、チップなどです。 - 返品
FoodOrderExtension.
availableFulfillmentOptions
と、 該当する FulfillmentOption。推定データを更新する 受け取りまたは配送の時間を予定時刻まで遅らせます。 - 前述の検証チェックで生成された FoodOrderErrors がある場合:
<ph type="x-smartling-placeholder">
- </ph>
- StructuredResponse.
error
と FoodErrorExtension.foodOrderErrors
のエラー。 - ProposedOrder を
すべてのエラーが復元可能な場合は
correctedProposedOrder
フィールド。 paymentOptions
で PaymentOptions を返します。 すべてのエラーが回復可能な場合は、このフィールドに値を設定します。- 他にもタグがある場合は、必要に応じて
additionalPaymentOptions
を含めます。 エラーは復元可能です。
- StructuredResponse.
- 検証エラーがなければ
proposedOrder
を返します。 CheckoutResponse オブジェクトのpaymentOptions
。 他にもタグがある場合は、必要に応じてadditionalPaymentOptions
を含めます。 お支払いオプションを利用できます。