프로모션

프로모션을 통해 판매자와 Google은 고객이 다음 액션을 취하도록 유도할 수 있습니다. 할인된 가격으로 음식 주문 서비스를 이용해 보세요. Google 지원 주문 엔드 투 엔드 작업을 프로모션 관리와 통합 있습니다.

다음과 같은 유형의 할인이 지원됩니다.

  • Google 스폰서 프로모션 코드: 자동으로 생성되는 프로모션 코드입니다. 사전 입력되어 있거나 사용자가 입력한 값입니다.
  • 서드 파티 스폰서 프로모션 코드: 사용자가 입력하는 프로모션 코드입니다. 피드할 수 있습니다.
  • 서드 파티 후원 자동 할인: 음식에 적용되는 할인입니다. 프로모션 코드 없이 자동으로 적용됩니다.

할인 유형과 관계없이 Google에서 음식에 대해 결제 호출을 보냅니다. 주문 처리를 사용하여 할인을 확인하고 적용합니다.

음식 주문 서비스 개발자는 몇 가지 사항을 변경해야 합니다. 유효한 프로모션 코드에 대한 할인을 계산하거나 잘못된 프로모션 코드 관련 오류, 프로모션 코드 사용 관리 환급을 위한 회계 데이터를 추적할 수 있습니다.

프로모션 처리 방법

프로모션을 지원하는 처리를 구현하려면 다음 단계를 따르세요.

  1. 프로모션 통합 설정 (건너뛰기 단계를 따르세요.
  2. 프로모션으로 결제를 구현합니다.
  3. 프로모션으로 주문 제출을 구현합니다.

프로모션 통합 설정

이 섹션에서는 Google 스폰서 프로모션 코드 프로모션 코드만 지원하려는 경우 또는 직접 설정을 지정한 다음 건너뛸 수 있으며, 이 섹션을 참조하세요.

Google은 후원할 프로모션 유형을 지정하고 방법을 알아보겠습니다 Google에서는 다음과 같은 세부정보를 제공합니다.

  • 할인 금액입니다.
  • 장바구니의 최소 금액입니다.
  • 프로모션 코드 사용 시작일 및 종료일
  • 프로모션 캠페인에 책정된 최대 예산(달러)입니다.
  • 프로모션 코드를 사용할 수 있는 횟수입니다.

프로모션 코드의 예:

  • FopaNewUser: 10% (고정 비율), 최대 $50 할인
  • FopaMoreThan50: $10 (고정 금액 할인).

Google에서 코드 적용을 중단하면 연락을 드립니다.

지불 설정

지불 절차를 설정하려면 Google EAP 컨설턴트에게 문의하세요. Google은 Google 후원 프로모션과 관련된 거래만 상환합니다. 최종 주문 상태가 다음 중 하나인 경우 코드를 반환합니다.

  • CONFIRMED
  • IN_TRANSIT
  • READY_FOR_PICKUP
  • IN_PREPARATION
  • FULFILLED

프로모션으로 결제 구현

이 섹션에서는 다음을 지원하는 경우 결제 처리 구현을 설명합니다. 프로모션 코드 (Google 후원 또는 타사 후원) 대상 서드 파티 스폰서 자동 할인을 사용하면 해당 할인만 반환하거나 CheckoutResponseMessage의 광고 항목 (프로모션 코드 확인은 합니다.

음식 주문이 처리되는 동안 Google은 CheckoutRequestMessage를 처리에 추가합니다. 사용자가 장바구니를 변경하거나 프로모션 코드를 사용할 수 없습니다.

사용자가 프로모션 코드를 처음 적용했는지 확인하려면 있습니다.

  • Google 스폰서 프로모션 코드: Google은 재방문자가 다음에 해당하는지 확인합니다. 동일한 프로모션 코드를 다시 사용하려고 합니다. 별도의 조치가 필요하지 않습니다.
  • 서드 파티 스폰서 프로모션 코드 또는 자동 할인: 계정 연결 및 사용자 선택이 구현되지 않은 경우 확인할 수 없습니다. 사용자의 세부정보를 확인할 수 있습니다 대신 SubmitOrderRequestMessage를 처리하는 동안 Contact를 사용하여 FoodCartExtension의 세부정보 (예: 사용자의 이메일 주소) 객체를 지정합니다.

최신 상태를 기반으로 처리에서 오류를 파악하거나 할인을 계산하세요. 있습니다. 이 작업을 수행할 때는 시스템이 비활성 상태로 유지되지 않도록 확인할 수 있습니다

프로모션 코드 유효성 확인

처리에서는 특정 프로모션의 유효성 또는 자격요건을 확인해야 합니다. 규정된 조건에 어긋나지 않도록 최대 할인액을 기준으로 할 수 있습니다. 그런 다음 CheckoutResponseMessage에서 적절하게 대응합니다. 계산된 할인 적용 또는 프로모션 코드가 적용된 경우 foodOrderErrors 을(를) 적용할 수 없습니다. 프로모션 코드에 오류가 있는 경우 프로모션 오류 처리에 설명된 절차를 따르세요.

다음 스니펫은 프로모션 코드의 foodOrderErrors 예를 보여줍니다. correctedProposedOrder에 프로모션이 포함되어 있지 않은지 확인하세요. 노드입니다

"foodOrderErrors": [
  {
    "error": "PROMO_NOT_APPLICABLE",
    // Copy promotions.coupon string from CheckoutRequest as the ID
    "id": "GoogleNewUser",
    "description": "Promotion could not be applied"
  }
],
"correctedProposedOrder": {// required ...},
"paymentOptions": {// required ...}

컴퓨팅 할인

프로모션 코드가 유효하면 처리에서 할인을 계산해야 합니다. 달러 값을 다시 얻고 CheckoutResponseMessage otherItems 배열의 할인 값입니다. 총 주문 가격은 다음과 같을 수 없습니다. 음수입니다. 할인 금액이 장바구니 금액을 초과하는 경우 최대 달러 금액을 변경하여 총 주문 가격을 0달러로 렌더링합니다.

다음 스니펫은 CheckoutResponseMessage 섹션 예시를 보여줍니다. 프로모션 할인:

"proposedOrder": {
   "otherItems": [
      . . .
      {
        "name": "Discount",
        // copy promotions.coupon field from CheckoutRequest as the id
        "id": "GoogleNewUser",
        "price": {
          "type": "ESTIMATE",
          "amount": {
          "currencyCode": "USD",
          "units": "-3",
          "nanos": -500000000
        }
      },
      "type": "DISCOUNT",
    }
  ]
}

사용하지 않는 프로모션 해제

모든 결제 요청이 주문 제출 요청으로 이어지는 것은 아닙니다. 주문 처리가 결제 통화 시간에 프로모션을 보류합니다. 이를 통해 프로모션이 소유권 주장이 제기되지 않은 경우 보류를 해제할 수 있는 메커니즘을 제공합니다. 특정 기간이 지난 후에 주문을 제출할 수 있습니다. 이렇게 하면 음식이 주문 서비스가 올바른 캠페인 할당량을 유지하는지 확인합니다.

프로모션 오류 처리

처리 과정에서 특정 상품의 프로모션 코드가 CheckoutRequestMessage이 (가) 잘못되었습니다. 예를 들어 만료되었거나 유효하지 않습니다. 인식되지 않음) foodOrderError와 함께 CheckoutResponseMessage를 전송합니다. 오류 코드, 이유 텍스트, 오류 메시지, correctedProposedOrderpaymentOptions 객체

처리에서 동일한 요청에서 프로모션 코드 오류가 여러 개 발견된 경우 복구 불가능한 오류를 다시 보내기 전에 복구할 수 없는 오류를 다시 보내야 합니다. 다음과 같이 확인의 우선순위를 지정합니다 (높은 우선순위에서 낮은 우선순위).

  • PROMO_NOT_RECOGNIZED
  • PROMO_EXPIRED
  • PROMO_USER_INELIGIBLE
  • PROMO_ORDER_INELIGIBLE
  • PROMO_NOT_APPLICABLE

다음은 프로모션 코드가 포함된 결제 요청의 예입니다.

{
    "accessToken": "test_access_token",
    "lastSeen": "2018-06-22T19:25:39Z"
  },
  "conversation": {
    "conversationId": "XYZ"
  },
  "inputs": [
    {
      "intent": "actions.foodordering.intent.CHECKOUT",
      "arguments": [
        {
          "extension": {
            "@type": "type.googleapis.com/google.actions.v2.orders.Cart",
            "merchant": {
              "id": "https://www.exampleprovider.com/merchant/id1",
              "name": "Falafel Bite"
            },
            "lineItems": [
              {
                "name": "Falafel Tray",
                "type": "REGULAR",
                "id": "sample_item_offer_id_1",
                "quantity": 1,
                "price": {
                  "type": "ESTIMATE",
                  "amount": {
                    "currencyCode": "USD",
                    "units": "9",
                    "nanos": 950000000
                  }
                },
                "offerId": "https://www.exampleprovider.com/menu/item/offer/id1",
                "extension": {
                  "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension"
                }
              }
            ],
            "promotions": [
              {
                "coupon": "FOPAACTIVECODE"
              }
            ],
            "extension": {
              "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
              "fulfillmentPreference": {
                "fulfillmentInfo": {
                  "pickup": {
                    "pickupTimeIso8601": "P0M"
                  }
                }
              }
            }
          }
        }
      ]
    }
  ],
  "directActionOnly": true,
  "isInSandbox": true
}

다음은 프로모션이 유효한지 확인합니다.

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "checkoutResponse": {
              "proposedOrder": {
                "otherItems": [
                  {
                    "name": "Delivery Fees",
                    "price": {
                      "type": "ESTIMATE",
                      "amount": {
                        "currencyCode": "USD",
                        "units": "3",
                        "nanos": 500000000
                      }
                    },
                    "type": "DELIVERY"
                  },
                  {
                    "name": "Tax",
                    "price": {
                      "type": "ESTIMATE",
                      "amount": {
                        "currencyCode": "USD",
                        "units": "1",
                        "nanos": 370000000
                      }
                    },
                    "type": "TAX"
                  },
                  {
                    "name": "Promotion",
                    "price": {
                      "type": "ESTIMATE",
                      "amount": {
                        "currencyCode": "USD",
                        "units": "-5",
                        "nanos": 0
                      }
                    },
                    "id": "FOPAACTIVECODE",
                    "type": "DISCOUNT"
                  }
                ],
                "cart": {
                  "merchant": {
                    "id": "https://www.exampleprovider.com/merchant/id1",
                    "name": "Falafel Bite"
                  },
                  "lineItems": [
                    {
                      "name": "Falafel Tray",
                      "type": "REGULAR",
                      "id": "2529103",
                      "quantity": 1,
                      "price": {
                        "type": "ESTIMATE",
                        "amount": {
                          "currencyCode": "USD",
                          "units": "9",
                          "nanos": 950000000
                        }
                      },
                      "offerId": "https://www.exampleprovider.com/menu/item/offer/id1",
                      "extension": {
                        "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension"
                      }
                    }
                  ],
                  "promotions": [
                    {
                      "coupon": "FOPAACTIVECODE"
                    }
                  ],
                  "extension": {
                    "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
                    "fulfillmentPreference": {
                      "fulfillmentInfo": {
                        "pickup": {
                          "pickupTimeIso8601": "P0M"
                        }
                      }
                    }
                  }
                },
                "totalPrice": {
                  "type": "ESTIMATE",
                  "amount": {
                    "currencyCode": "USD",
                    "units": "9",
                    "nanos": 820000000
                  }
                },
                "extension": {
                  "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension",
                  "availableFulfillmentOptions": [
                    {
                      "fulfillmentInfo": {
                        "pickup": {
                          "pickupTimeIso8601": "P0M"
                        }
                      },
                      "expiresAt": "2018-06-22T19:30:52.596Z"
                    }
                  ]
                }
              },
              "orderOptions": {},
              "paymentOptions": {
                "googleProvidedOptions": {
                  "tokenizationParameters": {
                    "tokenizationType": "PAYMENT_GATEWAY",
                    "parameters": {
                      "gateway": "stripe",
                      "stripe:publishableKey": "example_stripe_client_key",
                      "stripe:version": "2017-04-06"
                    }
                  },
                  "supportedCardNetworks": [
                    "AMEX",
                    "DISCOVER",
                    "MASTERCARD",
                    "VISA",
                    "JCB"
                  ],
                  "prepaidCardDisallowed": true
                }
              }
            }
          }
        }
      ],
      "suggestions": []
    }
  }
}

다음은 프로모션 코드가 잘못된 경우의 결제 응답 예입니다.

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "error": {
              "foodOrderErrors": [
                {
                  "error": "PROMO_NOT_RECOGNIZED",
                  "id": "SOMEPROMO",
                  "description": "Coupon not found"
                }
              ],
              "correctedProposedOrder": {
                "cart": {
                  "merchant": {
                    "id": "https://www.exampleprovider.com/merchant/id1",
                    "name": "Falafel Bite"
                  },
                  "lineItems": [
                    {
                      "id": "sample_item_offer_id_4",
                      "name": "Prawns Biryani",
                      "type": "REGULAR",
                      "quantity": 1,
                      "price": {
                        "type": "ESTIMATE",
                        "amount": {
                          "currencyCode": "USD",
                          "units": "18",
                          "nanos": 750000000
                        }
                      },
                      "offerId": "https://www.exampleprovider.com/menu/item/offer/id4",
                      "extension": {
                        "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension"
                      }
                    }
                  ],
                  "extension": {
                    "fulfillmentPreference": {
                      "fulfillmentInfo": {
                        "pickup": {
                          "pickupTimeIso8601": "P0M"
                        }
                      }
                    },
                    "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension"
                  },
                  "promotions": []
                },
                "otherItems": [
                  {
                    "name": "Tax",
                    "type": "TAX",
                    "price": {
                      "type": "ESTIMATE",
                      "amount": {
                        "currencyCode": "USD",
                        "units": "1",
                        "nanos": 650000000
                      }
                    }
                  }
                ],
                "termsOfServiceUrl": "https://exampleprovider.com/terms",
                "totalPrice": {
                  "type": "ESTIMATE",
                  "amount": {
                    "currencyCode": "USD",
                    "units": "20",
                    "nanos": 400000000
                  }
                },
                "extension": {
                  "availableFulfillmentOptions": [
                    {
                      "fulfillmentInfo": {
                        "pickup": {
                          "pickupTimeIso8601": "PT0M"
                        }
                      }
                    }
                  ],
                  "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension"
                }
              },
              "paymentOptions": {
                "googleProvidedOptions": {
                  "prepaidCardDisallowed": false,
                  "billingAddressRequired": true,
                  "tokenizationParameters": {
                    "tokenizationType": "PAYMENT_GATEWAY",
                    "parameters": {
                      "gateway": "braintree",
                      "braintree:apiVersion": "v1",
                      "braintree:sdkVersion": "1.4.0",
                      "braintree:merchantId": "example_braintree_merchant_ID",
                      "braintree:clientKey": "example_braintree_client_key",
                      "braintree:authorizationFingerprint": "example_braintree_fingerprint"
                    }
                  }
                }
              },
              "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension"
            }
          }
        }
      ]
    }
  }
}

프로모션으로 주문 제출 구현

주문 처리 제출에서 이번이 첫 주문인지 확인합니다. 사용자가 프로모션 코드를 적용하고 있습니다. SubmitOrderRequestMessage 동안 Contact 세부정보 (예: 사용자의 이메일 주소)을 FoodCartExtension 객체에서 가져옵니다.

또한 프로모션 코드의 적용 여부도 다시 확인해야 합니다.

  • 코드가 적용되는 경우: 주문을 확인하고 쿠폰을 사용됨으로 표시합니다.
  • 코드를 더 이상 적용할 수 없는 경우: PROMO_NOT_APPLICABLE 오류 구체적인 거부 사유를 입력할 수 있습니다. FoodOrderUpdateExtension와 동일한 메커니즘을 사용합니다.

다음은 프로모션이 포함된 주문 제출 요청의 예입니다.

{
  "conversation": {
    "conversationId": "example_conversation_ID"
  },
  "inputs": [
    {
      "intent": "actions.intent.TRANSACTION_DECISION",
      "arguments": [
        {
          "transactionDecisionValue": {
            "order": {
              "finalOrder": {
                "cart": {
                  "merchant": {
                    "id": "https://www.exampleprovider.com/merchant/id1",
                    "name": "Falafel Bite"
                  },
                  "lineItems": [
                    {
                      "name": "Falafel Tray",
                      "type": "REGULAR",
                      "id": "sample_item_offer_id_1",
                      "quantity": 1,
                      "price": {
                        "type": "ESTIMATE",
                        "amount": {
                          "currencyCode": "USD",
                          "units": "9",
                          "nanos": 950000000
                        }
                      },
                      "offerId": "https://www.exampleprovider.com/menu/item/addon/offer/id1",
                      "extension": {
                        "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension"
                      }
                    }
                  ],
                  "promotions": [
                    {
                      "coupon": "FOPAACTIVECODE"
                    }
                  ],
                  "extension": {
                    "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
                    "fulfillmentPreference": {
                      "fulfillmentInfo": {
                        "pickup": {
                          "pickupTimeIso8601": "P0M"
                        }
                      }
                    },
                    "contact": {
                      "displayName": "Food Ordering",
                      "email": "example.provider@gmail.com",
                      "phoneNumber": "+19993334444",
                      "firstName": "Food",
                      "lastName": "Ordering"
                    }
                  }
                },
                "otherItems": [
                  {
                    "name": "Delivery Fees",
                    "type": "DELIVERY",
                    "price": {
                      "type": "ESTIMATE",
                      "amount": {
                        "currencyCode": "USD",
                        "units": "3",
                        "nanos": 500000000
                      }
                    }
                  },
                  {
                    "name": "Tax",
                    "type": "TAX",
                    "price": {
                      "type": "ESTIMATE",
                      "amount": {
                        "currencyCode": "USD",
                        "units": "1",
                        "nanos": 370000000
                      }
                    }
                  },
                  {
                    "name": "Promotion",
                    "type": "DISCOUNT",
                    "price": {
                      "type": "ESTIMATE",
                      "amount": {
                        "currencyCode": "USD",
                        "units": "-5"
                      }
                    },
                    "id": "FOPAACTIVECODE"
                  },
                  {
                    "name": "Subtotal",
                    "type": "SUBTOTAL",
                    "price": {
                      "type": "ESTIMATE",
                      "amount": {
                        "currencyCode": "USD",
                        "units": "9",
                        "nanos": 950000000
                      }
                    }
                  },
                  {
                    "name": "Tip",
                    "type": "GRATUITY",
                    "price": {
                      "type": "ESTIMATE",
                      "amount": {
                        "currencyCode": "USD"
                      }
                    }
                  }
                ],
                "totalPrice": {
                  "type": "ESTIMATE",
                  "amount": {
                    "currencyCode": "USD",
                    "units": "9",
                    "nanos": 820000000
                  }
                },
                "extension": {
                  "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension"
                }
              },
              "googleOrderId": "example_google_order_ID",
              "orderDate": "2018-06-22T19:30:59.502Z",
              "paymentInfo": {
                "displayName": "example_display_name",
                "googleProvidedPaymentInstrument": {
                  "instrumentToken": "example_instrument_token"
                },
                "paymentType": "PAYMENT_CARD"
              },
              "locale": "en"
            }
          }
        }
      ]
    }
  ],
  "directActionOnly": true,
  "isInSandbox": true
}

다음은 fulfillment의 해당 제출 주문 응답의 예입니다. 프로모션 코드가 유효한 경우

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "orderUpdate": {
              "actionOrderId": "example_action_order_ID",
              "orderState": {
                "state": "CREATED",
                "label": "Order is created with partner."
              },
              "updateTime": "2018-06-22T19:31:01.556Z",
              "orderManagementActions": [
                {
                  "type": "CALL_RESTAURANT",
                  "button": {
                    "title": "Call Us",
                    "openUrlAction": {
                      "url": "tel:+1-111-111-1111"
                    }
                  }
                },
                {
                  "type": "EMAIL",
                  "button": {
                    "title": "Email Us",
                    "openUrlAction": {
                      "url": "mailto:example.provider@gmail.com"
                    }
                  }
                },
                {
                  "type": "CUSTOMER_SERVICE",
                  "button": {
                    "title": "Customer Service",
                    "openUrlAction": {
                      "url": "http://www.google.com"
                    }
                  }
                }
              ]
            }
          }
        }
      ],
      "suggestions": []
    }
  }
}

다음은 프로모션 코드가 잘못된 경우의 주문 제출 응답의 예입니다.

"orderUpdate": {
  "actionOrderId": "sample_action_order_id",
  "orderState": {
    "state": "REJECTED",
    "label": "Order rejected."
  },
  "updateTime": "2017-05-10T02:30:00.000Z",
  "rejectionInfo": {
    "type": "PROMO_NOT_APPLICABLE",
    "reason": "Sorry, there's something wrong. Try another code?"
  },
  "orderManagementActions": [
    {
      "type": "CUSTOMER_SERVICE",
      "button": {
        "title": "Contact customer service",
        "openUrlAction": {
          "url": "mailto:support@example.com"
        }
      }
    },
    {
      "type": "EMAIL",
      "button": {
        "title": "Email restaurant",
        "openUrlAction": {
          "url": "mailto:example.provider@example.com"
        }
      }
    },
    {
      "type": "CALL_RESTAURANT",
      "button": {
        "title": "Call restaurant",
        "openUrlAction": {
          "url": "tel:+19993334444"
        }
      }
    }
  ],
  "infoExtension": {
    "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension",
    "foodOrderErrors": [
      {
        "error": "PROMO_USER_INELIGIBLE",
        "description": "Sorry, you can only use this promotion once."
      }
    ]
  }
}