Asynchrone Buchungen hinzufügen

Synchrone Buchungen werden in Echtzeit bestätigt oder abgelehnt.

Asynchrone Buchungen sind Buchungen, die der Händler später bestätigt oder ablehnt.

Eine Buchung wird auf Verfügbarkeitsebene als synchron oder asynchron angegeben. Das bedeutet auch, dass es für einen bestimmten Händler und eine Dienstleistung sowohl synchrone als auch asynchrone verfügbare Slots geben kann.

Um die richtige Implementierung zu bestimmen, ermitteln Sie zuerst, zu welcher Kategorie Ihr Inventar gehört:

Kriterien für asynchrone Buchungen

  • Das Ändern einer asynchronen Buchung im Actions Center wird nicht unterstützt.
  • Händler sollten die Buchung über das Onlinesystem des Partners annehmen oder ablehnen können (z.B. über den Gastgeberbereich des Restaurants). Es ist nicht zulässig, den Händler im Namen des Nutzers anzurufen, um festzustellen, ob der Händler eine Buchung annimmt oder ablehnt.
  • Händler können keine alternativen Zeiten für Buchungen vorschlagen. Die Buchungsanfrage muss im ursprünglichen Zustand angenommen oder abgelehnt werden.

Nur synchrone Buchungen aktivieren

In der Standardimplementierung sind synchrone Buchungen voreingestellt. Weitere Informationen finden Sie in der Dokumentation zur End-to-End-Integration für Terminvereinbarungen.

Asynchrone Buchung aktivieren

Wenn einige oder alle Händler einen asynchronen Buchungsvorgang verwenden, müssen die folgenden Änderungen vorgenommen werden:

  • Bestätigungsmodus:Alle Darstellungen verfügbarer Slots enthalten jetzt das Feld confirmation_mode. Damit wird beschrieben, wie Buchungen dieses verfügbaren Slots bestätigt werden. Geben Sie die confirmation_mode jedes verfügbaren Slots so an:

    • Im Verfügbarkeitsfeed wird confirmation_mode auf der Verfügbarkeitsebene angegeben.
    • In den API-Methoden des Buchungsservers wird confirmation_mode auf Slotebene angegeben.
    • In den API-Methoden für Echtzeitaktualisierungen wird confirmation_mode auf der Verfügbarkeitsebene angegeben.
  • Buchungsstatus: Alle Buchungsdarstellungen enthalten ein status-Feld, das den Status der Buchung angibt. Es wurden drei neue asynchrone Statuswerte eingeführt: PENDING_CONFIRMATION, DECLINED_BY_MERCHANT und FAILED. Verwende diese neuen Statuswerte bei der Verarbeitung von Erstellungen, Ablehnungen und Fehlern asynchroner Buchungen.
  • Buchungsaktualisierungen:Alle asynchronen Aktualisierungen des Buchungsstatus sollten über die Methode bookings.patch der Booking Notification API gemeldet werden.

Das folgende Diagramm zeigt, wie der Bestätigungsmodus und der Buchungsstatus in einer typischen asynchronen Buchungsinteraktion verwendet werden.

Abbildung 1: Asynchroner Buchungsvorgang
Abbildung 1:Asynchroner Buchungsvorgang
  1. Verfügbarkeitsfeeds wurden aktualisiert, sodass der Bestätigungsmodus jedes verfügbaren Slots angegeben wird. Es ist wichtig, diese Informationen im Feed zu haben, damit wir dem Nutzer die asynchrone Buchung schon früh im Prozess erklären können.
  2. Wenn BatchAvailabilityLookup oder CheckAvailability aufgerufen wird, übergeben Sie den Bestätigungsmodus und idealerweise denselben Bestätigungsmodus, der zurückgegeben werden soll. So wird sichergestellt, dass dem Nutzer die richtige Botschaft angezeigt wird.
  3. Wenn CreateBooking aufgerufen wird, übergeben wir den Bestätigungsmodus, um den erwarteten Bestätigungsmodus anzugeben. Wenn die asynchrone Buchungsanfrage gesendet wird, wird die Buchung mit dem Status PENDING_MERCHANT_CONFIRMATION zurückgegeben.
  4. Wenn der Händler eine Buchungsanfrage annimmt oder ablehnt, wird der Buchungsstatus über die bookings.patch-Methode der Booking Notification API für Echtzeitaktualisierungen aktualisiert. Wenn Buchungen, die nicht zeitnah beantwortet werden, automatisch abgelehnt werden sollen, kannst du dazu dieselbe Methode für Echtzeitaktualisierungen verwenden.

Verfügbarkeitsfeeds

Geben Sie im Verfügbarkeitsfeed an, ob jeder Slot synchron oder asynchron ist. Legen Sie dazu das neue Feld confirmation_mode fest.

// Mode by which bookings for an availability slot are confirmed.
//
enum ConfirmationMode {
  // The confirmation mode was not specified.
  // Synchronous confirmation will be assumed.
  CONFIRMATION_MODE_UNSPECIFIED = 0;
  // Bookings for this availability will be confirmed synchronously.
  CONFIRMATION_MODE_SYNCHRONOUS = 1;
  // Bookings for this availability will be confirmed asynchronously.
  CONFIRMATION_MODE_ASYNCHRONOUS = 2;
}

Obwohl davon ausgegangen wird, dass der Bestätigungsmodus synchron ist, wenn kein Modus angegeben ist, wird dringend empfohlen, explizit einen Modus anzugeben, da dadurch versehentliche Auslassungen vermieden werden.

Asynchron

{
  "availability": [
    {
      "merchant_id": "10001",
      "service_id": "1000",
      "spots_open": 3,
      "spots_total": 3,
      "duration_sec": 3600,
      "start_sec": 1535806800,
      "resources": {
        "party_size": 4
      },
      "confirmation_mode": "CONFIRMATION_MODE_ASYNCHRONOUS"
    }
  ]
}

Synchron

{
  "availability": [
    {
      "merchant_id": "10001",
      "service_id": "1000",
      "spots_open": 3,
      "spots_total": 3,
      "duration_sec": 3600,
      "start_sec": 1535806800,
      "resources": {
        "party_size": 4
      },
      "confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
    }
  ]
}

Asynchron und synchron

{
  "availability": [
    {
      "merchant_id": "10001",
      "service_id": "1000",
      "spots_open": 3,
      "spots_total": 3,
      "duration_sec": 3600,
      "start_sec": 1535806800,
      "resources": {
        "party_size": 4
      },
      "confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
    },
    {
      "merchant_id": "10002",
      "service_id": "1000",
      "spots_open": 4,
      "spots_total": 4,
      "duration_sec": 3600,
      "start_sec": 1535806800,
      "resources": {
        "party_size": 2
      },
      "confirmation_mode": "CONFIRMATION_MODE_ASYNCHRONOUS"
    }

  ]
}

Buchungsserver

"BatchAvailabilityLookup" oder "CheckAvailability"

Geben Sie in BatchAvailabilityLookupResponse (BAL) oder CheckAvailabilityResponse (CA) denselben confirmation_mode zurück, der im Verfügbarkeitsfeed angegeben ist und über BatchAvailabilityLookupRequest oder CheckAvailabilityRequest weitergegeben wird.

BAL – asynchron

{
  "slot_time_availability": [
    {
      "slot_time": {
        "duration_sec": "3600",
        "resource_ids": {
          "party_size": 3
        },
        "service_id": "1000",
        "start_sec": "1546458300",
        "confirmation_mode": "CONFIRMATION_MODE_ASYNCHRONOUS"
      },
      "available": true
    }
  ]
}

BAL – synchron

{
  "slot_time_availability": [
    {
      "slot_time": {
        "duration_sec": "3600",
        "resource_ids": {
          "party_size": 3
        },
        "service_id": "1000",
        "start_sec": "1546458300",
        "confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
      },
      "available": true
    }
  ]
}

CA – asynchron

{
  "slot": {
    "duration_sec": "3600",
    "merchant_id": "317652",
    "resources": {
      "party_size": 3
    },
    "service_id": "1000",
    "start_sec": "1546458300",
    "confirmation_mode": "CONFIRMATION_MODE_ASYNCHRONOUS"
  },
  "count_available": 1,
  "duration_requirement": "DO_NOT_SHOW_DURATION"
}

CA – synchron

{
  "slot": {
    "duration_sec": "3600",
    "merchant_id": "317652",
    "resources": {
      "party_size": 3
    },
    "service_id": "1000",
    "start_sec": "1546458300",
    "confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
  },
  "count_available": 1,
  "duration_requirement": "DO_NOT_SHOW_DURATION"
}

CreateBooking

Mithilfe der folgenden Optionen kannst du dafür sorgen, dass der richtige Status für die Buchung zurückgegeben wird:

// Status of a booking.
//
// Updating booking status does not change the status of the associated payment.
// Prepayment status updates should be done using the PrepaymentStatus enum.
enum BookingStatus {
  // Not specified.
  BOOKING_STATUS_UNSPECIFIED = 0;
  // Booking has been confirmed
  CONFIRMED = 1;
  // Booking is awaiting confirmation by the merchant before it can transition
  // into CONFIRMED status. Only applicable to non-payments Dining or
  // Beauty verticals.
  PENDING_MERCHANT_CONFIRMATION = 2;
  // Booking has been canceled on behalf of the user.
  // The merchant can still trigger a manual refund.
  CANCELED = 3;
  // User did not show for the appointment
  NO_SHOW = 4;
  // User did not show for the appointment in violation of the cancellation
  // policy.
  NO_SHOW_PENALIZED = 5;
  // Booking could not be completed by the async backend due to a failure.
  FAILED = 6;
  // Booking was asynchronously declined by the merchant. Only applicable to
  // non-payments Dining or Beauty verticals.
  DECLINED_BY_MERCHANT = 7;
}

Gibt in CreateBookingResponse den aktuellen confirmation_mode für den aggregierten Slot der Buchung zurück, der in „CreateBookingRequest“ angegeben ist. Wenn die Buchung asynchron ist, musst du außerdem status auf PENDING_MERCHANT_CONFIRMATION setzen. Achte darauf, dass die confirmation_mode vom Nutzer und von „Mit Google reservieren“ erwartet wird, um den Nutzer nicht zu verwirren.

Asynchron

{
  "booking": {
    "slot": {
      "duration_sec": "3600",
      "merchant_id": "100001",
      "resources": {
        "party_size": 2
      },
      "service_id": "1000",
      "start_sec": "1546647234",
      "confirmation_mode": "CONFIRMATION_MODE_ASYNCHRONOUS"
    },
    "user_information": {
      "email": "johnsmith@gmail.com",
      "family_name": "John",
      "given_name": "Smith",
      "telephone": "+1 800-123-4567",
      "user_id": "2017492857928759285"
    },
    "payment_information": {
      "prepayment_status": "PREPAYMENT_NOT_PROVIDED"
    },
    "status": "PENDING_MERCHANT_CONFIRMATION"
  }
}

Synchronisieren

{
  "booking": {
    "slot": {
      "duration_sec": "3600",
      "merchant_id": "100001",
      "resources": {
        "party_size": 2
      },
      "service_id": "1000",
      "start_sec": "1546647234",
      "confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
    },
    "user_information": {
      "email": "johnsmith@gmail.com",
      "family_name": "John",
      "given_name": "Smith",
      "telephone": "+1 800-123-4567",
      "user_id": "2017492857928759285"
    },
    "payment_information": {
      "prepayment_status": "PREPAYMENT_NOT_PROVIDED"
    },
    "status": "CONFIRMED"
  }
}

UpdateBooking

In der ersten Version des asynchronen Modus werden Änderungen an einer vorhandenen Buchung durch Nutzer nicht unterstützt. Stattdessen sollte der Nutzer die Buchung stornieren und eine neue Buchung erstellen.

Echtzeitaktualisierungen

Für Echtzeitaktualisierungen der Verfügbarkeit sollte confirmation_mode angegeben werden. Das gilt für folgende Methoden:

Echtzeitaktualisierung für das Inventar (ReplaceServiceAvailability oder BatchReplaceServiceAvailability)

Legen Sie mit der Batch-Methode availability.replace oder der services.availability.replace-Methode confirmation_mode in der Availability auf CONFIRMATION_MODE_ASYNCHRONOUS fest.

Asynchron

{
  "extendedServiceAvailability": [
    {
      "merchantId": "1001",
      "serviceId": "12310",
      "startTimeRestrict": "2014-10-02T15:01:23.045123456Z",
      "endTimeRestrict": "2014-10-02T19:01:23.045123456Z",
      "availability": [
        {
          "startTime": "2014-10-02T15:30:00.00Z",
          "duration": "3600s",
          "spotsOpen": "0",
          "spotsTotal": "2",
          "availabilityTag": "1000001",
          "confirmation_mode": "CONFIRMATION_MODE_ASYNCHRONOUS"
        }
      ]
    }
  ]
}

Synchron

{
  "extendedServiceAvailability": [
    {
      "merchantId": "1001",
      "serviceId": "12310",
      "startTimeRestrict": "2014-10-02T15:01:23.045123456Z",
      "endTimeRestrict": "2014-10-02T19:01:23.045123456Z",
      "availability": [
        {
          "startTime": "2014-10-02T15:30:00.00Z",
          "duration": "3600s",
          "spotsOpen": "0",
          "spotsTotal": "2",
          "availabilityTag": "1000001",
          "confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
        }
      ]
    }
  ]
}

Asynchron und synchron

{
  "extendedServiceAvailability": [
    {
      "merchantId": "1001",
      "serviceId": "12310",
      "startTimeRestrict": "2014-10-02T15:01:23.045123456Z",
      "endTimeRestrict": "2014-10-02T19:01:23.045123456Z",
      "availability": [
        {
          "startTime": "2014-10-02T15:30:00.00Z",
          "duration": "3600s",
          "spotsOpen": "0",
          "spotsTotal": "2",
          "availabilityTag": "1000001",
          "confirmation_mode": "CONFIRMATION_MODE_ASYNCHRONOUS"
        },
        {
          "startTime": "2014-10-03T11:00:00.00Z",
          "duration": "5400s",
          "spotsOpen": "1",
          "spotsTotal": "1",
          "availabilityTag": "1000002",
          "confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
        }
      ]
    }
  ]
}

Booking Notification API

Asynchrone Aktualisierungen eines Buchungsstatus müssen über die bookings.patch-Methode der Booking Notification API vorgenommen werden.

Achten Sie beim Aktualisieren des Status darauf, den Feldnamen status in updateMask aufzunehmen.

Status Beschreibung
CONFIRMED Der Händler hat die Buchung bestätigt.
FAILED Der Partner konnte die Buchung beim Händler weder bestätigen noch ablehnen.
DECLINED_BY_MERCHANT Der Händler hat die Buchung abgelehnt.
Request:
PATCH https://mapsbooking.googleapis.com/v1alpha/notification/partners/<PARTNER_ID>/bookings/<BOOKING_ID>?updateMask=status

Body:
{"name":"partners/<PARTNER_ID>/bookings/<BOOKING_ID>", "status":"DECLINED_BY_MERCHANT"}

Sollte die Buchung fehlschlagen, setze den Buchungsstatus auf FAILED und gib „booking_failure“ an. Ist der Status auf einen anderen Wert gesetzt, wird booking_failure ignoriert.

Request:
PATCH https://mapsbooking.googleapis.com/v1alpha/notification/partners/<PARTNER_ID>/bookings/<BOOKING_ID>?updateMask=status&booking_failure.cause="SLOT_UNAVAILABLE"

Body:
{"name":"partners/<PARTNER_ID>/bookings/<BOOKING_ID>", "status":"FAILED"}

E-Mail-Benachrichtigungen

Für asynchrone Buchungen gibt es fünf potenzielle E-Mails zum Status der Buchung, die an Nutzer gesendet werden.

  • PENDING_MERCHANT_CONFIRMATION
  • CONFIRMED
  • DECLINED_BY_MERCHANT
  • FAILED
  • CANCELED