Promocje

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:

  1. Skonfiguruj integrację promocji. (Pomiń to jeśli nie używasz kodów promocyjnych sponsorowanych przez Google).
  2. Wdrażanie procesu płatności w promocjach.
  3. 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 algorytmu Contact szczegóły (takie jak adres e-mail użytkownika) z FoodCartExtension 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 przypadku FoodOrderUpdateExtension.

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."
      }
    ]
  }
}