Menyiapkan Mengirim pesanan

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, atau REJECTED.

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:

  1. Intent: Kolom inputs[0].intent pada setiap isi permintaan pengiriman berisi nilai string actions.intent.TRANSACTION_DECISION.
  2. Order: Kolom inputs[0].arguments[0].transactionDecisionValue dalam permintaan pengiriman pesanan berisi objek Order yang mewakili pesanan pelanggan yang akan dilakukan, beserta detail pembayaran.
  3. 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 kolom finalResponse.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: Objek OrderState 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

  1. Lakukan validasi layanan, keranjang, dan promosi seperti yang dilakukan di Menyiapkan Checkout.
  2. 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
  • Informasi pengguna seperti nomor telepon atau Email tidak valid.
  • Mesin risiko Anda mendeteksi penipuan.
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

  1. Hitung totalPrice dengan menambahkan harga keranjang, biaya, diskon, pajak, dan tip. totalPrice harus sama dengan totalPrice yang ditampilkan di CheckoutResponseMessage ditambah perubahan jumlah tip jika tip dapat diubah oleh pengguna. Lihat Perubahan harga selama mengirimkan pesanan untuk detail selengkapnya.
  2. Proses pesanan dan pembayaran jika Anda mengembalikan respons dengan status pesanan CREATED atau CONFIRMED.
  3. Pastikan format respons yang valid ditampilkan menggunakan jenis yang dihasilkan yang dibuat dari skema seperti yang dijelaskan dalam membuat library klien.
  4. Gunakan GoogleProvidedPaymentInstrument.instrumentToken untuk memproses pembayaran. Tampilkan RejectionInfo dengan jenis PAYMENT_DECLINED jika pembayaran tidak dapat diproses. Lihat Memproses pembayaran untuk detail selengkapnya.
  5. Segera beri tahu pengguna setelah pesanan diproses melalui Email dan atau SMS.

Kembalikan respons

  1. Tetapkan OrderState.state ke CREATED atau CONFIRMED jika tidak ada error.
  2. Tetapkan OrderState.state ke REJECTED jika terjadi error dan sertakan objek RejectionInfo dengan RejectionInfoType yang sesuai.
  3. Tetapkan OrderUpdate.orderManagementActions.