동기식 예약은 실시간으로 확인 또는 거부되는 예약으로 정의됩니다.
비동기 예약은 판매자가 나중에 확인 또는 거부하는 예약으로 정의됩니다.
예약은 가용성 수준에서 동기식 또는 비동기식으로 지정됩니다. 즉, 특정 판매자 및 서비스에 대해 동기식 및 비동기식 가용성 슬롯이 모두 있을 수 있습니다.
적절한 구현을 결정하려면 먼저 인벤토리가 속한 카테고리를 확인하세요.
- 동기식 예약만 사용 설정: 모든 판매자와 서비스가 즉시 확인됩니다.
- 비동기 예약 사용 설정: 일부 또는 모든 판매자와 서비스에 대해 판매자 수동 확인이 필요합니다.
비동기식 예약 기준
- Google 예약의 비동기 예약은 수정할 수 없습니다.
- 결제가 필요한 비동기식 예약은 지원되지 않습니다.
- 판매자는 파트너의 온라인 시스템 (예: 레스토랑의 호스트 패널)을 통해 예약을 수락하거나 거부할 수 있어야 합니다. 사용자 대신 판매자를 호출하여 판매자가 예약을 수락하거나 거부하는지 여부를 판단하는 것은 허용되지 않습니다.
- 판매자가 새 예약 시간을 제안할 수 없습니다. 원래 상태에서 예약 요청을 수락하거나 거부해야 합니다.
동기식 예약만 사용 설정
표준 구현은 동기식 예약으로 기본 설정됩니다. 자세한 내용은 엔드 투 엔드 통합 가이드를 참조하세요.
비동기 예약 사용 설정
일부 또는 모든 판매자가 비동기 예약 흐름을 사용하는 경우 다음과 같이 변경해야 합니다.
-
확인 모드: 이제 모든 이용 가능 시간대 표현에 해당 이용 가능 시간대의 예약이 확인되는 방식을 설명하는
confirmation_mode
필드가 포함됩니다. 다음과 같이 각 이용 가능 시간대의confirmation_mode
를 지정합니다.- 이용 가능 여부 피드에서
confirmation_mode
가 재고 수준에서 지정됨 - Booking Server API 메서드에서
confirmation_mode
는 슬롯 수준에서 지정됩니다. - Real-Time Updates API 메서드에서
confirmation_mode
는 가용성 수준에서 지정됩니다.
- 이용 가능 여부 피드에서
- 예약 상태: 모든 예약 표현에는 예약 상태를 나타내는
status
필드가 포함됩니다. 3가지 새로운 비동기 상태 값(PENDING_CONFIRMATION
,DECLINED_BY_MERCHANT
,FAILED
)이 도입되었습니다. 비동기 예약의 생성, 거부, 실패를 처리할 때 이러한 새 상태 값을 사용합니다. - 예약 업데이트: 예약 상태에 대한 모든 비동기 업데이트는 Booking Notification API의 bookings.patch 메서드를 통해 보고해야 합니다.
아래 다이어그램은 일반적인 비동기 예약 상호작용에서 확인 모드와 예약 상태가 사용되는 방식을 보여줍니다.
- 각 이용 가능 시간대의 확인 모드가 지정되도록 이용 가능 여부 피드가 업데이트되었습니다. 흐름의 초기에 사용자에게 예약의 비동기식 특성을 설명할 수 있도록 이 정보를 피드에 포함하는 것이 중요합니다.
BatchAvailabilityLookup
또는CheckAvailability
가 호출되면 확인 모드를 통과하며 이상적인 경우 동일한 확인 모드를 반환합니다. 이렇게 하면 사용자에게 적절한 메시지가 표시됩니다.CreateBooking
가 호출되면 확인 모드를 따라 예상 확인 모드가 표시됩니다. 비동기 예약 요청이 제출되면 예약이PENDING_MERCHANT_CONFIRMATION
상태로 반환됩니다.- 판매자가 예약 요청을 수락하거나 거부하면 실시간 업데이트 Booking Notification API의 bookings.patch 메서드를 통해 예약 상태가 업데이트됩니다. 적시에 응답하지 않는 예약을 자동으로 거부하려면 동일한 실시간 업데이트 방법을 사용합니다.
이용 가능 여부 피드
이용 가능 여부 피드에서 각 슬롯이 동기식인지 비동기식인지 지정합니다. 이를 위해 새 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; }
모드가 지정되지 않은 경우 동기화 모드가 동기식으로 간주되긴 하지만, 실수로 인한 누락과 관련된 혼란을 없애려면 모드를 명시적으로 지정하는 것이 좋습니다.
Async
{ "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" } ] }
Sync
{ "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" } ] }
Async 및 Sync
{ "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)에서 재고 피드에 지정되어 있고 BatchAvailabilityLookupRequest
또는 CheckAvailabilityRequest
를 통해 전달되는 것과 동일한 confirmation_mode
를 반환합니다.
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
에서 CreateBookingRequest에 제공된 예약의 집계된 슬롯의 현재 confirmation_mode
를 반환합니다. 또한 예약이 비동기식인 경우 status
를 PENDING_MERCHANT_CONFIRMATION
로 설정합니다. confirmation_mode
은 사용자에게 혼란을 주지 않도록 하기 위해 Google 예약에서 기대하는 내용이어야 합니다.
Async
{ "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" } }
UpdateBooking
비동기 출시 버전에서는 기존 예약에 대한 사용자 수정이 지원되지 않습니다. 대신 사용자는 예약을 취소하고 새 예약을 생성해야 합니다.
실시간 업데이트
제공 항목의 실시간 업데이트를 지정하려면 confirmation_mode
를 지정해야 합니다. 이는 다음 메서드에 적용됩니다.
인벤토리 RTU (ReplaceServiceAvailability 또는 BatchReplaceServiceAvailability)
availability.replace
(일괄) 메서드 또는 services.availability.replace
메서드를 사용하여 Availability
에서 confirmation_mode
를 CONFIRMATION_MODE_ASYNCHRONOUS
로 설정합니다.
Async
{ "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" } ] } ] }
Sync
{ "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" } ] } ] }
Async 및 Sync
{ "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" } ] } ] }
Booking Notification API
예약 상태를 비동기식으로 업데이트하려면 Booking Notification API bookings.patch 메서드를 사용해야 합니다.
상태를 업데이트할 때 updateMask
에 status
필드 이름을 포함해야 합니다.
상태 | 설명 |
---|---|
CONFIRMED | 판매자가 예약을 확인함 |
FAILED | 파트너가 판매자와 예약을 확인하거나 거부할 수 없음 |
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
으로 설정하고 reservation_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"}
이메일 알림
비동기식 예약의 경우 사용자에게 전송되는 예약 상태와 관련된 5개의 잠재적인 이메일이 있습니다.
PENDING_MERCHANT_CONFIRMATION
CONFIRMED
DECLINED_BY_MERCHANT
FAILED
CANCELED