Proses checkout dipanggil saat pengguna membuat keranjang. Isi keranjang pengguna dan detail pesanan dikirim ke layanan web Pemesanan End-to-End Anda. Informasi ini divalidasi oleh layanan web, lalu Anda dapat melanjutkan atau melakukan penyesuaian pada keranjang sesuai kebutuhan.
Pengendali checkout untuk layanan web Anda harus merespons permintaan POST. Saat pelanggan memilih untuk melakukan check out, Google akan mengirimkan isi permintaan JSON ke layanan web Pemesanan End-to-End dalam bentuk CheckoutRequestMessage
, yang berisi detail Cart
pelanggan. Layanan web Anda kemudian merespons kembali dengan
CheckoutResponseMessage
. Diagram berikut menggambarkan prosesnya.
Setelah menerima permintaan checkout, layanan web Pemesanan End-to-End Anda harus melakukan hal berikut:
- Periksa validitas keranjang berdasarkan harga item, ketersediaan, dan layanan penyedia saat ini.
- Menghitung total harga (termasuk diskon, pajak, dan biaya pengiriman).
- Jika berhasil, respons dengan keranjang yang tidak dimodifikasi.
- Jika tidak berhasil, tanggapi dengan pesan error dan pesanan baru yang diajukan.
Sebelum mulai menerapkan checkout, sebaiknya tinjau dokumentasi Ringkasan pemenuhan.
Pesan Permintaan Checkout
Untuk memvalidasi keranjang pelanggan, saat pelanggan memilih untuk melakukan check out, Google mengirimkan permintaan ke layanan web Anda dengan isi JSON dalam bentuk CheckoutRequestMessage
. Pesanan pelanggan tidak dikirimkan sampai nanti dalam alur Pemesanan End-to-End.
Data yang terdapat dalam
CheckoutRequestMessage
mencakup hal berikut:
- Intent: Kolom
inputs[0].intent
di setiap isi permintaan checkout berisi nilai stringactions.foodordering.intent.CHECKOUT
. - Keranjang: Kolom
inputs[0].arguments[0].extension
permintaan checkout berisi objekCart
yang mewakili keranjang pelanggan. - Pengiriman atau bawa pulang: Kolom ekstensi objek
Cart
berisi objekFoodCartExtension
yang menentukan properti untuk pengiriman atau bawa pulang:- Untuk pesanan pengiriman, objek
FoodCartExtension
menyertakan alamat pengiriman. - Untuk pesanan ambil sendiri atau bawa pulang, objek
FoodCartExtension
tidak berisi informasi lokasi apa pun.
- Untuk pesanan pengiriman, objek
- Sandbox: Kolom
isInSandbox
pada permintaan checkout berisi nilai boolean yang menunjukkan apakah transaksi menggunakan pembayaran sandbox.
Contoh permintaan checkout
Berikut adalah contoh CheckoutRequestMessage
:
{
"user": {},
"conversation": {
"conversationId": "CTZbZfUlHCybEdcz_5PB3Ttf"
},
"inputs": [
{
"intent": "actions.foodordering.intent.CHECKOUT",
"arguments": [
{
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.Cart",
"merchant": {
"id": "restaurant/Restaurant/QWERTY",
"name": "Tep Tep Chicken Club"
},
"lineItems": [
{
"name": "Spicy Fried Chicken",
"type": "REGULAR",
"id": "299977679",
"quantity": 2,
"price": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "AUD",
"units": "39",
"nanos": 600000000
}
},
"offerId": "MenuItemOffer/QWERTY/scheduleId/496/itemId/143",
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension"
}
}
],
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
"fulfillmentPreference": {
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "P0M"
}
}
},
"location": {
"coordinates": {
"latitude": -33.8376441,
"longitude": 151.0868736
},
"formattedAddress": "Killoola St, 1, Concord West NSW 2138",
"zipCode": "2138",
"city": "Concord West",
"postalAddress": {
"regionCode": "AU",
"postalCode": "2138",
"administrativeArea": "NSW",
"locality": "Concord West",
"addressLines": [
"Killoola St",
"1"
]
}
}
}
}
}
]
}
],
"directActionOnly": true,
"isInSandbox": true
}
Pesan Respons Checkout
Setelah menerima permintaan dari layanan Pemesanan End-to-End, layanan web checkout Anda harus memprosesnya dan merespons dengan CheckoutResponseMessage
. CheckoutResponseMessage
harus mencakup permintaan yang berhasil atau gagal.
Permintaan berhasil
Jika permintaan check out berhasil, CheckoutResponseMessage
harus menyertakan
ProposedOrder
dan
PaymentOptions
:
ProposedOrder
cart
: Objekcart
yang identik dengan keranjang yang diberikan diCheckoutRequestMessage
. Jika ada konten keranjang yang perlu diubah,CheckoutResponseMessage
harus menyertakanFoodErrorExtension
denganProposedOrder
yang dikoreksi.otherItems
: Item yang ditambahkan oleh penyedia, misalnya ongkos kirim, pajak, dan biaya lainnya. Dapat juga berisi tip yang ditambahkan oleh pengguna.totalPrice
: Total harga pesanan.extension
:FoodOrderExtension
yang menentukan informasi fulfillment untuk pesanan, seperti waktu pengiriman.
PaymentOptions
- Penyiapan pemrosesan pembayaran akan dibahas nanti di bagian Menyiapkan Google
Pay.
Anda dapat menggunakan JSON placeholder di
CheckoutResponseMessage
sampai siap menerapkan pemrosesan pembayaran. - Untuk menambahkan opsi pembayaran placeholder di
CheckoutResponseMessage
Anda, lihat contoh di bawah, yang menggunakan contoh gateway pembayaran untukPaymentOptions
.
- Penyiapan pemrosesan pembayaran akan dibahas nanti di bagian Menyiapkan Google
Pay.
Anda dapat menggunakan JSON placeholder di
Contoh respons yang berhasil
{
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"checkoutResponse": {
"proposedOrder": {
"cart": {
"merchant": {
"id": "restaurant/Restaurant/QWERTY",
"name": "Tep Tep Chicken Club"
},
"lineItems": [
{
"name": "Spicy Fried Chicken",
"type": "REGULAR",
"id": "299977679",
"quantity": 2,
"price": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "AUD",
"units": "39",
"nanos": 600000000
}
},
"offerId": "MenuItemOffer/QWERTY/scheduleId/496/itemId/143",
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension"
}
}
],
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
"fulfillmentPreference": {
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "P0M"
}
}
},
"location": {
"coordinates": {
"latitude": -33.8376441,
"longitude": 151.0868736
},
"formattedAddress": "Killoola St, 1, Concord West NSW 2138",
"zipCode": "2138",
"city": "Concord West",
"postalAddress": {
"regionCode": "AU",
"postalCode": "2138",
"administrativeArea": "NSW",
"locality": "Concord West",
"addressLines": [
"Killoola St",
"1"
]
}
}
}
},
"totalPrice": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "AUD",
"units": "43",
"nanos": 100000000
}
},
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension",
"availableFulfillmentOptions": [
{
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "P0M"
}
}
}
]
},
"otherItems": [
{
"name": "Delivery fee",
"price": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "AUD",
"units": "3",
"nanos": 500000000
}
},
"type": "DELIVERY"
}
]
},
"paymentOptions": {
"googleProvidedOptions": {
"facilitationSpecification": "{\"apiVersion\":2,\"apiVersionMinor\":0,\"merchantInfo\":{\"merchantName\":\"merchantName\"},\"allowedPaymentMethods\":[{\"type\":\"CARD\",\"parameters\":{\"allowedAuthMethods\":[\"PAN_ONLY\"],\"allowedCardNetworks\":[\"VISA\",\"MASTERCARD\"],\"billingAddressRequired\":true,\"cvcRequired\":false},\"tokenizationSpecification\":{\"type\":\"PAYMENT_GATEWAY\",\"parameters\":{\"gatewayMerchantId\":\"YOUR_MERCHANT_ID\",\"gateway\":\"cybersource\"}}}],\"transactionInfo\":{\"currencyCode\":\"AUD\",\"totalPriceStatus\":\"ESTIMATED\",\"totalPrice\":\"43.1\"}} "
}
},
"additionalPaymentOptions": [
{
"actionProvidedOptions": {
"paymentType": "ON_FULFILLMENT",
"displayName": "Pay when you get your food.",
"onFulfillmentPaymentData": {
"supportedPaymentOptions": []
}
}
}
]
}
}
}
]
}
}
}
Permintaan gagal
Jika permintaan checkout tidak berhasil, CheckoutResponseMessage
harus
menyertakan FoodErrorExtension
, yang berisi daftar
item FoodOrderError
yang menjelaskan error yang terjadi. Jika ada error yang dapat dipulihkan
pada pesanan, seperti perubahan harga item di keranjang, FoodErrorExtension
harus menyertakan correctedProposedOrder
.
Contoh respons yang gagal
{
"expectUserResponse": false,
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"error": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension",
"foodOrderErrors": [
{
"error": "CLOSED",
"description": "The restaurant is closed."
}
]
}
}
}
]
}
}
}
Penerapan Checkout
Langkah-langkah berikut harus dilakukan saat menerapkan checkout.
Validasi layanan
Tampilkan FoodOrderError untuk kondisi error layanan pertama yang ditemukan. Error ini tidak dapat dipulihkan, sehingga error pertama yang ditemukan harus ditampilkan. Lihat Menangani error untuk mengetahui deskripsi error yang dapat dipulihkan.
- Baca properti FulfillmentOptionInfo dalam
permintaan untuk menentukan apakah jenis fulfillment untuk
delivery
ataupickup
. Tampilkan jenis error berikut jika diperlukan:
Jenis error Kasus penggunaan INVALID Jenis pemenuhan tidak valid. NOT_FOUND Jenis pemenuhan tidak ditemukan. DITUTUP - Tidak ada jendela OperationHours untuk pesanan tersebut.
- Pesanan tersebut adalah pesanan SEGERA dan tidak ada ServiceHours ASAP yang tersedia untuk waktu saat ini.
- Ada penutupan darurat atau layanan
isDisabled
berlaku.
UNAVAILABLE_SLOT Pesanan di muka tidak dapat dipenuhi. NO_CAPACITY Restoran sedang sibuk dan tidak menerima pesanan saat ini. OUT_OF_SERVICE_AREA Pesanan tidak dapat dikirimkan ke alamat pengguna. Lihat Validasi alamat pengiriman untuk mengetahui contohnya. NO_COURIER_AVAILABLE Pesanan tidak dapat dikirimkan karena personel pengiriman terbatas.
Memvalidasi dan menentukan harga keranjang
Cari setiap Keranjang.
lineItems
dan validasi dengan data saat ini di sistem Anda atau di sistem penjual. Nilai MenuItemOffer.sku
dari entitas feed disertakan sebagai LineItem.offerId
. Buat FoodOrderError untuk setiap item baris jika diperlukan. Buat maksimum satu error untuk setiap item. Tampilkan jenis error berikut jika diperlukan:Jenis error Kasus penggunaan Dapat dipulihkan INVALID Data item atau data opsi apa pun tidak valid. Tidak NOT_FOUND Item atau opsi apa pun tidak ditemukan. Tidak PRICE_CHANGED Harga item atau kombinasi add-on telah berubah. Error ini dapat dianggap dapat dipulihkan. Ya AVAILABILITY_CHANGED Jumlah yang diminta untuk item baris atau opsi apa pun tidak tersedia. Ya REQUIREMENTS_NOT_MET Jumlah minimum pesanan atau maksimum pesanan tidak terpenuhi. Hal ini dapat ditentukan dengan memeriksa apakah harga keranjang di bawah Biaya. eligibleTransactionVolumeMin
atau di atas Biaya.eligibleTransactionVolumeMax
. Lihat contoh dalam validasi nilai pesanan minimum.Tidak Tampilkan daftar lineItems yang divalidasi dengan LineItemType
REGULAR
. Jumlah semua harga item baris keranjang adalah harga keranjang atauSUBTOTAL
.
Lihat contoh di validasi item keranjang.
Menghitung tarif layanan
- Temukan entity Fee yang benar untuk layanan berdasarkan
eligibleRegion
,validFrom
,validThrough
, danpriority
. - Hitung jumlah biaya berdasarkan apakah entitas ditentukan dengan properti
price
,percentageOfCart
, ataupricePerMeter
. - Tampilkan tarif layanan pengiriman atau pengeksporan sebagai LineItem dengan
LineItemType
DELIVERY
atauFEE
. Tambahkan biaya ke daftar Keranjang.otherItems
.
Menerapkan promosi
- Temukan entitas Transaksi berdasarkan pencocokan nilai
Promosi.
coupon
dengan Transaksi.dealCode
. Validasi transaksi dan tampilkan FoodOrderError jika diperlukan. Error ini dapat dianggap dapat dipulihkan. Tampilkan jenis error berikut jika diperlukan:
Jenis error Kasus penggunaan PROMO_NOT_RECOGNIZED Kode kupon tidak dikenal. PROMO_EXPIRED Validitas transaksi sudah tidak berlaku. PROMO_ORDER_INELIGIBLE Pesanan tidak memenuhi syarat untuk kupon. PROMO_NOT_APPLICABLE Alasan lainnya. Hitung jumlah harga promo berdasarkan Transaksi.
discount
atau Transaksi.discountPercentage
.Terapkan jumlah harga promo menggunakan total keranjang atau total biaya, bergantung pada Transaksi.
dealType
.Tampilkan Keranjang.
promotions
dengan promosi yang diterapkan.Tampilkan promosi sebagai LineItem dengan LineItemType
DISCOUNT
. Tambahkan diskon ke daftar Keranjang.otherItems
dengan harga negatif.
Kembalikan respons
- Buat ProposedOrder.
cart
, keranjang respons sama dengan keranjang permintaan jika tidak ada error yang terjadi selama validasi. - Tampilkan daftar ProposedOrder.
otherItems
termasuk pajak, biaya, tip, dan diskon jika diterapkan. Lihat Gratuity untuk mengetahui detail selengkapnya tentang cara mengonfigurasi item tip. - Sertakan ProposedOrder.
totalPrice
dengan menambahkan harga, biaya, diskon, pajak, dan tip keranjang. - Tampilkan
FoodOrderExtension.
availableFulfillmentOptions
dengan FulfillmentOption masing-masing. Perbarui perkiraan waktu pengambilan atau pengiriman ke waktu yang diharapkan. - Jika ada FoodOrderErrors yang dihasilkan dari pemeriksaan validasi sebelumnya:
- Sertakan StructuredResponse.
error
dan daftar error di FoodErrorExtension.foodOrderErrors
. - Tampilkan ProposedOrder di
kolom
correctedProposedOrder
jika semua error dapat dipulihkan. - Tampilkan PaymentOptions di kolom
paymentOptions
jika semua error dapat dipulihkan. - Secara opsional, sertakan
additionalPaymentOptions
jika ada opsi pembayaran lain yang tersedia dan semua error dapat dipulihkan.
- Sertakan StructuredResponse.
- Jika tidak ada error validasi, tampilkan
proposedOrder
,paymentOptions
di objek CheckoutResponse. Secara opsional, sertakanadditionalPaymentOptions
jika ada opsi pembayaran lain yang tersedia.