Setelah checkout panggilan telepon, pengguna meninjau keranjang yang telah diperbarui dengan pajak, biaya pengiriman, diskon, dan tagihan lain yang Anda kembalikan. Pengguna mengonfirmasi dan mengirimkan pesanan dan Google mengirimkan permintaan JSON ke endpoint fulfillment Anda yang berisi informasi pesanan. Layanan web Anda harus menerima pesanan ini, memprosesnya, dan merespons kembali ke Google dengan status pesanan.
Bagian ini menjelaskan format pesan permintaan pesanan yang dikirim oleh Google,
disebut SubmitOrderRequestMessage
, dan format pesan respons
yang harus Anda sediakan, yang disebut
SubmitOrderResponseMessage
.
Untuk informasi selengkapnya tentang siklus proses pemenuhan pesanan, lihat
Ringkasan pemenuhan pesanan.
Implementasi pemenuhan pesanan
Layanan web Menyeluruh Pemesanan yang Anda buat agar berfungsi dengan Pemesanan Menyeluruh harus
menyertakan endpoint URL untuk menerima pesan pesanan dari Google. Untuk pesanan
dalam pemrosesan, layanan web Anda akan menerima SubmitOrderRequestMessage
dalam JSON
sebagai permintaan POST dari Google. Permintaan ini berisi
pesanan pelanggan,
termasuk pajak, biaya, dan informasi pembayaran. Setelah menerima pesanan pengiriman
layanan web Anda harus melakukan hal berikut:
- Periksa kelayakan transaksi, seperti verifikasi kartu atau deteksi penipuan.
- Buat pesanan di sistem Anda.
- Otorisasi metode pembayaran dan panggil API biaya pemroses pembayaran Anda, jika berlaku.
- Merespons dengan status pesanan yang sesuai:
CREATED
,CONFIRMED
, atauREJECTED
.
Setelah memproses pesanan, kode pemenuhan pesanan Anda harus memberikan respons
dalam bentuk pesan JSON SubmitOrderResponseMessage
kembali ke Google.
Untuk informasi selengkapnya tentang layanan web pemenuhan pesanan Menyeluruh persyaratan penerapan, lihat Ringkasan pemenuhan.
Pesan permintaan pesanan
Ketika pelanggan memilih untuk melakukan pemesanan selama alur Pemesanan Menyeluruh,
Google mengirimkan permintaan ke layanan web Anda dengan pesan JSON yang disebut
SubmitOrderRequestMessage
yang berisi data berikut:
- Intent: Kolom
inputs[0].intent
dari setiap isi permintaan pengiriman berisi nilai stringactions.intent.TRANSACTION_DECISION
. - Order: Kolom
inputs[0].arguments[0].transactionDecisionValue
permintaan pengiriman berisi objekOrder
yang mewakili pemesanan pelanggan, bersama dengan detail pembayaran. - Flag sandbox: Kolom
isInSandbox
dalam permintaan pengiriman pesanan menunjukkan apakah transaksi menggunakan pembayaran {i>sandbox<i} atau tidak.
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 End-to-End Pemesanan Anda
dan mengirimkan kembali SubmitOrderResponseMessage
yang menyertakan
data berikut:
OrderUpdate
: Objek yang berisi status pesanan, dan tindakan pasca-pemesanan yang tersedia bagi pengguna, seperti menghubungi dukungan dan melihat detail pesanan, yang Anda tentukan di KolomfinalResponse.richResponse.items[0].structuredResponse.orderUpdate
dari responsnya.
Kolom pembaruan pesanan
Ketika layanan web Anda mengirimkan SubmitOrderResponseMessage
, layanan tersebut berisi
Kolom OrderUpdate
yang mencakup kolom berikut:
actionOrderId
: ID unik pesanan, yang digunakan untuk secara unik mengidentifikasi pesanan dalam sistem Anda dan merujuknya ketika mengirimkan pesanan pembaruan pesanan.orderState
: ObjekOrderState
yang mewakili status pesanan.orderManagementActions
: Tindakan pasca-pemesanan yang tersedia bagi pengguna, seperti saat menghubungi dukungan pelanggan dan melihat detail pesanan.totalPrice
: Harga total 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 pemenuhan Anda berhasil memproses pesanan. namun penyedia belum mengonfirmasi pesanan.CONFIRMED
: Endpoint pemenuhan Anda berhasil memproses pesanan. dan penyedia telah mengonfirmasi pesanan.REJECTED
: Terjadi masalah dan endpoint pemenuhan Anda tidak dapat membuat atau mengonfirmasi pesanan, yang dapat mencakup masalah terkait pembayaran.
Jika Anda menetapkan pesanan ke status REJECTED
, tentukan alasannya dalam
Kolom rejectionInfo
dari OrderUpdate
. Gunakan
Nilai FoodOrderUpdateExtension.FoodOrderErrors
bersama dengan
rejectionInfo
dari jenis UNKNOWN
dan memberikan 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 ditetapkan
OrderState.state
ke REJECTED
. Respons juga harus
menyertakan RejectionInfo, yang berisi RejectionType
untuk menjelaskan jenis kesalahan.
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 API pengiriman.
Validasi
- Lakukan validasi layanan, keranjang, dan promosi seperti yang telah dilakukan di bagian Penyiapan Checkout.
- Menampilkan RejectionInfo dengan salah satu jenis berikut jika diperlukan:
RejectionInfoType | Kasus penggunaan |
---|---|
UNAVAILABLE_SLOT |
Waktu pemenuhan tidak lagi valid. |
PROMO_USER_INELIGIBLE |
Gunakan Email pada objek Kontak dalam permintaan untuk memvalidasi kelayakan promosi bagi pengguna. Lihat contoh dalam menerapkan pesanan pengiriman dengan promosi. |
INELIGIBLE |
|
PAYMENT_DECLINED |
Pembayaran tidak dapat diproses. Misalnya, hal ini mungkin karena dana tidak cukup. |
UNKNOWN |
Untuk error validasi lainnya. |
Tetapkan OrderState.state
ke REJECTED
jika ada validasi
terjadi error. Jika ingin, Anda dapat memberikan alasan penolakan tertentu
menggunakan FoodOrderUpdateExtension.foodOrderErrors
Lihat contohnya di
Kirim Validasi pesanan.
Memproses pembayaran
- Hitung
totalPrice
dengan menambahkan harga keranjang, biaya, diskon, pajak, dan keuntungan.totalPrice
harus sama dengantotalPrice
yang ditampilkan di CheckoutResponseMessage ditambah dengan perubahan di jumlah tip jika tip dapat diubah oleh pengguna. Lihat Harga perubahan saat pengiriman pesanan untuk mengetahui detail selengkapnya. - Proses pesanan dan pembayaran jika Anda mengembalikan respons dengan status pesanan
dari
CREATED
atauCONFIRMED
. - Pastikan format respons yang valid ditampilkan menggunakan jenis yang dibuat dibuat dari skema seperti yang dijelaskan dalam membuat library klien.
- Gunakan
GoogleProvidedPaymentInstrument.
instrumentToken
untuk memproses pembayaran. Menampilkan RejectionInfo dengan jenisPAYMENT_DECLINED
jika pembayaran tidak dapat diproses. Lihat Proses pembayaran untuk detail selengkapnya. - Beri tahu pengguna segera setelah pesanan diproses melalui Email dan atau SMS.
Tampilkan respons
- Tetapkan OrderState.
state
keCREATED
atauCONFIRMED
jika tidak ada error. - Tetapkan OrderState.
state
keREJECTED
jika terjadi error ditemukan dan menyertakan objek RejectionInfo dengan RejectionInfoType yang sesuai. - Tetapkan OrderUpdate.
orderManagementActions
.