ตั้งค่า Checkout

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

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

CheckoutResponseMessage จะแสดงรถเข็นที่ไม่มีการแก้ไขของลูกค้าหรือ

เมื่อได้รับคำขอการชำระเงิน บริการสั่งซื้อบนเว็บแบบครบวงจรจะต้องดำเนินการ ดังต่อไปนี้

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

ก่อนที่จะเริ่มใช้การชำระเงิน เราขอแนะนำให้อ่านการดำเนินการตามคำสั่งซื้อ ภาพรวม เอกสารประกอบ

ข้อความคำขอชำระเงิน

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

ข้อมูลที่มีอยู่ใน CheckoutRequestMessage ได้แก่

  • ความตั้งใจ: inputs[0].intent ของทุกส่วนเนื้อหาของคำขอการชำระเงินจะมี ค่าสตริง actions.foodordering.intent.CHECKOUT
  • รถเข็น: ช่อง inputs[0].arguments[0].extension ของคำขอชำระเงิน มีออบเจ็กต์ Cart ที่แสดงรถเข็นของลูกค้า
  • การนำส่งหรือการถ่ายโอน: ช่องส่วนขยายของออบเจ็กต์ Cart มี FoodCartExtension ที่ระบุพร็อพเพอร์ตี้สำหรับการแสดงโฆษณาหรือ การถ่ายโอน:
    • สำหรับคำสั่งซื้อแบบจัดส่ง ออบเจ็กต์ FoodCartExtension จะรวม ที่อยู่สำหรับจัดส่ง
    • สำหรับคำสั่งซื้อแบบไปรับเองหรือสั่งกลับบ้าน ออบเจ็กต์ FoodCartExtension จะไม่แสดง มีข้อมูลตำแหน่งใดๆ ก็ตาม
  • แซนด์บ็อกซ์: ช่อง isInSandbox ของคำขอชำระเงินมีบูลีน ซึ่งระบุว่าธุรกรรมนั้นใช้การชำระเงินของแซนด์บ็อกซ์หรือไม่

ตัวอย่างคำขอชำระเงิน

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

ข้อความตอบกลับการชำระเงิน

หลังจากได้รับคำขอจากบริการสั่งซื้อแบบครบวงจรแล้ว เว็บการชำระเงินของคุณ บริการจะต้องประมวลผลและตอบกลับด้วย CheckoutResponseMessage CheckoutResponseMessage ต้องครอบคลุมทั้งที่สำเร็จหรือไม่สำเร็จ อีกครั้ง

คำขอที่สำเร็จ

หากคำขอการชำระเงินดำเนินการสำเร็จ CheckoutResponseMessage จะต้องใส่ข้อมูลต่อไปนี้ ProposedOrder และ PaymentOptions:

  • ProposedOrder

    • cart: ออบเจ็กต์ cart ที่เหมือนกับรถเข็นที่ระบุไว้ใน CheckoutRequestMessage หากสินค้าในรถเข็นต้องมีลักษณะดังนี้ CheckoutResponseMessage ควรมี FoodErrorExtensionด้วย ProposedOrder ที่แก้ไขแล้ว
    • otherItems: สินค้าที่ผู้ให้บริการเพิ่ม เช่น ค่าจัดส่ง ภาษีและค่าธรรมเนียมอื่นๆ อาจมีค่าตอบแทนที่ผู้ใช้เพิ่มให้ด้วย
    • totalPrice: ราคารวมของคำสั่งซื้อ
    • extension: FoodOrderExtension ที่กำหนดข้อมูลการจำหน่าย สำหรับคำสั่งซื้อ เช่น เวลานำส่ง
  • PaymentOptions

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

ตัวอย่างคำตอบที่สำเร็จ

{
    "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": []
                                        }
                                    }
                                }
                            ]
                        }
                    }
                }
            ]
        }
    }
}

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

หากคำขอการชำระเงินดำเนินการไม่สำเร็จ CheckoutResponseMessage จะต้องดำเนินการต่อไปนี้ มี FoodErrorExtension ซึ่งมีรายการของ FoodOrderError รายการที่อธิบายข้อผิดพลาดใดๆ ที่เกิดขึ้น หากมีสิ่งที่กู้คืนได้ ข้อผิดพลาดในคำสั่งซื้อ เช่น การเปลี่ยนแปลงราคาสินค้าในรถเข็น FoodErrorExtension ต้องมี correctedProposedOrder

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

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "error": {
              "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension",
              "foodOrderErrors": [
                {
                  "error": "CLOSED",
                  "description": "The restaurant is closed."
                }
              ]
            }
          }
        }
      ]
    }
  }
}

การใช้งานการชำระเงิน

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

ตรวจสอบบริการ

แสดงผล FoodOrderError สำหรับเงื่อนไขข้อผิดพลาดของบริการครั้งแรก พบ ข้อผิดพลาดเหล่านี้ไม่สามารถกู้คืนได้ ดังนั้นข้อผิดพลาดแรกที่พบควรเป็น ส่งคืนแล้ว ดูการจัดการข้อผิดพลาดสำหรับคำอธิบายเกี่ยวกับ ที่กู้คืนได้

  1. อ่านพร็อพเพอร์ตี้ FulfillmentOptionInfo ใน คำขอเพื่อระบุว่าประเภทการดำเนินการมีไว้สำหรับ delivery หรือ pickup
  2. แสดงผลประเภทข้อผิดพลาดต่อไปนี้หากจำเป็น

    ประเภทข้อผิดพลาด กรณีการใช้งาน
    ไม่ถูกต้อง ประเภทการจำหน่ายไม่ถูกต้อง
    NOT_FOUND ไม่พบประเภทการดำเนินการตามคำสั่งซื้อ
    ปิดแล้ว
    • ไม่มีกรอบเวลา OperationHours สำหรับคำสั่งซื้อนี้
    • คำสั่งซื้อดังกล่าวเป็นคำสั่งซื้อแบบโดยเร็วที่สุดและไม่มี ASAP ServiceHours ที่พร้อมใช้งานในขณะนี้
    • มีการปิดฉุกเฉินหรือบริการ isDisabled เป็นจริง
    โปรดทราบว่าหน้าต่างพิเศษจะมีความสำคัญเหนือกรอบเวลาปกติ ดูตัวอย่างในการตรวจสอบกรอบเวลาการสั่งซื้อและนำเอนทิตีบริการออกชั่วคราว
    UNAVAILABLE_SLOT ดำเนินการตามคำสั่งซื้อล่วงหน้าไม่ได้
    NO_CAPACITY ร้านอาหารไม่ว่างในขณะนี้และไม่มีการรับคำสั่งซื้อ
    OUT_OF_SERVICE_AREA นำส่งคำสั่งซื้อไปยังที่อยู่ของผู้ใช้ไม่ได้ ดูตัวอย่างการตรวจสอบที่อยู่สำหรับจัดส่ง
    NO_COURIER_AVAILABLE ไม่สามารถนำส่งคำสั่งซื้อได้เนื่องจากเจ้าหน้าที่จัดส่งมีจำนวนจำกัด

ตรวจสอบความถูกต้องและกำหนดราคารถเข็น

  1. ค้นหารถเข็นช็อปปิ้งแต่ละรายการlineItems และตรวจสอบด้วยข้อมูลปัจจุบันใน หรือในระบบของผู้ขาย รวมค่า MenuItemOffer.sku จากเอนทิตีฟีดแล้ว เป็นLineItemofferId สร้าง FoodOrderError สำหรับสินค้าแต่ละรายการหากจำเป็น สร้าง ข้อผิดพลาดสูงสุด 1 รายการสำหรับแต่ละรายการ แสดงผลประเภทข้อผิดพลาดต่อไปนี้หาก ต้องการ:

    ประเภทข้อผิดพลาด กรณีการใช้งาน กู้คืนได้
    ไม่ถูกต้อง ข้อมูลสินค้าหรือข้อมูลตัวเลือกไม่ถูกต้อง ไม่ได้
    NOT_FOUND ไม่พบรายการหรือตัวเลือกใดๆ ไม่ได้
    PRICE_CHANGED ราคาไอเทมหรือส่วนเสริมผสมกันมีการเปลี่ยนแปลง ข้อผิดพลาดนี้ถือว่ากู้คืนได้ ใช่
    AVAILABILITY_CHANGED จำนวนเงินที่ขอสำหรับรายการโฆษณาหรือตัวเลือกใดๆ ไม่พร้อมใช้งาน ใช่
    REQUIREMENTS_NOT_MET ไม่ถึงจำนวนคำสั่งซื้อขั้นต่ำหรือสูงสุด ซึ่งดูได้จากการตรวจสอบว่าราคาในรถเข็นต่ำกว่าค่าธรรมเนียมeligibleTransactionVolumeMinหรือสูงกว่าค่าธรรมเนียมeligibleTransactionVolumeMaxหรือไม่ ดูตัวอย่างในการตรวจสอบมูลค่าการสั่งซื้อขั้นต่ำ ไม่ได้
  2. แสดงรายการรายการโฆษณาที่ตรวจสอบแล้วที่มี LineItemType REGULAR ผลรวมของราคาสินค้าในรายการสั่งซื้อทั้งหมดคือราคาสินค้าในรถเข็นหรือ SUBTOTAL

ดูตัวอย่างในการตรวจสอบสินค้าในรถเข็น

คำนวณค่าบริการ

  1. ค้นหารายการค่าธรรมเนียมที่ถูกต้องสำหรับบริการ โดยอิงตาม eligibleRegion, validFrom, validThrough และ priority
  2. คำนวณจำนวนเงินค่าธรรมเนียมตามที่ระบุว่านิติบุคคลกำหนดด้วย price หรือไม่ พร็อพเพอร์ตี้ percentageOfCart หรือ pricePerMeter
  3. ส่งคืนค่าบริการจัดส่งหรือสั่งกลับบ้านเป็น LineItem ด้วย LineItemType DELIVERY หรือ FEE ตามลำดับ เพิ่มค่าธรรมเนียม ไว้ในรายการ Cart.otherItems

ใช้โปรโมชัน

  1. ค้นหาเอนทิตีดีลตามการจับคู่ ค่าโปรโมชัน coupon จากดีลdealCode
  2. ตรวจสอบดีลและแสดงผล FoodOrderError หากจำเป็น โดยข้อผิดพลาดเหล่านี้จะถือว่ากู้คืนได้ แสดงผลประเภทข้อผิดพลาดต่อไปนี้ หากจำเป็น

    ประเภทข้อผิดพลาด กรณีการใช้งาน
    PROMO_NOT_RECOGNIZED ไม่รู้จักรหัสคูปอง
    PROMO_EXPIRED ข้อตกลงหมดอายุ
    PROMO_ORDER_INELIGIBLE คำสั่งซื้อนี้ไม่มีสิทธิ์ใช้คูปอง
    PROMO_NOT_APPLICABLE เหตุผลอื่นๆ
  3. คำนวณจำนวนเงินของราคาดีลตามดีลdiscount หรือ ดีลdiscountPercentage

  4. ใช้จำนวนเงินราคาดีลโดยใช้ยอดรวมของรถเข็นหรือยอดรวมค่าธรรมเนียมโดยขึ้นอยู่กับ ดีลdealType

  5. ส่งคืนรถเข็น promotions ที่มีโปรโมชันที่ใช้

  6. แสดงโปรโมชันเป็นLineItemที่มี LineItemType DISCOUNT เพิ่มส่วนลดไปยัง รายการ Cart.otherItems ที่มีราคาเป็นลบ

ส่งคืนคำตอบ

  1. สร้าง ProposedOrder.cart รถเข็นการตอบกลับคือ เหมือนกับรถเข็นหากไม่พบข้อผิดพลาดระหว่างการตรวจสอบ
  2. แสดงรายการ ProposedOrder.otherItems ซึ่งประกอบด้วย ภาษี ค่าธรรมเนียม ทิปส์ และส่วนลด หากมี ดูค่าตอบแทนสำหรับ รายละเอียดเพิ่มเติมเกี่ยวกับวิธีกำหนดค่ารายการให้ทิป
  3. ระบุ ProposedOrder.totalPrice ด้วยการเพิ่มรถเข็น ราคา ค่าธรรมเนียม ส่วนลด ภาษี และค่าตอบแทนพิเศษ
  4. ส่งคืน FoodOrderExtension.availableFulfillmentOptions พร้อม FulfillmentOption ที่เกี่ยวข้อง อัปเดตค่าประมาณ เวลารับสินค้าหรือการนำส่งเป็นเวลาที่คาดไว้
  5. หากมี FoodOrderErrors จากการตรวจสอบความถูกต้องก่อนหน้านี้ ให้ดำเนินการดังนี้
    • รวม StructuredResponse.error และรายการ ใน FoodErrorExtensionfoodOrderErrors
    • แสดงผล ProposedOrder ใน correctedProposedOrder หากข้อผิดพลาดทั้งหมดกู้คืนได้
    • แสดง PaymentOptions ใน paymentOptions หากข้อผิดพลาดทั้งหมดสามารถกู้คืนได้
    • (ไม่บังคับ) ใส่ additionalPaymentOptions หากมี ตัวเลือกการชำระเงินที่ใช้ได้ และข้อผิดพลาดทั้งหมดสามารถเรียกคืนได้
  6. หากไม่มีข้อผิดพลาดในการตรวจสอบ ให้แสดง proposedOrder paymentOptions ในออบเจ็กต์ CheckoutResponse (ไม่บังคับ) ใส่ additionalPaymentOptions หากมี ตัวเลือกการชำระเงินที่มีให้บริการ