Синхронные бронирования определяются как бронирования, которые подтверждаются или отклоняются в режиме реального времени.
Асинхронные бронирования определяются как бронирования, которые продавец подтверждает или отклоняет позднее.
Бронирование указывается как синхронное или асинхронное на уровне доступности. Это также означает, что для данного продавца и услуги могут быть как синхронные, так и асинхронные слоты доступности.
Чтобы определить подходящий способ реализации, сначала выясните, к какой категории относится ваш товарный запас:
- Включается только синхронное бронирование : все продавцы и услуги подтверждаются мгновенно.
- Включение асинхронного бронирования : для некоторых или всех продавцов и сервисов требуется подтверждение бронирования вручную.
Асинхронные критерии бронирования
- Изменение асинхронного бронирования в Центре действий не поддерживается.
- Продавцы должны иметь возможность принять или отклонить бронирование через онлайн-систему партнера (например, панель администратора ресторана). Звонок продавцу от имени пользователя для выяснения, принимает или отклоняет ли продавец бронирование, не допускается.
- Предложение продавцом нового времени бронирования не поддерживается. Запрос на бронирование должен быть принят или отклонен в исходном состоянии.
Включить только синхронное бронирование.
Стандартная реализация по умолчанию использует синхронное бронирование. Для получения дополнительной информации обратитесь к документации по сквозной интеграции системы бронирования.
Включение асинхронного бронирования
Если некоторые или все продавцы используют асинхронный процесс бронирования, необходимо внести следующие изменения:
Режим подтверждения: Все представления доступных временных интервалов теперь содержат поле
confirmation_mode, описывающее способ подтверждения бронирования данного временного интервала. Укажитеconfirmation_modeдля каждого доступного временного интервала для следующих случаев:- В ленте доступности
confirmation_modeуказывается на уровне доступности. - В методах API сервера бронирования
confirmation_modeуказывается на уровне слота. - В методах API для обновлений в реальном времени
confirmation_modeуказывается на уровне доступности.
- В ленте доступности
- Статус бронирования: Все представления бронирований содержат поле
status, отражающее состояние бронирования. Введены три новых асинхронных значения статуса:PENDING_CONFIRMATION,DECLINED_BY_MERCHANTиFAILED. Используйте эти новые значения статуса при обработке создания, отклонения и сбоев асинхронных бронирований. - Обновления статуса бронирования: Все асинхронные обновления статуса бронирования должны передаваться через метод bookings.patch API уведомлений о бронировании.
На приведенной ниже диаграмме показано, как режим подтверждения и статус бронирования используются в типичном асинхронном взаимодействии при бронировании.

- Обновлены каналы доступности, теперь в них указан режим подтверждения для каждого временного интервала. Важно иметь эту информацию в канале, чтобы мы могли объяснить пользователю асинхронный характер бронирования на раннем этапе процесса.
- При вызове
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-Async
{
"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-Sync
{
"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-Async
{
"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-Sync
{
"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
Убедитесь, что вы получили правильный статус бронирования, используя доступные ниже параметры:
// 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 соответствует ожиданиям пользователя и системы Reserve with 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 . Это относится к следующим методам:
Доступность ресурсов для инвентаризации (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 .
| Статус | Описание |
|---|---|
| ПОДТВЕРЖДЕННЫЙ | Продавец подтвердил бронирование. |
| НЕУСПЕШНЫЙ | Партнер не смог подтвердить или отклонить бронирование у продавца. |
| ОТКАЗАНО_ТОРГОВЦОМ | Торговец отклонил бронирование. |
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