Promocje to sposób na zachęcenie klientów do wypróbuj usługę zamawiania jedzenia ze zniżką. Zespół pomocy Google zintegrowanie kompleksowych działań związanych z zamawianiem z zarządzaniem promocjami. systemu.
Obsługiwane są te typy rabatów:
- Kody promocyjne sponsorowane przez Google: kody promocyjne, które są automatycznie wstępnie wypełnione przez Google lub wpisane przez użytkowników.
- Kody promocyjne sponsorowane przez firmy zewnętrzne: kody promocyjne do wykorzystania przez użytkowników, dostarcza firma zamawiająca jedzenie.
- Automatyczne rabaty sponsorowane przez inne firmy: rabaty na jedzenie usługa do składania zamówień jest stosowana automatycznie bez kodu promocyjnego.
Niezależnie od rodzaju rabatu Google nawiązuje połączenie z płatnością do jedzenia realizacji zamówienia, aby zweryfikować i zastosować rabat.
Jako deweloper usługi zamawiania jedzenia musisz wprowadzić pewne zmiany w swojej implementacji, aby obliczyć rabaty za prawidłowe kody promocyjne lub wysłać błędy dotyczące nieprawidłowych kodów promocyjnych, zarządzanie wykorzystaniem kodu promocyjnego oraz śledzić dane księgowe dotyczące zwrotu kosztów.
Jak przetwarzać promocje
Aby wdrożyć realizację obsługującą promocje, wykonaj te czynności:
- Skonfiguruj integrację promocji. (Pomiń to jeśli nie używasz kodów promocyjnych sponsorowanych przez Google).
- Wdrażanie procesu płatności w promocjach.
- Wdróż przesyłanie zamówienia z promocjami.
Skonfiguruj integrację promocji
Z tej sekcji dowiesz się, jak skonfigurować integrację promocji, jeśli planujesz używać Kody promocyjne sponsorowane przez Google. Jeśli chcesz obsługiwać tylko kody promocyjne lub możesz określić własną konfigurację i pominąć w tej sekcji.
Google określa typ promocji, którą ma sponsorować, i kontaktuje się z Tobą, aby ją ustawić podczas integracji. Podajemy następujące informacje:
- Kwota rabatu.
- Minimalna wartość koszyka.
- Data rozpoczęcia i zakończenia korzystania z kodów promocyjnych.
- Maksymalna kwota w dolarach przeznaczona na kampanię promocyjną.
- Liczba wykorzystanych kodów promocyjnych.
Przykłady kodów promocyjnych:
FopaNewUser
: 10% (stała wartość procentowa), maksymalnie 50 USD zniżki.FopaMoreThan50
: 10 USD (stała kwota zniżki).
Jeśli firma Google zdecyduje się zatrzymać stosowanie kodu, skontaktuje się z Tobą.
Skonfiguruj wypłaty
Aby skonfigurować proces wypłaty, skontaktuj się z konsultantem Google EAP. Google zwraca koszty tylko w przypadku transakcji związanych z promocjami sponsorowanymi przez Google kody, jeśli stan ostatecznego zamówienia to jeden z tych:
CONFIRMED
IN_TRANSIT
READY_FOR_PICKUP
IN_PREPARATION
FULFILLED
Wdrażanie procesu płatności w promocjach
Z tej sekcji dowiesz się, jak wdrożyć przetwarzanie płatności, jeśli obsługujesz
kodów promocyjnych (sponsorowanych przez Google lub innych firm). Dla:
rabaty automatyczne sponsorowane przez inne firmy, musisz tylko zwrócić rabat
elementu zamówienia w CheckoutResponseMessage
(nie można sprawdzić kodu promocyjnego
).
Podczas realizacji zamówienia jedzenia Google wysyła pojedynczy kod promocyjny w sekcji
CheckoutRequestMessage
do realizacji transakcji. Użytkownicy mogą zmienić koszyk lub
kodu promocyjnego w przypadku powtarzających się próśb o dokonanie płatności.
Aby sprawdzić, czy użytkownik zastosuje kod promocyjny po raz pierwszy, wykonaj :
- Kody promocyjne sponsorowane przez Google: Google sprawdza, czy powracający użytkownik ponowne użycie tego samego kodu promocyjnego; nie musisz nic robić.
- Kody promocyjne sponsorowane przez inne firmy lub rabaty automatyczne: jeśli masz
nie zaimplementowano funkcji łączenia kont i akceptacji użytkownika, nie będzie można sprawdzić
danych użytkownika w trakcie przetwarzania żądania płatności. Zamiast tego sprawdź, czy
podczas przetwarzania danych
SubmitOrderRequestMessage
przy użyciu algorytmuContact
szczegóły (takie jak adres e-mail użytkownika) zFoodCartExtension
obiektu.
Identyfikuj błędy lub obliczaj rabaty związane z realizacją na podstawie najnowszych do kasy. Podczas wykonywania tych czynności upewnij się, że system nie zawiera nieaktualnych wersji informacji stanowych.
Sprawdź ważność kodu promocyjnego
W ramach realizacji transakcji należy sprawdzić, czy promocja jest ważna lub kwalifikuje się do niej
przed określonymi warunkami, takimi jak data ważności, maksymalne wykorzystanie
maksymalnego rabatu. Następnie odpowiedz poprawnie na CheckoutResponseMessage
z obliczonym rabatem lub foodOrderErrors
, jeśli kod promocyjny
nie można zastosować. Jeśli zauważysz błędy w kodzie promocyjnym, postępuj zgodnie z
proces opisany w artykule Obsługa błędów w promocjach.
Poniżej znajduje się przykład kodu promocyjnego foodOrderErrors
.
Upewnij się, że atrybut correctedProposedOrder
nie zawiera promocji
do węzła.
"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 ...}
Rabaty na moc obliczeniową
Jeśli kod promocyjny jest prawidłowy, wartość rabatu powinna zostać obliczona w ramach realizacji zamówienia.
i odesłać CheckoutResponseMessage
z obliczoną wartością
wartość rabatu w tablicy otherItems
. Łączna cena zamówienia nie może być
negatywne. Jeśli kwota rabatu przekracza wartość koszyka, odeślij
to maksymalna kwota w dolarach, dzięki której łączna cena zamówienia wyniesie 0 USD.
Ten fragment kodu zawiera przykładową sekcję CheckoutResponseMessage
dla usługi
rabat promocyjny:
"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",
}
]
}
Publikowanie nieużywanych promocji
Nie każde żądanie płatności prowadzi do przesłania prośby o zamówienie. Jeśli Twoje realizację wstrzyma promocję w momencie płatności, upewnij się, że masz mechanizmu zdejmowania blokady w przypadku, gdy nie zgłoszono praw do promocji. po upływie określonego czasu. Dzięki temu Twoje jedzenie usługa zamawiania zachowuje właściwy limit kampanii.
Postępowanie w przypadku błędów w promocjach
Jeśli w wyniku realizacji zamówienia kod promocyjny z
Parametr CheckoutRequestMessage
jest nieprawidłowy (np. utracił ważność, jest nieprawidłowy,
lub nie rozpoznano), wyślij CheckoutResponseMessage
z identyfikatorem foodOrderError
zawierający odpowiedni kod błędu i tekst przyczyny, a także
correctedProposedOrder
i paymentOptions
obiekty.
Jeśli podczas realizacji tego samego żądania wykryjemy kilka błędów związanych z kodem promocyjnym, odesłanie informacji o błędach możliwych do naprawienia przed wysłaniem ich z powrotem. Określ priorytety kontroli w następujący sposób (od najwyższego do niskiego priorytetu):
PROMO_NOT_RECOGNIZED
PROMO_EXPIRED
PROMO_USER_INELIGIBLE
PROMO_ORDER_INELIGIBLE
PROMO_NOT_APPLICABLE
Przykłady
Oto przykład żądania płatności z kodem promocyjnym:
{ "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 }
Oto odpowiadająca jej odpowiedź na płatność z realizacji, jeśli promocja kod jest prawidłowy:
{ "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": [] } } }
Oto przykładowa odpowiedź na żądanie płatności, jeśli kod promocyjny jest nieprawidłowy:
{ "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" } } } ] } } }
Wdrażanie przesyłania zamówienia z promocjami
W sekcji realizacji zamówienia sprawdź, czy robisz to po raz pierwszy
użytkownik stosuje kod promocyjny. W okresie: SubmitOrderRequestMessage
możesz to sprawdzić, korzystając z szczegółów Contact
(takich jak
(adres e-mail użytkownika) z obiektu FoodCartExtension
.
Sprawdź też ponownie zastosowanie kodu promocyjnego:
- Jeśli kod jest dostępny: potwierdź zamówienie i oznacz kupon jako wykorzystany.
- Jeśli kod nie jest już aktualny: odrzuć zamówienie, używając
PROMO_NOT_APPLICABLE
błąd. Możesz podać konkretny powód odrzucenia. za pomocą tego samego mechanizmu co w przypadkuFoodOrderUpdateExtension
.
Przykłady
Oto przykład prośby o przesłanie zamówienia z promocjami:
{ "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 }
Oto przykład odpowiedniej odpowiedzi na przesłanie zamówienia w związku z realizacją zamówienia jeśli kod promocyjny jest ważny:
{ "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": [] } } }
Oto przykład odpowiedzi na przesłanie zamówienia, jeśli kod promocyjny jest nieprawidłowy:
"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." } ] } }