Menyiapkan Mengirim pesanan

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

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:

  1. Intent: Kolom inputs[0].intent dari setiap isi permintaan pengiriman berisi nilai string actions.intent.TRANSACTION_DECISION.
  2. Order: Kolom inputs[0].arguments[0].transactionDecisionValue permintaan pengiriman berisi objek Order yang mewakili pemesanan pelanggan, bersama dengan detail pembayaran.
  3. 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 Kolom finalResponse.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: Objek OrderState 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

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

  1. Hitung totalPrice dengan menambahkan harga keranjang, biaya, diskon, pajak, dan keuntungan. totalPrice harus sama dengan totalPrice 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.
  2. Proses pesanan dan pembayaran jika Anda mengembalikan respons dengan status pesanan dari CREATED atau CONFIRMED.
  3. Pastikan format respons yang valid ditampilkan menggunakan jenis yang dibuat dibuat dari skema seperti yang dijelaskan dalam membuat library klien.
  4. Gunakan GoogleProvidedPaymentInstrument.instrumentToken untuk memproses pembayaran. Menampilkan RejectionInfo dengan jenis PAYMENT_DECLINED jika pembayaran tidak dapat diproses. Lihat Proses pembayaran untuk detail selengkapnya.
  5. Beri tahu pengguna segera setelah pesanan diproses melalui Email dan atau SMS.

Tampilkan respons

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