चेकआउट सेट अप करना

जब कोई उपयोगकर्ता कार्ट बनाता है, तब चेकआउट की प्रोसेस शुरू होती है. उपयोगकर्ता के कार्ट के कॉन्टेंट और ऑर्डर की जानकारी, ऑर्डर करने की आपकी एंड-टू-एंड वेब सेवा पर भेजी जाती है. आपकी वेब सेवा इस जानकारी की पुष्टि करती है. इसके बाद, आपके पास खरीदारी जारी रखने या ज़रूरत के हिसाब से खरीदार के कार्ट में बदलाव करने का विकल्प होता है.

आपकी वेब सेवा के चेकआउट हैंडलर को POST अनुरोधों का जवाब देना होगा. जब कोई ग्राहक चेक आउट करने का विकल्प चुनता है, तो Google, ऑर्डर करने की पूरी प्रोसेस की सुविधा देने वाली वेब सेवा को CheckoutRequestMessage के तौर पर JSON अनुरोध बॉडी भेजता है. इसमें ग्राहक के Cart की जानकारी होती है. इसके बाद, आपकी वेब सेवा CheckoutResponseMessage के साथ जवाब देती है. इस डायग्राम में इस प्रोसेस के बारे में बताया गया है.

CheckoutResponseMessage, खरीदार का बिना बदलाव वाला कार्ट या कोई गड़बड़ी दिखाता है.

चेकआउट का अनुरोध मिलने पर, आपकी ऑर्डरिंग एंड-टू-एंड वेब सेवा को ये काम करने होंगे:

  • सामान की मौजूदा कीमतों, उपलब्धता, और सेवा देने वाली कंपनी के आधार पर, कार्ट की समयसीमा देखें.
  • कुल कीमत का हिसाब लगाएं. इसमें छूट, टैक्स, और डिलीवरी के लिए खरीदार से लिए जाने वाले शुल्क भी शामिल हैं.
  • अगर अनुरोध पूरा हो जाता है, तो बिना बदलाव किए गए कार्ट के साथ जवाब दें.
  • अगर ऐसा नहीं होता है, तो गड़बड़ी का मैसेज और सुझाया गया नया क्रम भेजें.

चेकआउट की सुविधा लागू करने से पहले, हमारा सुझाव है कि आप ऑर्डर डिलीवरी की खास जानकारी वाला दस्तावेज़ देखें.

चेकआउट का अनुरोध करने वाला मैसेज

जब कोई खरीदार चेक आउट करने का विकल्प चुनता है, तो खरीदार के कार्ट की पुष्टि करने के लिए, Google आपकी वेब सेवा को CheckoutRequestMessage के तौर पर JSON बॉडी के साथ अनुरोध भेजता है. सीधे खाना ऑर्डर करने की सुविधा के पूरे प्रोसेस के दौरान, ग्राहक का ऑर्डर तब तक सबमिट नहीं किया जाता, जब तक कि वह प्रोसेस पूरी नहीं हो जाती.

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 के बजाय, सही किए गए ProposedOrder के साथ FoodErrorExtension शामिल किया जाना चाहिए.
    • otherItems: सेवा देने वाली कंपनी के जोड़े गए आइटम, जैसे कि डिलीवरी शुल्क, टैक्स, और अन्य शुल्क. इसमें उपयोगकर्ता की ओर से जोड़ी गई टिप भी शामिल हो सकती है.
    • totalPrice: ऑर्डर की कुल कीमत.
    • extension: एक FoodOrderExtension, जो ऑर्डर के लिए डिलीवरी की जानकारी देता है. जैसे, डिलीवरी का समय.
  • PaymentOptions

    • पेमेंट प्रोसेसिंग को सेट अप करने के बारे में, Google Pay सेट अप करना में बताया गया है. जब तक पेमेंट प्रोसेसिंग लागू करने के लिए तैयार न हों, तब तक CheckoutResponseMessage में प्लेसहोल्डर JSON का इस्तेमाल किया जा सकता है.
    • अपने 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. यह पता लगाने के लिए कि वाहन बेचने का तरीका delivery या pickup के लिए है, अनुरोध में FulfillmentOptionInfo प्रॉपर्टी पढ़ें.
  2. ज़रूरत पड़ने पर, गड़बड़ी के इन टाइप को दिखाएं:

    गड़बड़ी का टाइप इस्तेमाल का उदाहरण
    INVALID ऑर्डर पूरा करने का तरीका अमान्य है.
    NOT_FOUND ऑर्डर पूरा करने का तरीका नहीं मिला.
    बंद है
    • ऑर्डर के लिए, OperationHours विंडो नहीं हैं.
    • ऑर्डर, जल्द से जल्द डिलीवरी करने के लिए किया गया है और फ़िलहाल, जल्द से जल्द डिलीवरी करने के लिए ServiceHours उपलब्ध नहीं है.
    • आपातकालीन स्थिति की वजह से कारोबार बंद है या सेवा isDisabled की स्थिति 'सही' है.
    ध्यान दें कि खास विंडो, सामान्य विंडो से ज़्यादा अहम होती हैं. ऑर्डर करने की विंडो की पुष्टि और सेवा देने वाली इकाइयों को कुछ समय के लिए हटाने के उदाहरण देखें.
    UNAVAILABLE_SLOT ऑर्डर करने के लिए तय किया गया समय पूरा नहीं किया जा सका.
    NO_CAPACITY रेस्टोरेंट में बहुत सारे लोग हैं और फ़िलहाल वह ऑर्डर नहीं ले रहा है.
    OUT_OF_SERVICE_AREA ऑर्डर को उपयोगकर्ता के पते पर डिलीवर नहीं किया जा सकता. उदाहरण के लिए, डिलीवरी के पते की पुष्टि करना देखें.
    NO_COURIER_AVAILABLE डिलीवरी करने वाले लोगों की संख्या कम होने की वजह से, ऑर्डर डिलीवर नहीं किया जा सकता.

कार्ट की पुष्टि करना और उसकी कीमत तय करना

  1. हर कार्ट को देखें.lineItems साथ ही, अपने सिस्टम या व्यापारी/कंपनी के सिस्टम में मौजूद मौजूदा डेटा की पुष्टि करें. फ़ीड इकाई की MenuItemOffer.sku वैल्यू को LineItem.offerId के तौर पर शामिल किया गया है. अगर ज़रूरी हो, तो हर लाइन आइटम के लिए एक FoodOrderError बनाएं. हर आइटम के लिए ज़्यादा से ज़्यादा एक गड़बड़ी बनाएं. ज़रूरत पड़ने पर, गड़बड़ी के इन टाइप दिखाएं:

    गड़बड़ी का टाइप इस्तेमाल का उदाहरण वापस पाया जा सकता है
    INVALID आइटम का डेटा या विकल्पों का कोई भी डेटा अमान्य है. नहीं
    NOT_FOUND आइटम या कोई भी विकल्प नहीं मिला. नहीं
    PRICE_CHANGED किसी सामान या ऐड-ऑन के कॉम्बिनेशन की कीमत बदल गई है. इस गड़बड़ी को ठीक किया जा सकता है. हां
    AVAILABILITY_CHANGED लाइन आइटम या किसी भी विकल्प के लिए अनुरोध की गई रकम उपलब्ध नहीं है. हां
    REQUIREMENTS_NOT_MET ऑर्डर की कम से कम या ज़्यादा से ज़्यादा संख्या की शर्त पूरी नहीं हुई. यह पता लगाने के लिए कि खरीदार को शुल्क देना होगा या नहीं, यह देखें कि कार्ट में मौजूद आइटम की कीमत, शुल्कeligibleTransactionVolumeMin से कम है या शुल्कeligibleTransactionVolumeMax से ज़्यादा. ऑर्डर की कम से कम वैल्यू की पुष्टि में दिया गया उदाहरण देखें. नहीं
  2. LineItemType के साथ, पुष्टि किए गए lineItems की सूची दिखाता हैREGULAR. कार्ट में मौजूद सभी लाइन आइटम की कीमतों का कुल जोड़, कार्ट की कीमत या SUBTOTAL होता है.

कार्ट में मौजूद आइटम की पुष्टि में उदाहरण देखें.

सेवा शुल्क का हिसाब लगाना

  1. eligibleRegion, validFrom, validThrough, और priority के आधार पर, सेवा के लिए सही शुल्क इकाई ढूंढें.
  2. शुल्क की रकम का हिसाब लगाने के लिए, यह देखें कि इकाई को price, percentageOfCart या pricePerMeter प्रॉपर्टी के साथ तय किया गया था या नहीं.
  3. डिलीवरी या टेकआउट सेवा शुल्क को LineItem के तौर पर दिखाएं. इसके लिए, LineItemType के तौर पर DELIVERY या FEE का इस्तेमाल करें. शुल्क को कार्टotherItems की सूची में जोड़ें.

प्रमोशन लागू करना

  1. प्रमोशन.coupon वैल्यू को डील.dealCode से मैच करके, डील इकाई ढूंढें.
  2. ऑफ़र की पुष्टि करें और अगर ज़रूरी हो, तो FoodOrderError दिखाएं. इन गड़बड़ियों को ठीक किया जा सकता है. ज़रूरत पड़ने पर, गड़बड़ी के इन टाइप को दिखाएं:

    गड़बड़ी का टाइप इस्तेमाल का उदाहरण
    PROMO_NOT_RECOGNIZED कूपन कोड की पहचान नहीं की जा सकी.
    PROMO_EXPIRED ऑफ़र की समयसीमा खत्म हो गई है.
    PROMO_ORDER_INELIGIBLE ऑर्डर पर कूपन लागू नहीं हो सकता.
    PROMO_NOT_APPLICABLE कोई और वजह.
  3. Deal.discount या Deal.discountPercentage के आधार पर, डील की कीमत का हिसाब लगाएं.

  4. ऑफ़र के हिसाब से, कार्ट में मौजूद प्रॉडक्ट की कुल कीमत या शुल्क की कुल रकम का इस्तेमाल करके, ऑफ़र की कीमत लागू करें.dealType.

  5. लागू किए गए प्रमोशन के साथ कार्ट.promotions दिखाएं.

  6. प्रमोशन को LineItem के तौर पर दिखाएं. इसके लिए, LineItemType DISCOUNT का इस्तेमाल करें. छूट को कार्ट.otherItems की सूची में, नेगेटिव कीमत के साथ जोड़ें.

जवाब दिखाना

  1. ProposedOrder बनाएं.cart, अगर पुष्टि के दौरान कोई गड़बड़ी नहीं होती है, तो रिस्पॉन्स कार्ट, अनुरोध वाले कार्ट जैसा ही होता है.
  2. ProposedOrder.otherItems सूची दिखाएं. इसमें टैक्स, शुल्क, उपहार में दी जाने वाली रकम, और छूट (अगर लागू हो) शामिल है. बोनस आइटम को कॉन्फ़िगर करने के तरीके के बारे में ज़्यादा जानने के लिए, बोनस देखें.
  3. कार्ट की कीमत, शुल्क, छूट, टैक्स, और उपहार में दी जाने वाली रकम जोड़कर, ProposedOrdertotalPrice शामिल करें.
  4. FulfillmentOption के साथ, FoodOrderExtension.availableFulfillmentOptions दिखाएं. पिकअप या डिलीवरी के अनुमानित समय को अपडेट करें.
  5. अगर पुष्टि करने से जुड़ी पिछली जांचों से, FoodOrderErrors जनरेट हुए हैं, तो:
    • StructuredResponse.error और FoodErrorExtension.foodOrderErrors में गड़बड़ियों की सूची शामिल करें.
    • अगर सभी गड़बड़ियां ठीक की जा सकती हैं, तो correctedProposedOrder फ़ील्ड में ProposedOrder दिखाएं.
    • अगर सभी गड़बड़ियों को ठीक किया जा सकता है, तो paymentOptions फ़ील्ड में PaymentOptions दिखाएं.
    • अगर पेमेंट के अन्य विकल्प उपलब्ध हैं और सभी गड़बड़ियों को ठीक किया जा सकता है, तो additionalPaymentOptions को शामिल करें.
  6. अगर पुष्टि करने में कोई गड़बड़ी नहीं होती है, तो CheckoutResponse ऑब्जेक्ट में proposedOrder, paymentOptions दिखाएं. अगर पेमेंट के अन्य विकल्प उपलब्ध हैं, तो additionalPaymentOptions को शामिल करें.