ตั้งค่า "ส่งคำสั่งซื้อ"

หลังจากการโทรเพื่อชำระเงินแล้ว ผู้ใช้จะตรวจสอบรถเข็นที่อัปเดตแล้วซึ่งมีภาษี ค่าธรรมเนียมการนำส่ง ส่วนลด และค่าธรรมเนียมอื่นๆ ที่คุณคืน ผู้ใช้ยืนยันและส่งคำสั่งซื้อ แล้ว Google จะส่งคำขอ JSON ที่มีข้อมูลคำสั่งซื้อไปยังปลายทางการดำเนินการตามคำสั่งซื้อของคุณ เว็บเซอร์วิสของคุณต้องได้รับคำสั่งซื้อนี้ ประมวลผล และตอบกลับ Google พร้อมสถานะคำสั่งซื้อ

ส่วนนี้จะอธิบายรูปแบบข้อความคำขอสั่งซื้อที่ Google ส่ง ซึ่งเรียกว่า SubmitOrderRequestMessage และรูปแบบข้อความตอบกลับที่คุณต้องส่ง ซึ่งเรียกว่า SubmitOrderResponseMessage ดูข้อมูลเพิ่มเติมเกี่ยวกับวงจรการสั่งซื้อได้ที่หัวข้อภาพรวมการจำหน่าย

การติดตั้งใช้งานการดำเนินการตามคำสั่งซื้อ

เว็บเซอร์วิสการสั่งซื้อแบบครบวงจรที่คุณสร้างเพื่อทํางานร่วมกับการสั่งซื้อแบบครบวงจรต้องมี URL ปลายทางสําหรับรับข้อความคําสั่งซื้อจาก Google สําหรับการประมวลผลคำสั่งซื้อ เว็บเซอร์วิสของคุณจะได้รับ SubmitOrderRequestMessage ในรูปแบบ JSON เป็นคําขอ POST จาก Google คำขอนี้มีคำสั่งซื้อของลูกค้า รวมถึงภาษี ค่าธรรมเนียม และข้อมูลการชำระเงิน เมื่อได้รับคำขอส่งคำสั่งซื้อ เว็บเซอร์วิสของคุณต้องทำดังนี้

  • ตรวจสอบสิทธิ์การทำธุรกรรม เช่น การยืนยันบัตรหรือการตรวจจับการประพฤติมิชอบ
  • สร้างคำสั่งซื้อในระบบ
  • ให้สิทธิ์วิธีการชำระเงินและเรียกใช้ Charge API ของผู้ประมวลผลการชำระเงินของคุณ (หากมี)
  • ตอบกลับพร้อมสถานะคำสั่งซื้อที่เหมาะสม ซึ่งได้แก่ CREATED, CONFIRMED หรือ REJECTED

หลังจากประมวลผลคำสั่งซื้อแล้ว รหัสการจำหน่ายของคุณต้องส่งการตอบกลับในรูปแบบข้อความ SubmitOrderResponseMessage JSON กลับไปยัง Google

ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อกำหนดในการติดตั้งใช้งานเว็บเซอร์วิสการดำเนินการตามคำสั่งซื้อจากต้นทางถึงปลายทางได้ที่ภาพรวมการดำเนินการตามคำสั่งซื้อ

ข้อความคำขอสั่งซื้อ

เมื่อลูกค้าเลือกสั่งซื้อระหว่างขั้นตอนการสั่งซื้อจากต้นทางถึงปลายทาง Google จะส่งคำขอไปยังเว็บเซอร์วิสของคุณพร้อมข้อความ JSON ที่เรียกว่า SubmitOrderRequestMessage ซึ่งมีข้อมูลต่อไปนี้

  1. Intent: ช่อง inputs[0].intent ของเนื้อหาคําขอส่งคําสั่งซื้อทุกรายการมีสตริงค่า actions.intent.TRANSACTION_DECISION
  2. คำสั่งซื้อ: ฟิลด์ inputs[0].arguments[0].transactionDecisionValue ของคำขอส่งคำสั่งซื้อประกอบด้วยออบเจ็กต์ Order ที่แสดงถึงคำสั่งซื้อของลูกค้าที่จะทำการสั่งซื้อ พร้อมกับรายละเอียดการชำระเงิน
  3. Flag Sandbox: ช่อง isInSandbox ของคำขอส่งคำสั่งซื้อจะระบุว่าธุรกรรมใช้การชำระเงินใน Sandbox หรือไม่

ตัวอย่างคำขอสั่งซื้อ

ตัวอย่าง 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
}
    

ข้อความตอบกลับคำสั่งซื้อ

หลังจากได้รับคำขอแล้ว เว็บเซอร์วิสการสั่งซื้อแบบ End-to-End จะประมวลผลคำขอและส่ง SubmitOrderResponseMessage กลับพร้อมข้อมูลต่อไปนี้

  • OrderUpdate: ออบเจ็กต์ที่มีสถานะของคำสั่งซื้อและการดําเนินการหลังสั่งซื้อที่พร้อมให้ผู้ใช้ดำเนินการ เช่น การติดต่อฝ่ายสนับสนุนและการดูรายละเอียดคำสั่งซื้อ ซึ่งคุณกำหนดไว้ในช่อง finalResponse.richResponse.items[0].structuredResponse.orderUpdate ของการตอบกลับ

ช่องอัปเดตคำสั่งซื้อ

เมื่อเว็บเซอร์วิสส่ง SubmitOrderResponseMessage จะมีช่อง OrderUpdateที่มีช่องต่อไปนี้

  • actionOrderId: รหัสที่ไม่ซ้ำกันของคำสั่งซื้อ ซึ่งใช้เพื่อระบุคำสั่งซื้อในระบบของคุณโดยไม่ซ้ำกันและอ้างอิงเมื่อส่งการอัปเดตคำสั่งซื้อในภายหลัง
  • orderState: ออบเจ็กต์ OrderState ที่แสดงสถานะของคำสั่งซื้อ
  • orderManagementActions: การดำเนินการหลังสั่งซื้อที่ผู้ใช้ทำได้ เช่น การติดต่อฝ่ายสนับสนุนลูกค้าและดูรายละเอียดคำสั่งซื้อ
  • totalPrice: ราคารวมของคำสั่งซื้อ ขั้นตอนนี้ไม่บังคับ ส่งก็ต่อเมื่อราคารวมของคำสั่งซื้อมีการเปลี่ยนแปลงหลังจากส่งคำสั่งซื้อแล้ว

คำสั่งซื้ออาจมีสถานะอย่างใดอย่างหนึ่งต่อไปนี้

  • CREATED: ปลายทางการดำเนินการตามคำสั่งซื้อประมวลผลคำสั่งซื้อเรียบร้อยแล้ว แต่ผู้ให้บริการยังไม่ได้ยืนยันคำสั่งซื้อ
  • CONFIRMED: ปลายทางการดำเนินการตามคำสั่งซื้อประมวลผลคำสั่งซื้อเรียบร้อยแล้ว และผู้ให้บริการได้ยืนยันคำสั่งซื้อแล้ว
  • REJECTED: เกิดปัญหาขึ้นและปลายทางการดำเนินการตามคำสั่งซื้อของคุณไม่สามารถสร้างหรือยืนยันคำสั่งซื้อได้ ซึ่งอาจรวมถึงปัญหาเกี่ยวกับการชำระเงิน

หากคุณตั้งค่าคำสั่งซื้อเป็นสถานะ REJECTED ให้ระบุเหตุผลในช่อง rejectionInfo ของ OrderUpdate ใช้ค่า FoodOrderUpdateExtension.FoodOrderErrors ร่วมกับ rejectionInfo ประเภท UNKNOWN และระบุคำอธิบาย

ตัวอย่างคำตอบคำสั่งซื้อ

ตัวอย่าง 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"
              }
            }
          }
        }
      ]
    }
  }
}

คำขอไม่สำเร็จ

หากส่งคำขอไม่สำเร็จ SubmitOrderResponseMessage จะต้องตั้งค่า OrderState.state เป็น REJECTED การตอบกลับต้องระบุ RejectionInfo ด้วย ซึ่งประกอบด้วยออบเจ็กต์ RejectionType เพื่ออธิบายประเภทข้อผิดพลาด

ตัวอย่างการตอบกลับที่ไม่สําเร็จ

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

ส่งการใช้งานคําสั่งซื้อ

คุณควรทำตามขั้นตอนต่อไปนี้เมื่อติดตั้งใช้งาน Submit Order API

การตรวจสอบความถูกต้อง

  1. ตรวจสอบบริการ รถเข็น และโปรโมชันตามที่ระบุไว้ในตั้งค่าการชำระเงิน
  2. แสดงผล RejectionInfo ที่มีประเภทใดประเภทหนึ่งต่อไปนี้ หากจำเป็น
RejectionInfoType กรณีการใช้งาน
UNAVAILABLE_SLOT เวลานำส่งใช้ไม่ได้อีกต่อไป
PROMO_USER_INELIGIBLE ใช้อีเมลในออบเจ็กต์ Contact ในคำขอเพื่อตรวจสอบสิทธิ์รับโปรโมชันของผู้ใช้ ดูตัวอย่างในการใช้การส่งคำสั่งซื้อพร้อมโปรโมชัน
INELIGIBLE
  • ข้อมูลผู้ใช้ เช่น หมายเลขโทรศัพท์หรืออีเมล ไม่ถูกต้อง
  • เครื่องมือวิเคราะห์ความเสี่ยงตรวจพบการประพฤติมิชอบ
PAYMENT_DECLINED ระบบประมวลผลการชำระเงินไม่ได้ เช่น ปัญหานี้อาจเกิดจากจำนวนเงินไม่เพียงพอ
UNKNOWN สำหรับข้อผิดพลาดอื่นๆ ในการตรวจสอบ

ตั้งค่า OrderState.state เป็น REJECTED หากพบข้อผิดพลาดในการตรวจสอบ คุณระบุเหตุผลที่เฉพาะเจาะจงในการปฏิเสธได้หากต้องการโดยใช้ FoodOrderUpdateExtensionfoodOrderErrors ดูตัวอย่างในหัวข้อส่งการตรวจสอบคำสั่งซื้อ

ประมวลผลการชำระเงิน

  1. คํานวณ totalPrice โดยการบวกราคารถเข็น ค่าธรรมเนียม ส่วนลด ภาษี และค่าบริการ totalPrice ควรเหมือนกับ totalPrice ที่แสดงใน CheckoutResponseMessage พร้อมทั้งการเปลี่ยนแปลงของจำนวนเงินทิปหากผู้ใช้แก้ไขทิปได้ ดูรายละเอียดเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงราคาระหว่างส่งคำสั่งซื้อ
  2. ดำเนินการกับคำสั่งซื้อและการชำระเงินหากคุณตอบกลับพร้อมสถานะคำสั่งซื้อเป็นCREATEDหรือCONFIRMED
  3. ตรวจสอบว่าระบบแสดงผลรูปแบบการตอบกลับที่ถูกต้องโดยใช้ประเภทที่สร้างขึ้นจากสคีมาตามที่อธิบายไว้ในสร้างไลบรารีไคลเอ็นต์
  4. ใช้ GoogleProvidedPaymentInstrumentinstrumentToken เพื่อประมวลผลการชำระเงิน แสดงผล RejectionInfo ที่มีประเภท PAYMENT_DECLINED หากประมวลผลการชำระเงินไม่ได้ ดูรายละเอียดเพิ่มเติมที่ประมวลผลการชำระเงิน
  5. แจ้งผู้ใช้ทันทีหลังจากประมวลผลคำสั่งซื้อแล้วทางอีเมลและ/หรือ SMS

ส่งคำตอบ

  1. ตั้งค่า OrderState.state เป็น CREATED หรือ CONFIRMED หากไม่มีข้อผิดพลาด
  2. ตั้งค่า OrderState.state เป็น REJECTED หากพบข้อผิดพลาด และระบุออบเจ็กต์ RejectionInfo ที่มี RejectionInfoType ที่เกี่ยวข้อง
  3. ตั้งค่า OrderUpdateorderManagementActions