Proses checkout dipanggil saat pengguna membuat keranjang. Konten keranjang pengguna dan detail tentang pesanan akan dikirim ke layanan web Pesan dengan Google Anda. Informasi ini divalidasi oleh layanan web Anda, lalu Anda dapat melanjutkan atau melakukan penyesuaian pada keranjangnya sesuai kebutuhan.
Pengendali checkout untuk layanan web Anda harus merespons permintaan POST. Saat
pelanggan memilih untuk melakukan check out, Google mengirimkan isi permintaan JSON dalam layanan web
Pesan ke Google dalam bentuk CheckoutRequestMessage
, yang berisi
detail Cart
pelanggan. Layanan web Anda kemudian akan merespons kembali dengan
CheckoutResponseMessage
. Diagram berikut menggambarkan prosesnya.
Setelah menerima permintaan checkout, layanan web Pesan dengan Google Anda harus melakukan hal berikut:
- Periksa validitas keranjang berdasarkan harga item saat ini, ketersediaan, dan layanan penyedia.
- Hitung harga total (termasuk diskon, pajak, dan biaya pengiriman).
- Jika berhasil, berikan respons dengan keranjang yang tidak diubah.
- Jika tidak berhasil, balas dengan pesan error dan pesanan baru yang diusulkan.
Sebelum mulai menerapkan checkout, sebaiknya tinjau dokumentasi Ringkasan fulfillment.
Pesan Permintaan Checkout
Untuk memvalidasi keranjang pelanggan, saat pelanggan memilih untuk melakukan check out,
Google akan mengirimkan permintaan ke layanan web Anda dengan isi JSON dalam bentuk
CheckoutRequestMessage
. Pesanan pelanggan tidak dikirim hingga nanti dalam
alur Pesan dengan Google.
Data yang terdapat dalam
CheckoutRequestMessage
mencakup hal berikut:
- Intent: Kolom
inputs[0].intent
dari setiap isi permintaan checkout berisi nilai stringactions.foodordering.intent.CHECKOUT
. - Keranjang: Kolom
inputs[0].arguments[0].extension
pada permintaan checkout berisi objekCart
yang mewakili keranjang pelanggan. - Pengiriman atau pengeksporan: Kolom ekstensi objek
Cart
berisi objekFoodCartExtension
yang menentukan properti untuk pengiriman atau pengeksporan:- Untuk pesanan pengiriman, objek
FoodCartExtension
menyertakan alamat pengiriman. - Untuk pesanan pengambilan atau pengeksporan, 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 Pesan dengan Google, 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 disediakan diCheckoutRequestMessage
. Jika salah satu konten keranjang perlu diubah,CheckoutResponseMessage
harus menyertakanFoodErrorExtension
denganProposedOrder
yang dikoreksi.otherItems
: Item yang ditambahkan oleh penyedia, seperti biaya pengiriman, pajak, dan biaya lainnya. Juga dapat berisi gratifikasi yang ditambahkan oleh pengguna.totalPrice
: Harga total pesanan.extension
:FoodOrderExtension
yang menentukan informasi fulfillment untuk pesanan, seperti waktu pengiriman.
PaymentOptions
- Penyiapan pemrosesan pembayaran akan dibahas nanti di Menyiapkan Google
Pay.
Anda dapat menggunakan placeholder JSON di
CheckoutResponseMessage
hingga siap menerapkan pemrosesan pembayaran. - Untuk menambahkan opsi pembayaran placeholder di
CheckoutResponseMessage
, lihat contoh di bawah, yang menggunakan gateway pembayaran contoh untukPaymentOptions
.
- Penyiapan pemrosesan pembayaran akan dibahas nanti di Menyiapkan Google
Pay.
Anda dapat menggunakan placeholder JSON 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
perlu
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."
}
]
}
}
}
]
}
}
}