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

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

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

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

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

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

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

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

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

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

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

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

ต่อไปนี้เป็นตัวอย่าง 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
}
    

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

หลังจากได้รับคำขอ บริการเว็บที่ให้บริการสั่งซื้อจากต้นทางถึงปลายทางจะดำเนินการตามคำขอและส่ง 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"
                    }
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}
    

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

คุณควรทําตามขั้นตอนต่อไปนี้เมื่อใช้ Send order API

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

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

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

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

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

ตอบกลับ

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