Синхронные бронирования определяются как бронирования, которые подтверждаются или отклоняются в режиме реального времени.
Асинхронные бронирования определяются как бронирования, которые продавец подтверждает или отклоняет позднее.
Резервирование указывается как синхронное или асинхронное на уровне доступности. Это также означает, что для данного продавца и услуги могут быть как синхронные, так и асинхронные слоты доступности.
Чтобы определить подходящую реализацию, сначала определите, к какой категории относится ваш инвентарь:
- Включение только синхронных бронирований : все продавцы и услуги подтверждаются мгновенно.
- Включение асинхронного бронирования . Некоторые или все продавцы и услуги требуют подтверждения продавца вручную.
Критерии асинхронного бронирования
- Изменение асинхронного бронирования в Центре действий не поддерживается.
- Продавцы должны иметь возможность принимать или отклонять бронирование через онлайн-систему партнера (например, хост-панель ресторана). Звонок продавцу от имени пользователя, чтобы определить, принимает или отклоняет ли продавец бронирование, не разрешен.
- Предложение продавца о новом времени бронирования не поддерживается. Запрос на бронирование должен быть принят или отклонен в исходном состоянии.
Включение только синхронного бронирования
Стандартная реализация по умолчанию использует синхронное резервирование. Дополнительную информацию можно найти в документации по сквозной интеграции Appointments.
Включение асинхронного бронирования
Если некоторые или все продавцы используют асинхронный процесс бронирования, необходимо внести следующие изменения:
Режим подтверждения: все представления слотов доступности теперь содержат поле
confirmation_mode
, которое описывает, как подтверждаются бронирования этого слота доступности. Укажитеconfirmation_mode
для каждого слота доступности для следующего:- В фиде доступности
confirmation_mode
указан на уровне доступности. - В методах API Сервера бронирования
confirmation_mode
указывается на уровне слота. - В методах API обновлений в реальном времени
confirmation_mode
указывается на уровне доступности.
- В фиде доступности
- Статус бронирования. Все представления резервирований содержат поле
status
, которое отображает состояние бронирования. Введены три новых асинхронных значения статуса:PENDING_CONFIRMATION
,DECLINED_BY_MERCHANT
иFAILED
. Используйте эти новые значения статуса при обработке создания, отклонения и сбоев асинхронных бронирований. - Обновления бронирования. Обо всех асинхронных обновлениях статуса бронирований следует сообщать с помощью метода bookings.patch API уведомлений о бронировании.
На диаграмме ниже показано, как режим подтверждения и статус бронирования используются в типичном взаимодействии асинхронного бронирования.
![Рисунок 1. Асинхронный процесс бронирования](https://developers-dot-devsite-v2-prod.appspot.com/static/actions-center/images/enabling_async_1.png?authuser=19&hl=ru)
- Фиды доступности были обновлены, и теперь указан режим подтверждения каждого слота доступности. Важно иметь эту информацию в ленте, чтобы мы могли объяснить пользователю асинхронный характер бронирования на ранних этапах процесса.
- При вызове
BatchAvailabilityLookup
илиCheckAvailability
мы передаем режим подтверждения и, в идеале, тот же режим подтверждения, который будет возвращен. Это гарантирует, что пользователю будут показаны соответствующие сообщения. - При вызове
CreateBooking
мы передаем режим подтверждения, чтобы указать ожидаемый режим подтверждения. При отправке запроса на асинхронное бронирование бронирование возвращается со статусомPENDING_MERCHANT_CONFIRMATION
. - Когда продавец принимает или отклоняет запрос на бронирование, статус бронирования обновляется с помощью метода bookings.patch API уведомления о бронировании в режиме реального времени. Если вы хотите автоматически отклонять заказы, на которые не ответили своевременно, сделайте это с помощью того же метода обновления в реальном времени.
Фиды доступности
В канале доступности укажите, является ли каждый слот синхронным или асинхронным. Для этого установите новое поле confirmation_mode
.
// 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; }
Хотя режим подтверждения считается синхронным, если режим не указан, настоятельно рекомендуется явно указывать режим, поскольку это устраняет любую путаницу, связанную со случайными упущениями.
Асинхронный
{ "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" } ] }
Синхронизировать
{ "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" } ] }
Асинхронность и синхронизация
{ "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" } ] }
Сервер бронирования
BatchAvailabilityLookup или CheckAvailability
В BatchAvailabilityLookupResponse
(BAL) или CheckAvailabilityResponse
(CA) верните тот же confirmation_mode
, который указан в канале доступности и передан через BatchAvailabilityLookupRequest
или CheckAvailabilityRequest
.
BAL-асинхронный
{ "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-Синхронизация
{ "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-асинхронный
{ "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-Синхронизация
{ "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" }
Создать бронирование
Обязательно верните правильный статус бронирования, используя доступные варианты ниже:
// 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; }
В CreateBookingResponse
верните текущий confirmation_mode
для агрегированного слота бронирования, указанного в CreateBookingRequest. Кроме того, если бронирование асинхронное, установите status
PENDING_MERCHANT_CONFIRMATION
. Убедитесь, что параметр confirmation_mode
соответствует ожиданиям пользователя и параметра «Зарезервировать через Google», чтобы не запутать пользователя.
Асинхронный
{ "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" } }
Синхронизировать
{ "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" } }
ОбновлениеБронирование
В первоначальной версии async пользовательские изменения существующего бронирования не поддерживаются. Вместо этого пользователю следует отменить бронирование и создать новое бронирование.
Обновления в реальном времени
Для обновлений доступности в режиме реального времени следует указать confirmation_mode
. Это касается следующих методов:
RTU инвентаризации (ReplaceServiceAvailability или BatchReplaceServiceAvailability)
Используя метод availability.replace
(пакетный) или метод services.availability.replace
, установите для confirmation_mode
значение CONFIRMATION_MODE_ASYNCHRONOUS
в разделе Availability
.
Асинхронный
{ "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" } ] } ] }
Синхронизировать
{ "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" } ] } ] }
Асинхронность и синхронизация
{ "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" } ] } ] }
API уведомлений о бронировании
Асинхронные обновления статуса бронирования следует выполнять с помощью метода bookings.patch API уведомлений о бронировании.
При обновлении статуса обязательно включите имя поля status
в updateMask
.
Статус | Описание |
---|---|
ПОДТВЕРЖДЕННЫЙ | продавец подтвердил бронирование |
НЕУСПЕШНЫЙ | партнер не смог подтвердить или отклонить бронирование у продавца |
DECLINED_BY_MERCHANT | продавец отклонил бронирование |
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"}
В случае сбоя бронирования установите статус бронирования FAILED
и укажите booking_failure. Если для статуса установлено любое другое значение, booking_failure
игнорируется.
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"}
Уведомления по электронной почте
При асинхронном бронировании пользователям отправляется пять потенциальных электронных писем, связанных со статусом бронирования.
-
PENDING_MERCHANT_CONFIRMATION
-
CONFIRMED
-
DECLINED_BY_MERCHANT
-
FAILED
-
CANCELED