Siapkan Checkout

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.

CheckoutResponseMessage menampilkan keranjang atau error yang tidak diubah pelanggan.

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 string actions.foodordering.intent.CHECKOUT.
  • Keranjang: Kolom inputs[0].arguments[0].extension pada permintaan checkout berisi objek Cart yang mewakili keranjang pelanggan.
  • Pengiriman atau pengeksporan: Kolom ekstensi objek Cart berisi objek FoodCartExtension 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.
  • 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: Objek cart yang identik dengan keranjang yang disediakan di CheckoutRequestMessage. Jika salah satu konten keranjang perlu diubah, CheckoutResponseMessage harus menyertakan FoodErrorExtension dengan ProposedOrder 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 untuk PaymentOptions.

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."
                }
              ]
            }
          }
        }
      ]
    }
  }
}