Werbung

Mit Angeboten können Sie und Google Kunden mit Rabatten dazu anregen, Ihren Lieferservice für Essen auszuprobieren. Google unterstützt die Einbindung Ihrer End-to-End-Aktionen für Bestellungen in Ihr Angebotsverwaltungssystem.

Die folgenden Rabatttypen werden unterstützt:

  • Von Google gesponserte Gutscheincodes:Gutscheincodes, die automatisch von Google ausgefüllt oder von Nutzern eingegeben werden.
  • Von Drittanbietern gesponserte Gutscheincodes:Gutscheincodes, die Nutzer eingeben können und die von Ihrem Lieferservice bereitgestellt werden.
  • Von Drittanbietern gesponserte automatische Rabatte:Rabatte, die Ihr Lieferservice automatisch ohne Gutscheincode anwendet.

Unabhängig von der Art des Rabatts sendet Google einen Checkout-Aufruf an Ihren Dienstleister für die Essensbestellung, um den Rabatt zu prüfen und anzuwenden.

Als Entwickler eines Lieferservice für Lebensmittel müssen Sie einige Änderungen an Ihrer Implementierung vornehmen, um Rabatte für gültige Gutscheincodes zu berechnen oder Fehler für ungültige Gutscheincodes zu senden, Einschränkungen bei der Einlösung von Gutscheincodes zu verwalten und Buchhaltungsdaten für die Erstattung zu erfassen.

Angebote verarbeiten

So implementieren Sie eine Auftragsausführung, die Angebote unterstützt:

  1. Richten Sie die Integration von Angeboten ein. (Überspringen Sie diesen Schritt, wenn Sie keine von Google gesponserten Gutscheincodes verwenden.)
  2. Bezahlvorgang mit Angeboten implementieren
  3. Implementieren Sie „Bestellung mit Angeboten senden“.

Integration von Angeboten einrichten

In diesem Abschnitt wird beschrieben, wie Sie die Einbindung von Angeboten einrichten, wenn Sie von Google gesponserte Angebotscodes verwenden möchten. Wenn Sie nur Gutscheincodes oder Rabatte unterstützen möchten, die von einem Drittanbieter gesponsert werden, können Sie Ihre eigene Einrichtung festlegen und diesen Abschnitt überspringen.

Google gibt den Typ der Werbeaktion an, die gesponsert werden soll, und kontaktiert dich, um die Integration einzurichten. Wir stellen folgende Informationen zur Verfügung:

  • Der Rabattbetrag.
  • Der Mindestwert für den Warenkorb.
  • Das Start- und Enddatum für die Verwendung der Gutscheincodes.
  • Der maximale Budgetbetrag in US-Dollar für die Angebotskampagne.
  • Wie oft die Gutscheincodes verwendet werden können.

Beispiele für Gutscheincodes:

  • FopaNewUser: 10% (fester Prozentsatz) mit einem maximalen Rabatt von 50 $.
  • FopaMoreThan50: 10 € (fester Rabattbetrag).

Sollte Google die Anwendung des Codes beenden, werden Sie benachrichtigt.

Auszahlungen einrichten

Wenden Sie sich an Ihren Google EAP-Berater, um die Auszahlung einzurichten. Google erstattet nur Transaktionen mit von Google gesponserten Gutscheincodes, wenn der endgültige Bestellstatus einer der folgenden ist:

  • CONFIRMED
  • IN_TRANSIT
  • READY_FOR_PICKUP
  • IN_PREPARATION
  • FULFILLED

Kasse mit Angeboten implementieren

In diesem Abschnitt wird beschrieben, wie Sie die Zahlungsabwicklung implementieren, wenn Sie Gutscheincodes (von Google oder Drittanbietern gesponsert) unterstützen. Bei automatischen Rabatten, die von Drittanbietern gesponsert werden, müssen Sie nur die Rabattposition in der CheckoutResponseMessage zurückgeben. Eine Überprüfung des Gutscheincodes ist nicht erforderlich.

Bei der Auftragsausführung für Essensbestellungen sendet Google einen einzelnen Gutscheincode im Feld CheckoutRequestMessage an die Auftragsausführung. Nutzer können ihren Einkaufswagen oder Gutscheincode bei wiederholten Bezahlanfragen ändern.

So prüfen Sie, ob der Nutzer zum ersten Mal einen Gutscheincode angewendet hat:

  • Von Google gesponserte Gutscheincodes: Google prüft, ob ein wiederkehrender Nutzer versucht, denselben Gutscheincode noch einmal zu verwenden. Sie müssen nichts weiter tun.
  • Von Drittanbietern gesponserte Gutscheincodes oder automatische Rabatte: Wenn Sie die Kontoverknüpfung und die Nutzeraktivierung nicht implementiert haben, können Sie die Details des Nutzers bei der Verarbeitung der Zahlungsanfrage nicht prüfen. Prüfe stattdessen während der SubmitOrderRequestMessage-Verarbeitung, ob das der Fall ist. Verwende dazu die Contact-Details (z. B. die E-Mail-Adresse des Nutzers) aus dem FoodCartExtension-Objekt.

Fehler erkennen oder Rabatte mithilfe der letzten Direktkaufanfrage berechnen Achten Sie dabei darauf, dass Ihr System keine veralteten Statusinformationen speichert.

Gültigkeit des Gutscheincodes prüfen

Bei der Abwicklung sollte die Gültigkeit oder Berechtigung eines bestimmten Aktionscodes anhand der angegebenen Bedingungen geprüft werden, z. B. Ablaufdatum, maximale Nutzung und maximaler Rabatt. Gib dann in CheckoutResponseMessage den berechneten Rabatt oder foodOrderErrors zurück, wenn der Aktionscode nicht angewendet werden kann. Wenn Sie Fehler mit dem Gutscheincode feststellen, folgen Sie der Anleitung unter Fehler bei Angeboten beheben.

Das folgende Snippet zeigt ein Beispiel für foodOrderErrors für einen Gutscheincode. Der Knoten „Angebote“ darf nicht in correctedProposedOrder enthalten sein.

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

Compute-Rabatte

Wenn der Gutscheincode gültig ist, sollte dein Fulfillment-System den Rabattwert in US-Dollar berechnen und eine CheckoutResponseMessage mit dem berechneten Rabattwert im otherItems-Array zurücksenden. Der Gesamtbestellpreis darf nicht negativ sein. Wenn der Rabatt den Betrag im Einkaufswagen übersteigt, sende den maximalen Dollarbetrag zurück, damit der Gesamtbestellpreis 0 $beträgt.

Das folgende Snippet zeigt einen Beispielabschnitt CheckoutResponseMessage für den Aktionsrabatt:

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

Nicht verwendete Angebote freigeben

Nicht jede Zahlungsanfrage führt zu einer Bestellanfrage. Wenn Ihr Fulfillment-Center bei der Kasse eine Vorautorisierung für ein Angebot vornimmt, muss es einen Mechanismus geben, mit dem die Vorautorisierung aufgehoben wird, wenn das Angebot nach einem bestimmten Zeitraum nicht über die Bestellung geltend gemacht wird. So wird sichergestellt, dass Ihr Lieferservice das richtige Kampagnenlimit einhält.

Fehler bei Angeboten verarbeiten

Wenn bei der Abwicklung festgestellt wird, dass der Gutscheincode aus einer CheckoutRequestMessage ungültig ist (z. B. abgelaufen, ungültig oder nicht erkannt), sende eine CheckoutResponseMessage mit einer foodOrderError, die den entsprechenden Fehlercode und den Grund enthält, sowie correctedProposedOrder- und paymentOptions-Objekte.

Wenn bei der Auftragsausführung mehrere Gutscheincodefehler für dieselbe Anfrage gefunden werden, senden Sie zuerst die nicht wiederherstellbaren Fehler zurück, bevor Sie die wiederherstellbaren Fehler zurücksenden. Priorisieren Sie die Prüfungen so (von hoher zu niedriger Priorität):

  • PROMO_NOT_RECOGNIZED
  • PROMO_EXPIRED
  • PROMO_USER_INELIGIBLE
  • PROMO_ORDER_INELIGIBLE
  • PROMO_NOT_APPLICABLE

Beispiele

Hier ein Beispiel für eine Zahlungsanfrage mit einem Gutscheincode:

{
    "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
}

Hier ist die entsprechende Zahlungsantwort der Auftragsausführung, wenn der Gutscheincode gültig ist:

{
  "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": []
    }
  }
}

Hier ein Beispiel für eine Antwort beim Bezahlvorgang, wenn der Gutscheincode ungültig ist:

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

„Bestellung mit Angeboten senden“ implementieren

Prüfe bei der Auftragsausführung, ob der Nutzer zum ersten Mal einen Gutscheincode anwendet. Während der Verarbeitung von SubmitOrderRequestMessage kannst du dies anhand der Contact-Details (z. B. der E-Mail-Adresse des Nutzers) aus dem FoodCartExtension-Objekt prüfen.

Prüfen Sie auch noch einmal, ob der Gutscheincode gültig ist:

  • Wenn der Code gültig ist:Bestätige die Bestellung und markiere den Gutschein als eingelöst.
  • Wenn der Code nicht mehr gültig ist:Lehne die Bestellung mit dem Fehler PROMO_NOT_APPLICABLE ab. Sie können einen bestimmten Ablehnungsgrund angeben, indem Sie denselben Mechanismus wie für FoodOrderUpdateExtension verwenden.

Beispiele

Hier ein Beispiel für eine Bestellanfrage mit Angeboten:

{
  "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
}

Hier ist ein Beispiel für die entsprechende Antwort auf die Bestellung von einem Fulfillment-Anbieter, wenn der Gutscheincode gültig ist:

{
  "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": []
    }
  }
}

Hier ein Beispiel für die Antwort, wenn der Gutscheincode ungültig ist:

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