Synchrone Buchungen werden in Echtzeit bestätigt oder abgelehnt.
Asynchrone Buchungen werden vom Händler zu einem späteren Zeitpunkt bestätigt oder abgelehnt.
Eine Buchung wird auf Verfügbarkeitsebene entweder als synchron oder asynchron angegeben. Daher können für einen bestimmten Händler und eine Dienstleistung sowohl synchrone als auch asynchrone verfügbare Slots vorhanden sein.
Um die geeignete Implementierung zu finden, musst du zuerst ermitteln, zu welcher Kategorie dein Inventar gehört:
- Nur synchrone Buchungen aktivieren: Alle Händler und Dienstleistungen werden sofort bestätigt.
- Asynchrone Buchungen aktivieren: Für einige oder alle Händler und Dienstleistungen ist die manuelle Bestätigung des Händlers erforderlich.
Kriterien für asynchrone Buchungen
- Asynchrone Buchungen können im Actions Center nicht geändert werden.
- Händler müssen die Buchung über das Onlinesystem des Partners annehmen oder ablehnen können (z.B. über den Gastgeberbereich für das Restaurant). Es ist nicht zulässig, den Händler für den Nutzer anzurufen, um zu erfragen, ob er 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 End-to-End-Integrationsdokumentation für Google Kalender.
Asynchrone Buchung aktivieren
Wenn einige oder alle Händler einen asynchronen Buchungsablauf verwenden, müssen folgende Änderungen vorgenommen werden:
-
Bestätigungsmodus:Alle Darstellungen verfügbarer Slots enthalten jetzt das Feld
confirmation_mode
. Dort wird beschrieben, wie Buchungen des entsprechenden Slots bestätigt werden. Gib den Bestätigungsmodus (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 Slot-Ebene angegeben. - In den API-Methoden für Echtzeitaktualisierungen wird
confirmation_mode
auf der Verfügbarkeitsebene angegeben.
- Im Verfügbarkeitsfeed wird
- Buchungsstatus:Alle Buchungsdarstellungen enthalten ein
status
-Feld für den Status der Buchung. Es wurden drei neue asynchrone Statuswerte eingeführt:PENDING_CONFIRMATION
,DECLINED_BY_MERCHANT
undFAILED
. Verwende sie, wenn du Erstellungen, Ablehnungen und Fehler asynchroner Buchungen verarbeitest. - Buchungsaktualisierungen:Alle asynchronen Aktualisierungen des Buchungsstatus müssen über die bookings.patch-Methode der Booking Notification API gemeldet werden.
Im folgenden Diagramm siehst du, wie der Bestätigungsmodus und der Buchungsstatus in einer typischen asynchronen Buchungsinteraktion verwendet werden.
- Verfügbarkeitsfeeds wurden aktualisiert. Jetzt wird der Bestätigungsmodus jedes verfügbaren Slots angegeben. Diese Informationen müssen im Feed enthalten sein, damit wir dem Nutzer die asynchrone Buchung schon früh im Ablauf erklären können.
- Wenn
BatchAvailabilityLookup
oderCheckAvailability
aufgerufen wird, wird der Bestätigungsmodus übergeben und im Idealfall derselbe Bestätigungsmodus zurückgegeben. Dadurch wird sichergestellt, dass der Nutzer die richtige Nachricht sieht. - 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 StatusPENDING_MERCHANT_CONFIRMATION
zurückgegeben. - Wenn der Händler eine Buchungsanfrage akzeptiert 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, musst du dafür 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; }
Auch wenn standardmäßig vom synchronen Buchungsmodus ausgegangen wird, solltest du explizit einen Modus angeben, damit es keine Probleme mit versehentlichen Auslassungen gibt.
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"
Gib 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
Stell mithilfe der folgenden Optionen sicher, 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; }
Gib 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 der Wert von 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" } }
Synchron
{ "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 Bestätigungsmodus werden Änderungen vorhandener Buchungen durch den Nutzer nicht unterstützt. Stattdessen muss der Nutzer die Buchung stornieren und dann eine neue Buchung erstellen.
Echtzeitaktualisierungen
Für Aktualisierungen der Verfügbarkeit in Echtzeit muss confirmation_mode
angegeben werden. Das gilt für folgende Methoden:
Inventar – Echtzeitaktualisierung (ReplaceServiceAvailability oder BatchReplaceServiceAvailability)
Verwenden Sie die availability.replace
-Methode (Batch) oder die services.availability.replace
-Methode, um in Availability
confirmation_mode
auf CONFIRMATION_MODE_ASYNCHRONOUS
festzulegen.
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 von Buchungsstatus müssen über die bookings.patch-Methode der Booking Notification API vorgenommen werden.
Beim Aktualisieren des Status musst du den Namen des Felds status
in updateMask
aufnehmen.
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"}
Wenn eine Buchung fehlschlägt, setze den Buchungsstatus auf FAILED
und gib einen Wert für „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
Bei asynchronen Buchungen gibt es fünf E-Mails zum Buchungsstatus, die an Nutzer gesendet werden können.
PENDING_MERCHANT_CONFIRMATION
CONFIRMED
DECLINED_BY_MERCHANT
FAILED
CANCELED