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

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

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

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

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

Асинхронные критерии бронирования

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

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

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

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

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

  • Режим подтверждения: Все представления доступных временных интервалов теперь содержат поле 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-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