Setelah panggilan checkout, pengguna meninjau keranjang yang diperbarui dengan pajak, biaya pengiriman, diskon, dan biaya lain yang Anda kembalikan. Pengguna mengonfirmasi dan mengirimkan pesanan, lalu Google mengirimkan permintaan JSON yang berisi informasi pesanan tersebut ke endpoint fulfillment Anda. Layanan web Anda harus menerima pesanan ini, memprosesnya, dan merespons kembali ke Google dengan status pesanan.
Bagian ini menjelaskan format pesan permintaan urutan yang dikirim oleh Google, yang disebut SubmitOrderRequestMessage
, dan format pesan respons yang harus Anda berikan, yang disebut SubmitOrderResponseMessage
.
Untuk mengetahui informasi selengkapnya tentang siklus proses fulfillment pesanan, lihat
Ringkasan pemenuhan pesanan.
Penerapan pemenuhan pesanan
Layanan web Pengurutan Menyeluruh yang Anda buat agar berfungsi dengan Pemesanan Menyeluruh harus menyertakan endpoint URL untuk menerima pesan pesanan dari Google. Untuk pemrosesan pesanan, layanan web Anda menerima SubmitOrderRequestMessage
dalam format JSON sebagai permintaan POST dari Google. Permintaan ini berisi pesanan pelanggan,
termasuk pajak, biaya, dan informasi pembayaran. Setelah menerima permintaan kirim, layanan web Anda harus melakukan hal berikut:
- Memeriksa kelayakan transaksi, seperti verifikasi kartu atau deteksi penipuan.
- Buat pesanan di sistem Anda.
- Izinkan metode pembayaran dan panggil API tagihan dari pemroses pembayaran Anda jika berlaku.
- Berikan respons dengan status pesanan yang sesuai:
CREATED
,CONFIRMED
, atauREJECTED
.
Setelah memproses pesanan, kode fulfillment Anda harus memberikan respons
dalam bentuk pesan JSON SubmitOrderResponseMessage
kembali ke Google.
Untuk informasi selengkapnya tentang persyaratan penerapan layanan web fulfillment Pemesanan End-to-End, lihat Ringkasan fulfillment.
Pesan permintaan pesanan
Saat pelanggan memilih untuk melakukan pemesanan selama alur Pemesanan End-to-End, Google mengirimkan permintaan ke layanan web Anda dengan pesan JSON yang disebut SubmitOrderRequestMessage
yang berisi data berikut:
- Intent: Kolom
inputs[0].intent
pada setiap isi permintaan pengiriman berisi nilai stringactions.intent.TRANSACTION_DECISION
. - Order: Kolom
inputs[0].arguments[0].transactionDecisionValue
dalam permintaan pengiriman pesanan berisi objekOrder
yang mewakili pesanan pelanggan yang akan dilakukan, beserta detail pembayaran. - Flag sandbox: Kolom
isInSandbox
pada permintaan kirim pesanan menunjukkan apakah transaksi menggunakan pembayaran sandbox.
Contoh permintaan pesanan
Berikut adalah contoh SubmitOrderRequestMessage
:
JSON
{ "user": {}, "conversation": { "conversationId": "CTKbKfUlHCyDEdcz_5PBJTtf" }, "inputs": [ { "intent": "actions.intent.TRANSACTION_DECISION", "arguments": [ { "transactionDecisionValue": { "order": { "finalOrder": { "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" ] } }, "contact": { "displayName": "Hab Sy", "email": "hab9878.sy@gmail.com", "phoneNumber": "+61000000000", "firstName": "Hab", "lastName": "Sy" } } }, "otherItems": [ { "name": "Delivery fee", "type": "DELIVERY", "price": { "type": "ESTIMATE", "amount": { "currencyCode": "AUD", "units": "3", "nanos": 500000000 } } }, { "name": "Subtotal", "type": "SUBTOTAL", "price": { "type": "ESTIMATE", "amount": { "currencyCode": "AUD", "units": "39", "nanos": 600000000 } } } ], "totalPrice": { "type": "ESTIMATE", "amount": { "currencyCode": "AUD", "units": "43", "nanos": 100000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension" } }, "googleOrderId": "01412971004192156198", "orderDate": "2020-10-22T09:02:06.173Z", "paymentInfo": { "displayName": "Pay when you get your food", "paymentType": "ON_FULFILLMENT" } } } } ] } ], "directActionOnly": true, "isInSandbox": true }
Pesan respons pesanan
Setelah menerima permintaan, layanan web Pemesanan End-to-End akan memproses permintaan tersebut dan mengirimkan kembali SubmitOrderResponseMessage
yang menyertakan data berikut:
OrderUpdate
: Objek yang berisi status pesanan, dan semua tindakan pascapesanan yang tersedia bagi pengguna, seperti menghubungi dukungan dan melihat detail pesanan, yang Anda tentukan dalam kolomfinalResponse.richResponse.items[0].structuredResponse.orderUpdate
respons.
Kolom pembaruan pesanan
Saat layanan web Anda mengirimkan SubmitOrderResponseMessage
, layanan akan berisi
kolom OrderUpdate
yang mencakup kolom berikut:
actionOrderId
: ID unik pesanan, yang digunakan untuk mengidentifikasi pesanan dalam sistem Anda secara unik dan merujuk ke ID tersebut saat mengirim pembaruan pesanan berikutnya.orderState
: ObjekOrderState
yang mewakili status pesanan.orderManagementActions
: Tindakan pascapemesanan yang tersedia bagi pengguna, seperti menghubungi dukungan pelanggan dan melihat detail pesanan.totalPrice
: Total harga pesanan. Langkah ini bersifat opsional. Hanya kirim jika total harga pesanan berubah setelah pesanan dikirimkan.
Pesanan dapat berada dalam salah satu status berikut:
CREATED
: Endpoint fulfillment Anda berhasil memproses pesanan, tetapi penyedia belum mengonfirmasi pesanan.CONFIRMED
: Endpoint fulfillment Anda berhasil memproses pesanan, dan penyedia telah mengonfirmasi pesanan.REJECTED
: Terjadi masalah dan endpoint fulfillment Anda tidak dapat membuat atau mengonfirmasi pesanan, yang dapat mencakup masalah dengan pembayaran.
Jika Anda menetapkan pesanan ke status REJECTED
, tentukan alasannya dalam kolom rejectionInfo
pada OrderUpdate
. Gunakan
nilai FoodOrderUpdateExtension.FoodOrderErrors
bersama dengan
rejectionInfo
dari jenis UNKNOWN
dan berikan deskripsi.
Contoh respons pesanan
Berikut adalah contoh SubmitOrderResponseMessage
:
JSON
{ "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "orderUpdate": { "actionOrderId": "1603357328160", "orderState": { "state": "CONFIRMED", "label": "Pending" }, "updateTime": "2020-10-22T02:02:08-07:00", "orderManagementActions": [ { "type": "CUSTOMER_SERVICE", "button": { "title": "Call customer service", "openUrlAction": { "url": "tel:+61234561000" } } }, { "type": "VIEW_DETAILS", "button": { "title": "View order details", "openUrlAction": { "url": "https://partner.com/view/orderstatus" } } } ], "receipt": { "userVisibleOrderId": "BXZ-1603357328" } } } } ] } } }
Permintaan gagal
Jika permintaan pengiriman tidak berhasil, SubmitOrderResponseMessage
harus menetapkan OrderState.state
ke REJECTED
. Respons juga harus menyertakan RejectionInfo, yang berisi objek RejectionType
untuk mendeskripsikan jenis error.
Contoh respons yang gagal
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "REJECTED", "label": "Order rejected" }, "updateTime": "2017-05-10T02:30:00.000Z", "rejectionInfo": { "type": "PAYMENT_DECLINED", "reason": "Insufficient funds" }, "orderManagementActions": [ { "type": "CUSTOMER_SERVICE", "button": { "title": "Contact customer service", "openUrlAction": { "url": "mailto:support@example.com" } } }, { "type": "EMAIL", "button": { "title": "Email restaurant", "openUrlAction": { "url": "mailto:person@example.com" } } }, { "type": "CALL", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "VIEW_DETAILS", "button": { "title": "View order", "openUrlAction": { "url": "https://orderview.partner.com?orderid=sample_action_order_id" } } } ] } } } ] } } }
Mengirim penerapan pesanan
Langkah-langkah berikut harus dilakukan saat menerapkan Submit Order API.
Validasi
- Lakukan validasi layanan, keranjang, dan promosi seperti yang dilakukan di Menyiapkan Checkout.
- Tampilkan RejectionInfo dengan salah satu jenis berikut jika diperlukan:
RejectionInfoType | Kasus penggunaan |
---|---|
UNAVAILABLE_SLOT |
Waktu pemenuhan tidak lagi valid. |
PROMO_USER_INELIGIBLE |
Gunakan Email di objek Kontak dalam permintaan untuk memvalidasi kelayakan promosi bagi pengguna. Lihat contoh dalam menerapkan perintah kirim dengan promosi. |
INELIGIBLE |
|
PAYMENT_DECLINED |
Pembayaran tidak dapat diproses. Misalnya, hal ini dapat disebabkan oleh dana yang tidak cukup. |
UNKNOWN |
Untuk error validasi lainnya. |
Tetapkan OrderState.state
ke REJECTED
jika terjadi error validasi. Secara opsional, Anda dapat memberikan alasan penolakan tertentu menggunakan FoodOrderUpdateExtension.foodOrderErrors
. Lihat contoh di bagian
Mengirim validasi Pesanan.
Memproses pembayaran
- Hitung
totalPrice
dengan menambahkan harga keranjang, biaya, diskon, pajak, dan tip.totalPrice
harus sama dengantotalPrice
yang ditampilkan di CheckoutResponseMessage ditambah perubahan jumlah tip jika tip dapat diubah oleh pengguna. Lihat Perubahan harga selama mengirimkan pesanan untuk detail selengkapnya. - Proses pesanan dan pembayaran jika Anda mengembalikan respons dengan status pesanan
CREATED
atauCONFIRMED
. - Pastikan format respons yang valid ditampilkan menggunakan jenis yang dihasilkan yang dibuat dari skema seperti yang dijelaskan dalam membuat library klien.
- Gunakan
GoogleProvidedPaymentInstrument.
instrumentToken
untuk memproses pembayaran. Tampilkan RejectionInfo dengan jenisPAYMENT_DECLINED
jika pembayaran tidak dapat diproses. Lihat Memproses pembayaran untuk detail selengkapnya. - Segera beri tahu pengguna setelah pesanan diproses melalui Email dan atau SMS.
Kembalikan respons
- Tetapkan OrderState.
state
keCREATED
atauCONFIRMED
jika tidak ada error. - Tetapkan OrderState.
state
keREJECTED
jika terjadi error dan sertakan objek RejectionInfo dengan RejectionInfoType yang sesuai. - Tetapkan OrderUpdate.
orderManagementActions
.