चेकआउट सेट अप करें

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

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

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

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

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

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

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

ग्राहक के कार्ट की पुष्टि करने के लिए, जब कोई ग्राहक पैसे चुकाने का विकल्प चुनता है, तो 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. अनुरोध में FulfillmentOptionInfo प्रॉपर्टी पढ़ें और यह देखें कि ऑर्डर पूरा करने का टाइप delivery के लिए है या pickup के लिए.
  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 REGULAR के साथ, LineItem की पुष्टि की गई सूची दिखाएं. कार्ट के सभी लाइन आइटम की कीमतों का कुल योग, कार्ट की कीमत या 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. डीलdiscount या डील के आधार पर डील की कीमत का हिसाब लगाएंdiscountPercentage.

  4. डीलdealType के आधार पर, कार्ट की कुल कीमत या कुल शुल्क का इस्तेमाल करके डील की कीमत की रकम लागू करें.

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

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

जवाब दें

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