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

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

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

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

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

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

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

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

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

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

  1. ความตั้งใจ: ช่อง 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"
                    }
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}
    

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

ควรทําตามขั้นตอนต่อไปนี้เมื่อใช้ API คำสั่งซื้อในการส่ง

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

  1. ดำเนินการตรวจสอบบริการ รถเข็น และโปรโมชันตามที่ทำในตั้งค่า ชำระเงิน
  2. แสดงผล RejectionInfo ด้วย 1 ในประเภทต่อไปนี้ หาก ต้องการ:
RejectionInfoType กรณีการใช้งาน
UNAVAILABLE_SLOT เวลาดำเนินการตามคำสั่งซื้อใช้ไม่ได้อีกต่อไป
PROMO_USER_INELIGIBLE ใช้อีเมลในออบเจ็กต์ข้อมูลติดต่อในคำขอเพื่อตรวจสอบการมีสิทธิ์ของโปรโมชันสำหรับผู้ใช้ ดูตัวอย่างในส่วนใช้คําสั่ง "ส่ง" กับโปรโมชัน
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