購入手続きを設定

購入手続きは、ユーザーがカートを作成すると呼び出されます。このファイルの内容 ユーザーのカートと注文の詳細が注文手続きのエンドツーエンド ウェブに送信される あります。この情報はウェブサービスによって検証され、 必要に応じてカートに 調整を加えます

ウェブサービスの購入手続きハンドラは、POST リクエストに応答する必要があります。特定の お客様がご購入手続きを選択すると、Google は注文に関するエンドツーエンド ウェブサービスを CheckoutRequestMessage 形式の JSON リクエスト本文。次の内容が含まれます。 顧客のCartの詳細情報です。ウェブサービスは CheckoutResponseMessage。次の図は、このプロセスを示しています。

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 の支払いゲートウェイの例。

正常なレスポンスの例

{
    "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 を返します。 できます。これらのエラーは復元できないため、最初に発生したエラーは 返されます。詳細については、エラーの処理をご覧ください。 検出できます。

  1. FulfillmentOptionInfo プロパティを フルフィルメント タイプが deliverypickup かを判断するリクエスト。
  2. 必要に応じて、次のエラータイプを返します。

    エラーのタイプ ユースケース
    無効 フルフィルメント タイプが無効です。
    NOT_FOUND フルフィルメント タイプが見つかりません。
    クローズ
    • 注文に OperationHours 時間枠はありません。
    • 注文はできるだけ早く注文であり、現在の時間で利用できる ASAP ServiceHours はありません。
    • 緊急閉鎖であるか、サービス isDisabled が true です。
    特別な時間枠は、通常の時間枠よりも優先されることに注意してください。注文ウィンドウの検証の例とサービス エンティティを一時的に削除するをご覧ください。
    UNAVAILABLE_SLOT 事前注文を処理することはできません。
    NO_CAPACITY レストランは混み合っており、現在注文を受け付けていません。
    OUT_OF_SERVICE_AREA 注文をお客様の住所に配送できない。例については、配送先住所の検証をご覧ください。
    NO_COURIER_AVAILABLE 配達担当者が不足しているため、注文を配達できません。

カートの検証と価格設定

  1. Cart.lineItems を参照し、 販売者のシステムにあるかを確認します「 MenuItemOffer.sku の値が含まれています。 LineItem として設定します。offerId。作成: FoodOrderError が返されます。作成: 各商品アイテムにつき最大 1 件のエラーが表示されます。次のエラータイプを返します。 必要な場合:

    エラーのタイプ ユースケース 回復できる
    無効 商品データかオプション データのいずれかが無効です。 いいえ
    NOT_FOUND アイテムまたはいずれかのオプションが見つかりません。 いいえ
    PRICE_CHANGED アイテムまたはアドオンの組み合わせの価格が変更された。このエラーは回復可能なものとして扱うことができます。
    AVAILABILITY_CHANGED 広告申込情報またはいずれかのオプションに対してリクエストされた金額は使用できません。
    REQUIREMENTS_NOT_MET 最低注文額または最高注文額に達していません。判断するには、カートの価格が料金.eligibleTransactionVolumeMin を下回っているか、料金を上回っているかどうかを確認します。eligibleTransactionVolumeMax最低注文額の検証の例をご覧ください。 いいえ
  2. 広告申込情報の検証済みのリスト(LineItemType を含む)を返します。 REGULAR。カートのすべての広告申込情報の価格の合計が、 SUBTOTAL

カートアイテムの検証の例をご覧ください。

サービス手数料を計算する

  1. 以下に基づいて、サービスの正しい [Fee] エンティティを見つけます。 eligibleRegionvalidFromvalidThroughpriority
  2. エンティティが price で定義されているかどうかに基づいて、料金を計算します。 percentageOfCart または pricePerMeter プロパティ。
  3. 宅配またはテイクアウトのサービス料金を LineItem として返します。 LineItemTypeDELIVERY または FEE です。料金を追加する Cart.otherItems リストに追加します。

プロモーションの適用

  1. 一致条件に基づいて [Deal] エンティティを見つけます。 プロモーション.coupon の値を Deal に置き換える。dealCode
  2. 取引を検証し、必要に応じて FoodOrderError を返します。 これらのエラーは回復可能なものとして扱うことができます。次のエラータイプを返す 必要な場合:

    エラーのタイプ ユースケース
    PROMO_NOT_RECOGNIZED クーポンコードを認識できませんでした。
    PROMO_EXPIRED ディールの有効期間が切れています。
    PROMO_ORDER_INELIGIBLE 注文にクーポンを適用できません。
    PROMO_NOT_APPLICABLE その他の理由。
  3. [取引] に基づいて取引価格を計算します。discount または お買い得discountPercentage

  4. 状況に応じて、カートの合計または手数料の合計を使用して、ディール価格を適用します。 お得dealType

  5. プロモーションを適用したカート.promotions を返します。

  6. プロモーションを、次の内容を含む LineItem として返します。 LineItemType DISCOUNT。割引を Cart。価格が負の otherItems リスト。

レスポンスを返す

  1. ProposedOrder.cart を作成します。レスポンス カートは 検証中にエラーが発生しない場合はリクエスト カートと同じになります。
  2. ProposedOrder.otherItems リストを返します。リストには 税金、手数料、チップ、割引が適用される場合。Gratuity を参照: チップを設定する詳しい方法を確認できます。
  3. カートを追加して ProposedOrder.totalPrice を含めます 料金、手数料、割引、税金、チップなどです。
  4. 返品 FoodOrderExtension.availableFulfillmentOptions と、 該当する FulfillmentOption。推定データを更新する 受け取りまたは配送の時間を予定時刻まで遅らせます。
  5. 前述の検証チェックで生成された FoodOrderErrors がある場合: <ph type="x-smartling-placeholder">
      </ph>
    • StructuredResponse.errorFoodErrorExtension.foodOrderErrors のエラー。
    • ProposedOrder を すべてのエラーが復元可能な場合は correctedProposedOrder フィールド。
    • paymentOptionsPaymentOptions を返します。 すべてのエラーが回復可能な場合は、このフィールドに値を設定します。
    • 他にもタグがある場合は、必要に応じて additionalPaymentOptions を含めます。 エラーは復元可能です。
  6. 検証エラーがなければ proposedOrder を返します。 CheckoutResponse オブジェクトの paymentOptions。 他にもタグがある場合は、必要に応じて additionalPaymentOptions を含めます。 お支払いオプションを利用できます。