Mengaktifkan pemesanan asinkron

Pemesanan sinkron ditentukan sebagai pemesanan yang dikonfirmasi atau ditolak secara real time.

Pemesanan asinkron ditentukan sebagai pemesanan yang dikonfirmasi atau ditolak oleh penjual di lain waktu.

Pemesanan ditetapkan sebagai sinkron atau asinkron di tingkat ketersediaan. Ini juga berarti bahwa untuk penjual dan layanan tertentu, mungkin ada slot ketersediaan sinkron dan asinkron.

Untuk menentukan penerapan yang sesuai, pertama-tama identifikasikan kategori inventaris Anda:

Kriteria pemesanan asinkron

  • Perubahan pemesanan asinkron di Pesan dengan Google tidak didukung.
  • Pemesanan asinkron yang mewajibkan pembayaran tidak didukung.
  • Penjual harus dapat menerima atau menolak pemesanan melalui sistem online partner (misalnya, panel host untuk restoran). Memanggil penjual atas nama pengguna untuk menentukan apakah penjual menerima atau menolak pemesanan tidak diperbolehkan.
  • Permintaan penjual untuk waktu pemesanan baru tidak didukung. Permintaan pemesanan harus diterima atau ditolak dalam status aslinya.

Mengaktifkan pemesanan sinkron saja

Penerapan standar ditetapkan secara default ke pemesanan sinkron. Lihat panduan integrasi menyeluruh untuk mendapatkan informasi lebih lanjut.

Mengaktifkan pemesanan asinkron

Jika beberapa atau semua penjual menggunakan alur pemesanan asinkron, perubahan berikut harus dilakukan:

  • Mode konfirmasi: Semua representasi slot ketersediaan kini berisi kolom confirmation_mode yang menjelaskan cara pemesanan slot ketersediaan tersebut dikonfirmasi. Tentukan confirmation_mode dari setiap slot ketersediaan untuk hal berikut:

    • Di Feed Ketersediaan, confirmation_mode ditentukan di tingkat ketersediaan
    • Dalam metode Booking Server API, confirmation_mode ditetapkan pada tingkat slot
    • Dalam metode Real-Time Updates API, confirmation_mode ditentukan di tingkat ketersediaan
  • Status pemesanan: Semua representasi pemesanan berisi kolom status yang mewakili status pemesanan. Tiga nilai status asinkron baru telah diperkenalkan: PENDING_CONFIRMATION, DECLINED_BY_MERCHANT, dan FAILED. Gunakan nilai status baru ini saat memproses pembuatan, penolakan, dan kegagalan pemesanan asinkron.
  • Pembaruan pemesanan: Semua pembaruan asinkron pada status pemesanan harus dilaporkan melalui metode bookings.patch Booking Notification API.

Diagram di bawah menunjukkan cara penggunaan mode konfirmasi dan status pemesanan dalam interaksi pemesanan asinkron yang umum.

Gambar 1: Alur pemesanan asinkron
Gambar 1: Alur pemesanan asinkron
  1. Feed ketersediaan telah diperbarui sehingga setiap mode konfirmasi slot ketersediaan ditentukan. Penting untuk memiliki informasi ini di feed agar kami dapat menjelaskan sifat asinkron pemesanan kepada pengguna di awal alur.
  2. Saat BatchAvailabilityLookup atau CheckAvailability dipanggil, kita akan meneruskan mode konfirmasi dan idealnya mode konfirmasi yang sama akan ditampilkan. Hal ini memastikan bahwa pengguna mendapatkan pesan yang sesuai.
  3. Saat CreateBooking dipanggil, kita akan meneruskan mode konfirmasi untuk menunjukkan mode konfirmasi yang diharapkan. Saat permintaan pemesanan asinkron dikirimkan, pemesanan akan ditampilkan dengan status PENDING_MERCHANT_CONFIRMATION.
  4. Saat penjual menerima atau menolak permintaan pemesanan, status pemesanan diperbarui melalui metode bookings.patch Booking Notification API yang diperbarui secara real-time. Jika Anda ingin secara otomatis menolak pemesanan yang tidak direspons secara tepat waktu, lakukan melalui metode update real-time yang sama.

Feed Ketersediaan

Dalam feed ketersediaan, tentukan apakah setiap slot akan sinkron atau asinkron. Untuk melakukannya, tetapkan kolom confirmation_mode yang baru.

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

Meskipun mode konfirmasi diasumsikan sebagai sinkron jika tidak ada mode yang ditentukan, sangat disarankan untuk menentukan mode secara eksplisit karena akan menghilangkan kebingungan terkait penghapusan yang tidak disengaja.

Asinkron

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

Sinkron

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

Asinkron dan Sinkron

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

  ]
}

Server Pemesanan

BatchAvailabilityLookup atau CheckAvailability

Dalam BatchAvailabilityLookupResponse (BAL) atau CheckAvailabilityResponse (CA), tampilkan confirmation_mode yang sama seperti yang ditentukan dalam feed ketersediaan dan diteruskan melalui BatchAvailabilityLookupRequest atau 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

Pastikan untuk menampilkan status pemesanan yang benar menggunakan opsi yang tersedia di bawah:

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

Dalam CreateBookingResponse, tampilkan confirmation_mode saat ini untuk slot gabungan pemesanan yang disediakan di CreateBookingRequest. Selain itu, saat pemesanan bersifat asinkron, tetapkan status ke PENDING_MERCHANT_CONFIRMATION. Pastikan confirmation_mode sesuai dengan yang diharapkan pengguna dan Pesan dengan Google yang diharapkan dapat menghindari kebingungan pengguna.

Asinkron

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

Sinkron

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

Dalam rilis awal asinkron, modifikasi pengguna pada pemesanan yang ada tidak didukung. Sebagai gantinya, pengguna harus membatalkan pemesanan dan membuat pemesanan baru.

Update Real-Time

Untuk update real-time pada ketersediaan, confirmation_mode harus ditentukan. Hal ini berlaku untuk metode berikut:

RTU Inventaris (OverrideServiceAvailability atau BatchOverrideServiceAvailability)

Dengan menggunakan metode availability.replace (batch) atau metode services.availability.replace, tetapkan confirmation_mode ke CONFIRMATION_MODE_ASYNCHRONOUS di Availability

Asinkron

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

Sinkron

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

Asinkron dan Sinkron

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

Perubahan asinkron pada status pemesanan harus dilakukan melalui metode bookings.patch Booking Notification API.

Saat memperbarui status, pastikan untuk menyertakan nama kolom status di bagian updateMask.

Status Deskripsi
CONFIRMED penjual mengonfirmasi pemesanan
FAILED partner tidak dapat mengonfirmasi atau menolak pemesanan dengan penjual
DECLINED_BY_MERCHANT penjual menolak pemesanan
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"}

Jika terjadi kegagalan pemesanan, tetapkan status pemesanan ke FAILED dan tentukan pemesanan_failure. Jika status ditetapkan ke yang lain, booking_failure akan diabaikan.

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

Notifikasi Email

Untuk pemesanan asinkron, ada lima kemungkinan email yang terkait dengan status pemesanan yang dikirim kepada pengguna.

  • PENDING_MERCHANT_CONFIRMATION
  • CONFIRMED
  • DECLINED_BY_MERCHANT
  • FAILED
  • CANCELED