Agrega reservas asíncronas

Las reservas síncronas se definen como aquellas que se confirman o rechazan en tiempo real.

Las reservas asíncronas se definen como aquellas que el comercio confirma o disminuye más adelante.

Una reserva se especifica como síncrona o asíncrona en el y el nivel de disponibilidad. Esto también significa que, para un comercio y servicio dados podría haber horarios disponibles, tanto síncronos como asíncronos.

Para determinar la implementación adecuada, primero identifique qué categoría en las que se ubica tu inventario:

Criterios de las reservas asíncronas

  • La modificación de una reserva asíncrona en el Centro de acciones no no es compatible.
  • Los comercios deben poder aceptar o rechazar la reserva a través del el sistema en línea del socio (p.ej., el panel del organizador del restaurante). Llamar al comerciante en nombre del usuario para determinar si acepta o rechaza una reserva no.
  • No se admiten las propuestas del comercio de un nuevo horario de reserva. El la solicitud de reserva se debe aceptar o rechazar en el estado original.

Habilitación de las reservas síncronas únicamente

De forma predeterminada, la implementación estándar se establece en reservas síncronas. Consulte la documentación de integración de extremo a extremo de Citas para obtener más información.

Habilitando las reservas asíncronas

Si algunos o todos los comercios usan un flujo de reservas asíncrono, el se deben realizar los siguientes cambios:

  • Modo de confirmación: Ahora todas las representaciones de los horarios disponibles contienen un campo confirmation_mode que describe cómo las reservas de ese horario disponible. Especifica el confirmation_mode de cada horario disponible para el lo siguiente:

    • En el feed de disponibilidad, confirmation_mode se especifica en la nivel de disponibilidad
    • En los métodos de la API de Booking Server, confirmation_mode se especifica en el nivel de la ranura
    • En los métodos de la API de actualizaciones en tiempo real, se especifica confirmation_mode. a nivel de disponibilidad
  • Estado de la reserva: Todas las representaciones de las reservas contienen un Es el campo status que representa el estado de la reserva. Tres veces Se introdujeron nuevos valores de estado asíncronos: PENDING_CONFIRMATION, DECLINED_BY_MERCHANT y FAILED. Usa estos nuevos valores de estado cuando procesar las creaciones, los rechazos y las fallas de las reservas asíncronas.
  • Actualizaciones de reservas: Todas las actualizaciones asíncronas del estado de la Las reservas se deben informar a través de la API de Booking Notification bookings.patch.

En el siguiente diagrama, se muestra cómo se usan el modo de confirmación y el estado de la reserva en una interacción típica de reserva asíncrona.

Figura 1: Flujo de reserva asíncrona
Figura 1: Flujo de reserva asíncrono
  1. Los feeds de disponibilidad se actualizaron para que las el modo de confirmación. Es importante tener esta información en feed para que podamos explicar la naturaleza asíncrona de la reserva a al usuario al principio del flujo.
  2. Cuándo BatchAvailabilityLookup o CheckAvailability pasamos el modo de confirmación y, idealmente, el mismo modo de confirmación que se devuelven. Esto garantiza que el usuario vea el mensaje adecuado.
  3. Cuándo CreateBooking pasamos el modo de confirmación a indicar el modo de confirmación anticipado. Cuando la reserva asíncrona se envía una solicitud, la reserva se devuelve con el estado PENDING_MERCHANT_CONFIRMATION
  4. Cuando el comercio acepta o rechaza una solicitud de reserva, esta el estado se actualiza a través de la actualización en tiempo real de las API de Booking Notification bookings.patch Si deseas rechazar automáticamente las reservas que no se respondido de forma oportuna, por medio de la misma actualización en tiempo real .

Feeds de disponibilidad

En el feed de disponibilidad, especifica si cada horario disponible es síncrono o asíncrono. Para ello, configura el nuevo 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;
}

Aunque se supone que el modo de confirmación es síncrono si no se especificada, se recomienda encarecidamente que especifiques un modo, ya que que quita cualquier confusión en torno a omisiones accidentales.

Datos asíncronos

{
  "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"
    }
  ]
}

Modo síncrono

{
  "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"
    }
  ]
}

Modos asíncrono y síncrono

{
  "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"
    }

  ]
}

Servidor de reservas

BatchAvailabilityLookup o CheckAvailability

En la BatchAvailabilityLookupResponse (BAL) o CheckAvailabilityResponse (CA), muestra el mismo confirmation_mode que se especifica en la de disponibilidad y se pasan a través del BatchAvailabilityLookupRequest o CheckAvailabilityRequest.

BAL: modo asíncrono

{
  "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: modo síncrono

{
  "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: modo asíncrono

{
  "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: modo síncrono

{
  "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

Asegúrate de mostrar el estado correcto de la reserva a través de los recursos estas opciones:

// 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;
}

En el CreateBookingResponse, muestra el valor actual de confirmation_mode para el horario disponible agregado de la reserva que se proporcionó en CreateBookingRequest. Además, cuando la reserva es asíncrona, establece status en PENDING_MERCHANT_CONFIRMATION. Asegúrate de que El confirmation_mode es lo que el usuario y lo que utiliza Reservar Google espera evitar confundir al usuario.

Datos asíncronos

{
  "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"
  }
}

Modo síncrono

{
  "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

En la versión inicial asíncrona, las modificaciones del usuario a una reserva existente no son compatibles. En cambio, el usuario debe cancelar la reserva y crear una reserva nueva.

Actualizaciones en tiempo real

Para actualizar la disponibilidad en tiempo real, confirmation_mode un valor específico. Esto se aplica a los siguientes métodos:

RTU del inventario (ReplaceServiceAvailability o BatchReplaceServiceAvailability)

Usando Método availability.replace (por lotes) o Método services.availability.replace, configura confirmation_mode como CONFIRMATION_MODE_ASYNCHRONOUS en Availability

Datos asíncronos

{
  "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"
        }
      ]
    }
  ]
}

Modo síncrono

{
  "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"
        }
      ]
    }
  ]
}

Modos asíncrono y síncrono

{
  "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 de Booking Notification

Las actualizaciones asíncronas de un estado de reserva deben realizarse a través de la sección Con el método bookings.patch de la API de notificaciones.

Cuando actualices el estado, asegúrate de incluir el nombre del campo status en la updateMask

Estado Descripción
CONFIRMED El comercio confirmó la reserva.
FAILED El socio no pudo confirmar ni rechazar la reserva con el comercio.
DECLINED_BY_MERCHANT El comercio rechazó la reserva.
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"}

Si se produce un error en la reserva, establece el estado de la reserva en FAILED. especifica el campo booking_failure. Si el estado se establece en cualquier otra opción, el booking_failure se ignora.

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"}

Notificaciones por correo electrónico

Para las reservas asíncronas, existen cinco posibles correos electrónicos relacionados con el estado de la reserva que se envía a los usuarios.

    .
  • PENDING_MERCHANT_CONFIRMATION
  • CONFIRMED
  • DECLINED_BY_MERCHANT
  • FAILED
  • CANCELED