Добавить асинхронные бронирования

Синхронные бронирования определяются как бронирования, которые подтверждаются или отклоняются в режиме реального времени.

Асинхронные бронирования определяются как бронирования, которые продавец подтверждает или отклоняет позднее.

Резервирование указывается как синхронное или асинхронное на уровне доступности. Это также означает, что для данного продавца и услуги могут быть как синхронные, так и асинхронные слоты доступности.

Чтобы определить подходящую реализацию, сначала определите, к какой категории относится ваш инвентарь:

Критерии асинхронного бронирования

  • Изменение асинхронного бронирования в Центре действий не поддерживается.
  • Продавцы должны иметь возможность принимать или отклонять бронирование через онлайн-систему партнера (например, хост-панель ресторана). Звонить продавцу от имени пользователя, чтобы определить, принимает или отклоняет ли продавец бронирование, запрещено .
  • Предложение продавца о новом времени бронирования не поддерживается. Запрос на бронирование должен быть принят или отклонен в исходном состоянии.

Включение только синхронного бронирования

Стандартная реализация по умолчанию использует синхронное резервирование. Дополнительную информацию можно найти в документации по сквозной интеграции Appointments.

Включение асинхронного бронирования

Если некоторые или все продавцы используют асинхронный процесс бронирования, необходимо внести следующие изменения:

  • Режим подтверждения: все представления слотов доступности теперь содержат поле confirmation_mode , которое описывает, как подтверждаются бронирования этого слота доступности. Укажите confirmation_mode для каждого слота доступности для следующего:

    • В фиде доступности confirmation_mode указывается на уровне доступности.
    • В методах API Сервера бронирования confirmation_mode указывается на уровне слота.
    • В методах API обновлений в реальном времени confirmation_mode указывается на уровне доступности.
  • Статус бронирования. Все представления резервирований содержат поле status , которое отображает состояние бронирования. Введены три новых асинхронных значения статуса: PENDING_CONFIRMATION , DECLINED_BY_MERCHANT и FAILED . Используйте эти новые значения статуса при обработке создания, отклонения и сбоев асинхронных бронирований.
  • Обновления бронирования. Обо всех асинхронных обновлениях статуса бронирований следует сообщать с помощью метода bookings.patch API уведомлений о бронировании.

На диаграмме ниже показано, как режим подтверждения и статус бронирования используются в типичном взаимодействии асинхронного бронирования.

Рисунок 1. Асинхронный процесс бронирования
Рисунок 1. Асинхронный процесс бронирования
  1. Фиды доступности были обновлены, и теперь указан режим подтверждения каждого слота доступности. Важно иметь эту информацию в ленте, чтобы мы могли объяснить пользователю асинхронный характер бронирования на ранних этапах процесса.
  2. При вызове BatchAvailabilityLookup или CheckAvailability мы передаем режим подтверждения и, в идеале, тот же режим подтверждения, который будет возвращен. Это гарантирует, что пользователю будут показаны соответствующие сообщения.
  3. При вызове CreateBooking мы передаем режим подтверждения, чтобы указать ожидаемый режим подтверждения. При отправке запроса на асинхронное бронирование бронирование возвращается со статусом PENDING_MERCHANT_CONFIRMATION .
  4. Когда продавец принимает или отклоняет запрос на бронирование, статус бронирования обновляется с помощью метода 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