促销活动为您和 Google 提供了一种激励客户 不妨以折扣价试用订餐服务。Google 支持 将订购端到端操作与促销活动管理集成 系统。
支持以下类型的折扣:
- Google 赞助的促销代码:系统会自动为您 由 Google 预填充或由用户输入。
- 第三方赞助的促销代码:供用户输入的促销代码 由订餐服务提供
- 第三方赞助的自动折扣:您的食品提供的折扣 订购服务无需促销代码即可自动应用。
无论折扣类型如何,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
包含相应的错误代码和原因文本,以及
correctedProposedOrder
和 paymentOptions
对象。
如果您的履单方式发现同一请求中存在多个促销代码错误, 先发回不可恢复的错误,然后再发回可恢复的错误。 按以下优先级确定检查的优先级(从高到低):
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 }
以下是来自履单流程的相应提交订单响应的示例 如果促销代码有效:
{ "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." } ] } }