Google Play Billing Library को अपने ऐप्लिकेशन के साथ इंटिग्रेट करें

इस विषय में, प्रॉडक्ट बेचने के लिए, Google Play Billing Library को अपने ऐप्लिकेशन में इंटिग्रेट करने का तरीका बताया गया है.

खरीदारी की लाइफ़

यहां एक बार की जाने वाली खरीदारी या सदस्यता के लिए, सामान्य परचेज़ फ़्लो दिया गया है.

  1. उपयोगकर्ता को दिखाएं कि वह क्या खरीद सकता है.
  2. खरीदारी स्वीकार करने के लिए, उपयोगकर्ता के लिए परचेज़ फ़्लो लॉन्च करें.
  3. अपने सर्वर पर खरीदारी की पुष्टि करें.
  4. उपयोगकर्ता को कॉन्टेंट दें.
  5. कॉन्टेंट की डिलीवरी की पुष्टि करें. इस्तेमाल किए जा सकने वाले प्रॉडक्ट के लिए, खरीदारी को इस्तेमाल करें, ताकि उपयोगकर्ता आइटम को फिर से खरीद सके.

सदस्यताएं तब तक अपने-आप रिन्यू होती रहेंगी, जब तक कि उन्हें रद्द नहीं कर दिया जाता. सदस्यता की ये स्थितियां हो सकती हैं:

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

Google Play से कनेक्शन शुरू करना

Google Play के बिलिंग सिस्टम को अपने ऐप्लिकेशन से इंटिग्रेट करने के लिए, सबसे पहले अपने ऐप्लिकेशन में Google Play Billing लाइब्रेरी जोड़ें और कनेक्शन शुरू करें.

Google Play Billing Library डिपेंडेंसी जोड़ना

अपने ऐप्लिकेशन की build.gradle फ़ाइल में, Google Play Billing Library की डिपेंडेंसी को इस तरह जोड़ें:

ग्रूवी

dependencies {
    def billing_version = "7.0.0"

    implementation "com.android.billingclient:billing:$billing_version"
}

Kotlin

dependencies {
    val billing_version = "7.0.0"

    implementation("com.android.billingclient:billing:$billing_version")
}

अगर Kotlin का इस्तेमाल किया जा रहा है, तो Google Play Billing Library के KTX मॉड्यूल में, Kotlin एक्सटेंशन और कोरुटाइन की सुविधा शामिल होती है. इससे, Google Play Billing Library का इस्तेमाल करते समय, आसानी से Kotlin कोड लिखा जा सकता है. अपने प्रोजेक्ट में इन एक्सटेंशन को शामिल करने के लिए, अपने ऐप्लिकेशन की build.gradle फ़ाइल में यह डिपेंडेंसी जोड़ें, जैसा कि यहां दिखाया गया है:

ग्रूवी

dependencies {
    def billing_version = "7.0.0"

    implementation "com.android.billingclient:billing-ktx:$billing_version"
}

Kotlin

dependencies {
    val billing_version = "7.0.0"

    implementation("com.android.billingclient:billing-ktx:$billing_version")
}

BillingClient को शुरू करना

Google Play Billing Library पर डिपेंडेंसी जोड़ने के बाद, आपको BillingClient इंस्टेंस को शुरू करना होगा. BillingClient, Google Play Billing Library और आपके बाकी ऐप्लिकेशन के बीच कम्यूनिकेशन के लिए मुख्य इंटरफ़ेस है. BillingClient, बिलिंग से जुड़े कई सामान्य कामों के लिए, सिंक्रोनस और असिंक्रोनस, दोनों तरह के आसान तरीके उपलब्ध कराता है. इन बातों का ध्यान रखें:

  • हमारा सुझाव है कि किसी एक इवेंट के लिए एक से ज़्यादा PurchasesUpdatedListener कॉलबैक से बचने के लिए, एक बार में एक ही BillingClient कनेक्शन चालू रखें.
  • हमारा सुझाव है कि आपका ऐप्लिकेशन लॉन्च होने या फ़ोरग्राउंड में आने पर, BillingClient के लिए कनेक्शन शुरू करें. इससे यह पक्का किया जा सकेगा कि आपका ऐप्लिकेशन, खरीदारी को समय पर प्रोसेस कर सके. ऐसा करने के लिए, registerActivityLifecycleCallbacks से रजिस्टर किए गए ActivityLifecycleCallbacks का इस्तेमाल करें. साथ ही, गतिविधि फिर से शुरू होने का पता चलने पर कनेक्शन शुरू करने के लिए, onActivityResumed को सुनें. इस सबसे सही तरीके का पालन क्यों करना चाहिए, इस बारे में ज़्यादा जानकारी के लिए खरीदारी प्रोसेस करना सेक्शन देखें. साथ ही, ऐप्लिकेशन बंद होने पर कनेक्शन को बंद करना न भूलें.

BillingClient बनाने के लिए, newBuilder का इस्तेमाल करें. newBuilder() को कोई भी संदर्भ दिया जा सकता है. BillingClient, ऐप्लिकेशन का संदर्भ पाने के लिए इसका इस्तेमाल करता है. इसका मतलब है कि आपको मेमोरी लीक की चिंता करने की ज़रूरत नहीं है. खरीदारी से जुड़े अपडेट पाने के लिए, आपको setListener को भी कॉल करना होगा. इसके लिए, आपको PurchasesUpdatedListener का रेफ़रंस देना होगा. इस लिसनर को आपके ऐप्लिकेशन में की गई सभी खरीदारी के अपडेट मिलते हैं.

Kotlin

private val purchasesUpdatedListener =
   PurchasesUpdatedListener { billingResult, purchases ->
       // To be implemented in a later section.
   }

private var billingClient = BillingClient.newBuilder(context)
   .setListener(purchasesUpdatedListener)
   // Configure other settings.
   .build()

Java

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
    @Override
    public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
        // To be implemented in a later section.
    }
};

private BillingClient billingClient = BillingClient.newBuilder(context)
    .setListener(purchasesUpdatedListener)
    // Configure other settings.
    .build();

Google Play से कनेक्ट करना

BillingClient बनाने के बाद, आपको Google Play से कनेक्ट करना होगा.

Google Play से कनेक्ट करने के लिए, startConnection को कॉल करें. कनेक्शन की प्रोसेस, सिंक नहीं होती. क्लाइंट का सेटअप पूरा होने और वह आगे के अनुरोध करने के लिए तैयार होने के बाद, आपको कॉलबैक पाने के लिए BillingClientStateListener लागू करना होगा.

Google Play से कनेक्ट न होने की समस्या को हल करने के लिए, आपको फिर से कोशिश करने का लॉजिक भी लागू करना होगा. फिर से कोशिश करने का लॉजिक लागू करने के लिए, onBillingServiceDisconnected() कॉलबैक तरीके को बदलें. साथ ही, पक्का करें कि BillingClient, Google Play से फिर से कनेक्ट करने के लिए, startConnection() तरीके को कॉल करता हो. ऐसा, कोई और अनुरोध करने से पहले करना होगा.

यहां दिए गए उदाहरण में, कनेक्शन शुरू करने और यह जांचने का तरीका बताया गया है कि वह इस्तेमाल के लिए तैयार है या नहीं:

Kotlin

billingClient.startConnection(object : BillingClientStateListener {
    override fun onBillingSetupFinished(billingResult: BillingResult) {
        if (billingResult.responseCode ==  BillingResponseCode.OK) {
            // The BillingClient is ready. You can query purchases here.
        }
    }
    override fun onBillingServiceDisconnected() {
        // Try to restart the connection on the next request to
        // Google Play by calling the startConnection() method.
    }
})

Java

billingClient.startConnection(new BillingClientStateListener() {
    @Override
    public void onBillingSetupFinished(BillingResult billingResult) {
        if (billingResult.getResponseCode() ==  BillingResponseCode.OK) {
            // The BillingClient is ready. You can query purchases here.
        }
    }
    @Override
    public void onBillingServiceDisconnected() {
        // Try to restart the connection on the next request to
        // Google Play by calling the startConnection() method.
    }
});

खरीदने के लिए उपलब्ध प्रॉडक्ट दिखाना

Google Play से कनेक्ट करने के बाद, आपके पास अपने उपलब्ध प्रॉडक्ट के लिए क्वेरी करने और उन्हें अपने उपयोगकर्ताओं को दिखाने का विकल्प होता है.

अपने प्रॉडक्ट उपयोगकर्ताओं को दिखाने से पहले, प्रॉडक्ट की जानकारी के लिए क्वेरी करना एक अहम चरण है. ऐसा इसलिए, क्योंकि इससे स्थानीय भाषा में प्रॉडक्ट की जानकारी मिलती है. सदस्यताओं के लिए, पक्का करें कि आपके प्रॉडक्ट का डिसप्ले Play की सभी नीतियों का पालन करता हो.

इन-ऐप्लिकेशन प्रॉडक्ट की जानकारी के लिए क्वेरी करने के लिए, queryProductDetailsAsync को कॉल करें.

असाइनमेंट के साथ-साथ होने वाली कार्रवाई के नतीजे को मैनेज करने के लिए, आपको एक ऐसा लिसनर भी तय करना होगा जो ProductDetailsResponseListener इंटरफ़ेस को लागू करता हो. इसके बाद, onProductDetailsResponse को बदला जा सकता है. यह क्वेरी पूरी होने पर, Listener को सूचना देता है. इसका उदाहरण यहां दिया गया है:

Kotlin

val queryProductDetailsParams =
    QueryProductDetailsParams.newBuilder()
        .setProductList(
            ImmutableList.of(
                Product.newBuilder()
                    .setProductId("product_id_example")
                    .setProductType(ProductType.SUBS)
                    .build()))
        .build()

billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
    billingResult,
    productDetailsList ->
      // check billingResult
      // process returned productDetailsList
}

Java

QueryProductDetailsParams queryProductDetailsParams =
    QueryProductDetailsParams.newBuilder()
        .setProductList(
            ImmutableList.of(
                Product.newBuilder()
                    .setProductId("product_id_example")
                    .setProductType(ProductType.SUBS)
                    .build()))
        .build();

billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
        public void onProductDetailsResponse(BillingResult billingResult,
                List<ProductDetails> productDetailsList) {
            // check billingResult
            // process returned productDetailsList
        }
    }
)

प्रॉडक्ट की जानकारी के लिए क्वेरी करते समय, QueryProductDetailsParams का एक ऐसा इंस्टेंस पास करें जिसमें ProductType के साथ-साथ, Google Play Console में बनाई गई प्रॉडक्ट आईडी स्ट्रिंग की सूची दी गई हो. ProductType, एक बार खरीदे जाने वाले प्रॉडक्ट के लिए ProductType.INAPP या सदस्यताओं के लिए ProductType.SUBS हो सकता है.

Kotlin एक्सटेंशन की मदद से क्वेरी करना

अगर Kotlin एक्सटेंशन का इस्तेमाल किया जा रहा है, तो queryProductDetails() एक्सटेंशन फ़ंक्शन को कॉल करके, इन-ऐप्लिकेशन प्रॉडक्ट की जानकारी के लिए क्वेरी की जा सकती है.

queryProductDetails(), Kotlin कोरुटिन का फ़ायदा लेता है, ताकि आपको अलग से कोई लिसनर तय न करना पड़े. इसके बजाय, फ़ंक्शन तब तक सस्पेंड रहता है, जब तक क्वेरी पूरी नहीं हो जाती. इसके बाद, नतीजे को प्रोसेस किया जा सकता है:

suspend fun processPurchases() {
    val productList = listOf(
        QueryProductDetailsParams.Product.newBuilder()
            .setProductId("product_id_example")
            .setProductType(BillingClient.ProductType.SUBS)
            .build()
    )
    val params = QueryProductDetailsParams.newBuilder()
    params.setProductList(productList)

    // leverage queryProductDetails Kotlin extension function
    val productDetailsResult = withContext(Dispatchers.IO) {
        billingClient.queryProductDetails(params.build())
    }

    // Process the result.
}

कुछ डिवाइसों पर ProductDetails और queryProductDetailsAsync() का इस्तेमाल नहीं किया जा सकता. आम तौर पर, ऐसा Google Play Services के पुराने वर्शन की वजह से होता है. इस स्थिति में सही सहायता पाने के लिए, Play Billing Library 5 पर माइग्रेट करने के लिए बनी गाइड में, पुराने सिस्टम के साथ काम करने की सुविधाओं को इस्तेमाल करने का तरीका जानें.

नतीजे को प्रोसेस करना

Google Play Billing Library, क्वेरी के नतीजों को ProductDetails ऑब्जेक्ट के List में सेव करती है. इसके बाद, सूची में मौजूद हर ProductDetails ऑब्जेक्ट पर कई तरह के मेथड कॉल किए जा सकते हैं. इससे, इन-ऐप्लिकेशन प्रॉडक्ट की ज़रूरी जानकारी देखी जा सकती है. जैसे, उसकी कीमत या ब्यौरा. प्रॉडक्ट की उपलब्ध जानकारी देखने के लिए, ProductDetails क्लास में मौजूद तरीकों की सूची देखें.

किसी आइटम को बिक्री के लिए ऑफ़र करने से पहले, देख लें कि उपयोगकर्ता के पास पहले से ही उस आइटम का मालिकाना हक न हो. अगर उपयोगकर्ता के पास ऐसा आइटम है जो अब भी उसकी आइटम लाइब्रेरी में मौजूद है, तो उसे फिर से खरीदने से पहले, उस आइटम का इस्तेमाल करना होगा.

सदस्यता की पेशकश करने से पहले, पुष्टि करें कि उपयोगकर्ता ने पहले से सदस्यता न ली हो. इन बातों पर भी ध्यान दें:

  • queryProductDetailsAsync(), सदस्यता वाले प्रॉडक्ट की जानकारी दिखाता है. साथ ही, हर सदस्यता के लिए ज़्यादा से ज़्यादा 50 ऑफ़र दिखाता है.
  • queryProductDetailsAsync() सिर्फ़ ऐसे ऑफ़र दिखाता है जिनके लिए उपयोगकर्ता ज़रूरी शर्तें पूरी करता है. अगर उपयोगकर्ता किसी ऐसे ऑफ़र को खरीदने की कोशिश करता है जिसके लिए वह ज़रूरी शर्तें पूरी नहीं करता है (उदाहरण के लिए, अगर ऐप्लिकेशन में ज़रूरी शर्तें पूरी करने वाले ऑफ़र की पुरानी सूची दिख रही है), तो Play उपयोगकर्ता को बताता है कि वह ज़रूरी शर्तें पूरी नहीं करता. इसके बाद, उपयोगकर्ता बुनियादी प्लान खरीद सकता है.

परचेज़ फ़्लो लॉन्च करना

अपने ऐप्लिकेशन से खरीदारी का अनुरोध शुरू करने के लिए, अपने ऐप्लिकेशन के मुख्य थ्रेड से launchBillingFlow() विधि को कॉल करें. यह तरीका, BillingFlowParams ऑब्जेक्ट का रेफ़रंस लेता है. इसमें queryProductDetailsAsync को कॉल करने से मिला काम का ProductDetails ऑब्जेक्ट शामिल होता है. BillingFlowParams ऑब्जेक्ट बनाने के लिए, BillingFlowParams.Builder क्लास का इस्तेमाल करें.

Kotlin

// An activity reference from which the billing flow will be launched.
val activity : Activity = ...;

val productDetailsParamsList = listOf(
    BillingFlowParams.ProductDetailsParams.newBuilder()
        // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
        .setProductDetails(productDetails)
        // For One-time products, "setOfferToken" method shouldn't be called.
        // For subscriptions, to get an offer token, call ProductDetails.subscriptionOfferDetails()
        // for a list of offers that are available to the user
        .setOfferToken(selectedOfferToken)
        .build()
)

val billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .build()

// Launch the billing flow
val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)

Java

// An activity reference from which the billing flow will be launched.
Activity activity = ...;

ImmutableList<ProductDetailsParams> productDetailsParamsList =
    ImmutableList.of(
        ProductDetailsParams.newBuilder()
             // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // For one-time products, "setOfferToken" method shouldn't be called.
            // For subscriptions, to get an offer token, call
            // ProductDetails.subscriptionOfferDetails() for a list of offers
            // that are available to the user.
            .setOfferToken(selectedOfferToken)
            .build()
    );

BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .build();

// Launch the billing flow
BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

launchBillingFlow() वाला तरीका, BillingClient.BillingResponseCode में दिए गए कई रिस्पॉन्स कोड में से एक को दिखाता है. इस नतीजे की जांच करना न भूलें, ताकि यह पक्का किया जा सके कि खरीदारी के फ़्लो को लॉन्च करने में कोई गड़बड़ी नहीं हुई है. BillingResponseCode के OK होने का मतलब है कि लॉन्च पूरा हो गया है.

launchBillingFlow() को कॉल करने पर, सिस्टम Google Play की खरीदारी वाली स्क्रीन दिखाता है. पहली इमेज में, सदस्यता खरीदने की स्क्रीन दिखाई गई है:

Google Play की खरीदारी वाली स्क्रीन पर, खरीदारी के लिए उपलब्ध सदस्यता दिखती है
पहला डायग्राम. Google Play की खरीदारी वाली स्क्रीन पर, खरीदारी के लिए उपलब्ध सदस्यता दिखती है.

Google Play, PurchasesUpdatedListener इंटरफ़ेस को लागू करने वाले लिसनर को खरीदारी के ऑपरेशन का नतीजा देने के लिए, onPurchasesUpdated() को कॉल करता है. क्लाइंट को शुरू करने के बाद, setListener() तरीके का इस्तेमाल करके, लिसनर तय किया जाता है.

संभावित रिस्पॉन्स कोड को मैनेज करने के लिए, आपको onPurchasesUpdated() लागू करना होगा. यहां दिए गए उदाहरण में, onPurchasesUpdated() को बदलने का तरीका बताया गया है:

Kotlin

override fun onPurchasesUpdated(billingResult: BillingResult, purchases: List<Purchase>?) {
   if (billingResult.responseCode == BillingResponseCode.OK && purchases != null) {
       for (purchase in purchases) {
           // Process the purchase as described in the next section.
       }
   } else if (billingResult.responseCode == BillingResponseCode.USER_CANCELED) {
       // Handle an error caused by a user canceling the purchase flow.
   } else {
       // Handle any other error codes.
   }
}

Java

@Override
void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
    if (billingResult.getResponseCode() == BillingResponseCode.OK
        && purchases != null) {
        for (Purchase purchase : purchases) {
            // Process the purchase as described in the next section.
        }
    } else if (billingResult.getResponseCode() == BillingResponseCode.USER_CANCELED) {
        // Handle an error caused by a user canceling the purchase flow.
    } else {
        // Handle any other error codes.
    }
}

खरीदारी पूरी होने पर, Google Play पर खरीदारी पूरी होने की जानकारी देने वाली स्क्रीन दिखती है. यह स्क्रीन, दूसरे चित्र जैसी होती है.

Google Play पर खरीदारी पूरी होने की जानकारी देने वाली स्क्रीन
दूसरी इमेज. Google Play पर खरीदारी पूरी होने के बाद दिखने वाली स्क्रीन.

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

उपयोगकर्ता को लेन-देन की रसीद भी ईमेल की जाती है. इसमें ऑर्डर आईडी या लेन-देन का यूनीक आईडी होता है. उपयोगकर्ताओं को एक बार इस्तेमाल किए जा सकने वाले हर प्रॉडक्ट की खरीदारी के लिए, एक यूनीक ऑर्डर आईडी वाला ईमेल मिलता है. साथ ही, सदस्यता की पहली खरीदारी और उसके बाद, अपने-आप रिन्यू होने वाली सदस्यता के लिए भी ऐसा ही ईमेल मिलता है. Google Play Console में रिफ़ंड मैनेज करने के लिए, ऑर्डर आईडी का इस्तेमाल किया जा सकता है.

प्लान की कीमत, आपकी ज़रूरत के हिसाब से तय की गई है

अगर आपका ऐप्लिकेशन, यूरोपीय संघ के उपयोगकर्ताओं को उपलब्ध कराया जा सकता है, तो launchBillingFlow को कॉल करते समय setIsOfferPersonalized() तरीके का इस्तेमाल करें. इससे उपयोगकर्ताओं को यह जानकारी दी जा सकेगी कि किसी आइटम की कीमत, अपने-आप फ़ैसला लेने की सुविधा का इस्तेमाल करके उपयोगकर्ताओं के हिसाब से तय की गई थी.

Google Play की खरीदारी वाली स्क्रीन, जिसमें यह दिखाया गया है कि उपयोगकर्ता के लिए कीमत को पसंद के मुताबिक बनाया गया था.
तीसरी इमेज. Google Play की खरीदारी वाली स्क्रीन, जिसमें यह जानकारी दी गई हो कि उपयोगकर्ता के लिए कीमत को पसंद के मुताबिक बनाया गया था.

आपको Art से संपर्क करना होगा. कंज़्यूमर राइट्स डायरेक्टिव 2011/83/ईयू का 6 (1) (ईए) सीआरडी देखें और पता करें कि किसी आइटम की कीमत को उपयोगकर्ताओं के हिसाब से तय किया जा सकता है या नहीं.

setIsOfferPersonalized(), बूलियन इनपुट लेता है. true होने पर, Play के यूज़र इंटरफ़ेस (यूआई) में जानकारी ज़ाहिर की जाती है. false होने पर, यूज़र इंटरफ़ेस (यूआई) में जानकारी ज़ाहिर नहीं की जाती. डिफ़ॉल्ट वैल्यूfalse है.

ज़्यादा जानकारी के लिए, उपभोक्ता सहायता केंद्र पर जाएं.

उपयोगकर्ता आइडेंटिफ़ायर अटैच करना

खरीदारी फ़्लो लॉन्च करने पर, आपका ऐप्लिकेशन obfuscatedAccountId या obfuscatedProfileId का इस्तेमाल करके, खरीदारी करने वाले उपयोगकर्ता के लिए आपके पास मौजूद किसी भी उपयोगकर्ता आइडेंटिफ़ायर को अटैच कर सकता है. आइडेंटिफ़ायर का उदाहरण, आपके सिस्टम में उपयोगकर्ता के लॉगिन का ऐसा वर्शन हो सकता है जिसे छिपाया गया हो. इन पैरामीटर को सेट करने से, Google को धोखाधड़ी का पता लगाने में मदद मिल सकती है. साथ ही, इससे यह पक्का करने में मदद मिलती है कि खरीदारी का क्रेडिट सही उपयोगकर्ता को मिले. इस बारे में उपयोगकर्ताओं को एनटाइटलमेंट देने में बताया गया है.

खरीदारी का पता लगाना और उसे प्रोसेस करना

इस सेक्शन में बताई गई खरीदारी का पता लगाने और उसे प्रोसेस करने की सुविधा, सभी तरह की खरीदारी पर लागू होती है. इसमें, प्रमोशन रिडीम करने जैसी ऐप्लिकेशन से बाहर की खरीदारी भी शामिल है.

आपका ऐप्लिकेशन, नई खरीदारी और पूरी हो चुकी खरीदारी का पता लगाने के लिए, इनमें से किसी एक तरीके का इस्तेमाल करता है:

  1. जब आपके ऐप्लिकेशन के launchBillingFlow को कॉल करने की वजह से onPurchasesUpdated को कॉल किया जाता है (जैसा कि पिछले सेक्शन में बताया गया है) या जब आपके ऐप्लिकेशन से बाहर की गई खरीदारी या लंबे समय से इंतज़ार में रही खरीदारी पूरी होने पर, आपका ऐप्लिकेशन किसी चालू Billing Library कनेक्शन के साथ चल रहा हो. उदाहरण के लिए, परिवार का कोई सदस्य किसी दूसरे डिवाइस पर, मंज़ूरी बाकी खरीदारी को मंज़ूरी देता है.
  2. जब आपका ऐप्लिकेशन, उपयोगकर्ता की खरीदारी के बारे में क्वेरी करने के लिए, queryPurchasesAsync को कॉल करता है.

#1 के लिए, onPurchasesUpdated को नई या पूरी की गई खरीदारी के लिए अपने-आप कॉल किया जाएगा. ऐसा तब तक होगा, जब तक आपका ऐप्लिकेशन चल रहा है और Google Play Billing Library से कनेक्ट है. अगर आपका ऐप्लिकेशन नहीं चल रहा है या आपके ऐप्लिकेशन में Google Play Billing Library से कोई चालू कनेक्शन नहीं है, तो onPurchasesUpdated को ट्रिगर नहीं किया जाएगा. याद रखें, हमारा सुझाव है कि आपका ऐप्लिकेशन, फ़ोरग्राउंड में रहने के दौरान, ऐक्टिव कनेक्शन बनाए रखें. इससे, यह पक्का किया जा सकेगा कि आपके ऐप्लिकेशन को खरीदारी से जुड़े अपडेट समय पर मिलते रहें.

#2 के लिए, आपको BillingClient.queryPurchasesAsync() को कॉल करना होगा, ताकि यह पक्का किया जा सके कि आपका ऐप्लिकेशन सभी खरीदारी को प्रोसेस करता है. हमारा सुझाव है कि आप ऐसा तब करें, जब आपका ऐप्लिकेशन Google Play Billing Library से कनेक्ट हो जाए. हमारा सुझाव है कि आप ऐसा तब करें, जब आपका ऐप्लिकेशन लॉन्च हो या फ़ोरग्राउंड में दिखने लगे, जैसा कि BillingClient को शुरू करना में बताया गया है. ऐसा करने के लिए, onServiceConnected के लिए सही नतीजा मिलने पर, queryPurchasesAsync को कॉल करें. इस सुझाव का पालन करना, इन इवेंट और स्थितियों को मैनेज करने के लिए ज़रूरी है:

  • खरीदारी के दौरान नेटवर्क से जुड़ी समस्याएं: ऐसा हो सकता है कि कोई उपयोगकर्ता खरीदारी कर ले और उसे Google से खरीदारी की पुष्टि मिल जाए. हालांकि, PurchasesUpdatedListener के ज़रिए खरीदारी की सूचना डिवाइस और आपके ऐप्लिकेशन को मिलने से पहले, उपयोगकर्ता का डिवाइस नेटवर्क से कनेक्ट नहीं रहता.
  • एक से ज़्यादा डिवाइस: ऐसा हो सकता है कि कोई उपयोगकर्ता किसी एक डिवाइस पर कोई आइटम खरीदे और फिर डिवाइस बदलने पर उसे वह आइटम दिखे.
  • ऐप्लिकेशन से बाहर की गई खरीदारी को मैनेज करना: कुछ खरीदारी, जैसे कि प्रमोशन रिडीम करना, आपके ऐप्लिकेशन से बाहर की जा सकती हैं.
  • खरीदारी की स्थिति में बदलावों को मैनेज करना: ऐसा हो सकता है कि आपका ऐप्लिकेशन चलने के दौरान, कोई उपयोगकर्ता 'पूरी नहीं हुई' स्थिति वाली खरीदारी के लिए पेमेंट कर दे. साथ ही, वह आपका ऐप्लिकेशन खोलने पर, खरीदारी पूरी होने की पुष्टि करना चाहे.

जब आपका ऐप्लिकेशन किसी नई या पूरी की गई खरीदारी का पता लगाता है, तो उसे ये काम करने चाहिए:

  • खरीदारी की पुष्टि करें.
  • खरीदारी पूरी करने पर, उपयोगकर्ता को कॉन्टेंट उपलब्ध कराना.
  • उपयोगकर्ता को सूचना दें.
  • Google को यह सूचना दें कि आपके ऐप्लिकेशन ने पूरी की गई खरीदारी को प्रोसेस कर दिया है.

इन चरणों के बारे में नीचे दिए गए सेक्शन में पूरी जानकारी दी गई है. इसके बाद, सभी चरणों की खास जानकारी देने वाला एक सेक्शन भी दिया गया है.

खरीदारी की पुष्टि करना

आपके ऐप्लिकेशन को खरीदारी की पुष्टि हमेशा करनी चाहिए, ताकि किसी उपयोगकर्ता को फ़ायदे देने से पहले यह पक्का किया जा सके कि खरीदारी मान्य है. ऐसा करने के लिए, एनटाइटलमेंट देने से पहले खरीदारी की पुष्टि करना में बताए गए दिशा-निर्देशों का पालन करें. खरीदारी की पुष्टि करने के बाद ही, आपके ऐप्लिकेशन को खरीदारी की प्रोसेस जारी रखनी चाहिए और उपयोगकर्ता को एनटाइटलमेंट देने चाहिए. इस बारे में अगले सेक्शन में बताया गया है.

उपयोगकर्ता को एनटाइटलमेंट देना

आपके ऐप्लिकेशन के खरीदारी की पुष्टि करने के बाद, वह उपयोगकर्ता को एनटाइटलमेंट देना जारी रख सकता है और उसे इसकी सूचना दे सकता है. एनटाइटलमेंट देने से पहले, पक्का करें कि आपका ऐप्लिकेशन यह देख रहा हो कि खरीदारी की स्थिति PURCHASED है. अगर खरीदारी की स्थिति 'मंज़ूरी बाकी है' है, तो आपके ऐप्लिकेशन को उपयोगकर्ता को यह सूचना देनी चाहिए कि एनटाइटलमेंट मिलने से पहले, उन्हें खरीदारी पूरी करने के लिए कुछ कार्रवाइयां करनी होंगी. एनटाइटलमेंट सिर्फ़ तब दें, जब खरीदारी की स्थिति 'मंज़ूरी बाकी है' से 'पूरी हो गई है' में बदल जाए. ज़्यादा जानकारी के लिए, पूरे न हुए लेन-देन मैनेज करना लेख पढ़ें.

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

उपयोगकर्ता को सूचना देना

उपयोगकर्ता को एनटाइटलमेंट देने के बाद, आपके ऐप्लिकेशन को खरीदारी की पुष्टि करने के लिए एक सूचना दिखानी चाहिए. इससे यह पक्का होता है कि उपयोगकर्ता को इस बात को लेकर कोई भ्रम न हो कि खरीदारी पूरी हो गई है या नहीं. इस वजह से, उपयोगकर्ता आपके ऐप्लिकेशन का इस्तेमाल करना बंद कर सकता है, उपयोगकर्ता सहायता टीम से संपर्क कर सकता है या सोशल मीडिया पर इसकी शिकायत कर सकता है. ध्यान रखें कि आपका ऐप्लिकेशन, ऐप्लिकेशन के लाइफ़साइकल के दौरान किसी भी समय खरीदारी से जुड़े अपडेट का पता लगा सकता है. उदाहरण के लिए, कोई माता-पिता किसी दूसरे डिवाइस पर, मंज़ूरी बाकी होने वाली खरीदारी को मंज़ूरी देता है. ऐसे में, आपका ऐप्लिकेशन उपयोगकर्ता को सही समय पर सूचना दे सकता है. यहां कुछ उदाहरण दिए गए हैं जिनमें देरी करना सही होगा:

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

खरीदारी के बारे में उपयोगकर्ता को सूचना देते समय, Google Play इन तरीकों का सुझाव देता है:

  • इन-ऐप्लिकेशन डायलॉग दिखाएं.
  • मैसेज को ऐप्लिकेशन में मौजूद मैसेज बॉक्स में भेजें. साथ ही, साफ़ तौर पर बताएं कि ऐप्लिकेशन में मौजूद मैसेज बॉक्स में एक नया मैसेज है.
  • ओएस की सूचना वाले मैसेज का इस्तेमाल करें.

सूचना में, उपयोगकर्ता को मिले फ़ायदे के बारे में बताया जाना चाहिए. उदाहरण के लिए, "आपने 100 गोल्ड सिक्का खरीदे हैं!". इसके अलावा, अगर खरीदारी किसी प्रोग्राम के फ़ायदे के तौर पर की गई है, जैसे कि Play Pass, तो आपका ऐप्लिकेशन उपयोगकर्ता को इसकी जानकारी देता है. उदाहरण के लिए, "आइटम मिल गए! आपको Play Pass के साथ 100 जेम मिले हैं. जारी रखें" पर क्लिक करें. हर प्रोग्राम में, उपयोगकर्ताओं को फ़ायदों के बारे में बताने के लिए, सुझाए गए टेक्स्ट को दिखाने के बारे में दिशा-निर्देश हो सकते हैं.

Google को बताना कि खरीदारी प्रोसेस हो गई है

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

खपत किए जाने वाले प्रॉडक्ट

अगर आपके ऐप्लिकेशन का बैकएंड सुरक्षित है, तो हमारा सुझाव है कि आप खरीदे गए आइटम को भरोसेमंद तरीके से इस्तेमाल करने के लिए, Purchases.products:consume का इस्तेमाल करें. Purchases.products:get को कॉल करने के नतीजे में consumptionState की जांच करके, पक्का करें कि खरीदारी पहले से ही इस्तेमाल न की गई हो. अगर आपका ऐप्लिकेशन सिर्फ़ क्लाइंट-साइड है और उसमें बैकएंड नहीं है, तो Google Play Billing Library में मौजूद consumeAsync() का इस्तेमाल करें. दोनों तरीके, पुष्टि करने की ज़रूरी शर्त को पूरा करते हैं. साथ ही, इनसे यह पता चलता है कि आपके ऐप्लिकेशन ने उपयोगकर्ता को एनटाइटलमेंट दिया है. इन तरीकों की मदद से, आपके ऐप्लिकेशन में एक बार खरीदे जा सकने वाले प्रॉडक्ट को फिर से खरीदने के लिए उपलब्ध कराया जा सकता है. यह प्रॉडक्ट, इनपुट परचेज़ टोकन से जुड़ा होता है. consumeAsync() के साथ, आपको ऐसा ऑब्जेक्ट भी पास करना होगा जो ConsumeResponseListener इंटरफ़ेस को लागू करता हो. यह ऑब्जेक्ट, डेटा का इस्तेमाल करने की प्रोसेस के नतीजे को मैनेज करता है. onConsumeResponse() तरीके को बदला जा सकता है. यह तरीका, ऑपरेशन पूरा होने पर Google Play Billing Library को कॉल करता है.

इस उदाहरण में, खरीदारी के टोकन का इस्तेमाल करके, Google Play Billing Library की मदद से प्रॉडक्ट इस्तेमाल करने का तरीका बताया गया है:

Kotlin

    val consumeParams =
        ConsumeParams.newBuilder()
            .setPurchaseToken(purchase.getPurchaseToken())
            .build()
    val consumeResult = withContext(Dispatchers.IO) {
        client.consumePurchase(consumeParams)
    }

Java

    ConsumeParams consumeParams =
            ConsumeParams.newBuilder()
                .setPurchaseToken(purchase.getPurchaseToken())
                .build();

    ConsumeResponseListener listener = new ConsumeResponseListener() {
        @Override
        public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {
            if (billingResult.getResponseCode() == BillingResponseCode.OK) {
                // Handle the success of the consume operation.
            }
        }
    };

    billingClient.consumeAsync(consumeParams, listener);

ऐसे प्रॉडक्ट जो खत्म नहीं होते

अगर आपके ऐप्लिकेशन का बैकएंड सुरक्षित है, तो हमारा सुझाव है कि एक बार इस्तेमाल होने वाले आइटम की खरीदारी स्वीकार करने के लिए, Purchases.products:acknowledge का इस्तेमाल करें. Purchases.products:get को कॉल करने के नतीजे में acknowledgementState देखकर पक्का करें कि खरीदारी पहले ही स्वीकार नहीं कर ली गई है.

अगर आपका ऐप्लिकेशन सिर्फ़ क्लाइंट-साइड है, तो अपने ऐप्लिकेशन में Google Play Billing Library से BillingClient.acknowledgePurchase() का इस्तेमाल करें. खरीदारी की पुष्टि करने से पहले, आपके ऐप्लिकेशन को यह देखना चाहिए कि Google Play Billing Library में isAcknowledged() तरीके का इस्तेमाल करके, पुष्टि पहले ही की जा चुकी है या नहीं.

इस उदाहरण में, Google Play Billing लाइब्रेरी का इस्तेमाल करके, खरीदारी की पुष्टि करने का तरीका बताया गया है:

Kotlin

val client: BillingClient = ...
val acknowledgePurchaseResponseListener: AcknowledgePurchaseResponseListener = ...

val acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder()
    .setPurchaseToken(purchase.purchaseToken)
val ackPurchaseResult = withContext(Dispatchers.IO) {
     client.acknowledgePurchase(acknowledgePurchaseParams.build())
}

Java

BillingClient client = ...
AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener = ...

AcknowledgePurchaseParams acknowledgePurchaseParams =
                AcknowledgePurchaseParams.newBuilder()
                    .setPurchaseToken(purchase.getPurchaseToken())
                    .build();
 client.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener);

सदस्यताएं

सदस्यताओं को, एक बार इस्तेमाल होने वाले प्रॉडक्ट की तरह ही मैनेज किया जाता है. अगर हो सके, तो अपने सुरक्षित बैकएंड से खरीदारी की पुष्टि करने के लिए, Google Play Developer API के Purchases.subscriptions.acknowledge का इस्तेमाल करें. Purchases.subscriptions:get से खरीदारी के संसाधन में acknowledgementState की जांच करके पुष्टि करें कि खरीदारी पहले ही स्वीकार नहीं की गई है. इसके अलावा, isAcknowledged() को चुनने के बाद, Google Play Billing लाइब्रेरी में जाकर BillingClient.acknowledgePurchase() का इस्तेमाल करके, सदस्यता की पुष्टि की जा सकती है. सदस्यता की सभी शुरुआती खरीदारी की पुष्टि ज़रूरी है. सदस्यता रिन्यू करने के लिए, पुष्टि करने की ज़रूरत नहीं होती. सदस्यताओं की पुष्टि कब करनी चाहिए, इस बारे में ज़्यादा जानने के लिए सदस्यताएं बेचना लेख पढ़ें.

रीकैप

यहां दिया गया कोड स्निपेट, इन चरणों की खास जानकारी दिखाता है.

Kotlin

fun handlePurchase(Purchase purchase) {
    // Purchase retrieved from BillingClient#queryPurchasesAsync or your
    // onPurchasesUpdated.
    Purchase purchase = ...;

    // Step 1: Send the purchase to your secure backend to verify the purchase
    // following
    // https://developer.android.com/google/play/billing/security#verify
.
    // Step 2: Update your entitlement storage with the purchase. If purchase is
    // in PENDING state then ensure the entitlement is marked as pending and the
    // user does not receive benefits yet. It is recommended that this step is
    // done on your secure backend and can combine in the API call to your
    // backend in step 1.

    // Step 3: Notify the user using appropriate messaging (delaying
    // notification if needed as discussed above).

    // Step 4: Notify Google the purchase was processed using the steps
    // discussed in the processing purchases section.
}

Java

void handlePurchase(Purchase purchase) {
    // Purchase retrieved from BillingClient#queryPurchasesAsync or your
    // onPurchasesUpdated.
    Purchase purchase = ...;

    // Step 1: Send the purchase to your secure backend to verify the purchase
    // following
    // https://developer.android.com/google/play/billing/security#verify

    // Step 2: Update your entitlement storage with the purchase. If purchase is
    // in PENDING state then ensure the entitlement is marked as pending and the
    // user does not receive benefits yet. It is recommended that this step is
    // done on your secure backend and can combine in the API call to your
    // backend in step 1.

    // Step 3: Notify the user using appropriate messaging (delaying
    // notification if needed as discussed above).

    // Step 4: Notify Google the purchase was processed using the steps
    // discussed in the processing purchases section.
}

यह पुष्टि करने के लिए कि आपके ऐप्लिकेशन में ये चरण सही तरीके से लागू किए गए हैं या नहीं, जांच करने की गाइड देखें.

मंज़ूरी बाकी वाले लेन-देन मैनेज करना

Google Play, पूरे नहीं हुए लेन-देन या ऐसे लेन-देन की सुविधा देता है जिनमें उपयोगकर्ता के खरीदारी शुरू करने और खरीदारी के लिए पेमेंट का तरीका प्रोसेस होने के बीच एक या एक से ज़्यादा अतिरिक्त चरण पूरे करने होते हैं. आपके ऐप्लिकेशन को इस तरह की खरीदारी के लिए एनटाइटलमेंट तब तक नहीं देना चाहिए, जब तक Google आपको यह सूचना नहीं देता कि उपयोगकर्ता के पेमेंट के तरीके से पैसे कट गए हैं.

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

अपने ऐप्लिकेशन के लिए, बाकी बचे लेन-देन की सुविधा चालू करने के लिए, BillingClient को शुरू करने के दौरान enablePendingPurchases() को कॉल करें. आपके ऐप्लिकेशन में, वन-टाइम प्रॉडक्ट के लिए, बाकी बचे लेन-देन की सुविधा चालू होनी चाहिए और वह इस सुविधा के साथ काम करनी चाहिए. सहायता जोड़ने से पहले, यह पक्का कर लें कि आपको उन लेन-देन के लिए खरीदारी के लाइफ़साइकल के बारे में पता हो जो अभी तक प्रोसेस नहीं हुए हैं.

जब आपके ऐप्लिकेशन में कोई नई खरीदारी होती है, तो PurchasesUpdatedListener या queryPurchasesAsync को कॉल करने पर, getPurchaseState() तरीके का इस्तेमाल करके यह पता लगाएं कि खरीदारी की स्थिति PURCHASED है या PENDING. आपको एनटाइटलमेंट सिर्फ़ तब देना चाहिए, जब स्थिति PURCHASED हो.

अगर आपका ऐप्लिकेशन चल रहा है और उपयोगकर्ता खरीदारी पूरी करने के बाद, आपके पास Play Billing Library का चालू कनेक्शन है, तो आपके PurchasesUpdatedListener को फिर से कॉल किया जाता है और PurchaseState अब PURCHASED हो जाता है. इस समय, आपका ऐप्लिकेशन खरीदारी का पता लगाने और प्रोसेस करने के लिए, स्टैंडर्ड तरीके का इस्तेमाल करके खरीदारी को प्रोसेस कर सकता है. आपके ऐप्लिकेशन के onResume() तरीके में, queryPurchasesAsync() को भी कॉल करना चाहिए. इससे उन खरीदारी को मैनेज किया जा सकता है जो आपके ऐप्लिकेशन के बंद होने के दौरान, PURCHASED स्थिति में बदल गई हैं.

जब खरीदारी की स्थिति PENDING से PURCHASED में बदलती है, तो आपके real_time_developer_notifications क्लाइंट को ONE_TIME_PRODUCT_PURCHASED या SUBSCRIPTION_PURCHASED की सूचना मिलती है. अगर खरीदारी रद्द हो जाती है, तो आपको ONE_TIME_PRODUCT_CANCELED या SUBSCRIPTION_PENDING_PURCHASE_CANCELED सूचना मिलेगी. ऐसा तब हो सकता है, जब आपका ग्राहक तय समयसीमा में पेमेंट न कर पाए. ध्यान दें कि खरीदारी की मौजूदा स्थिति देखने के लिए, Google Play Developer API का इस्तेमाल कभी भी किया जा सकता है.

एक से ज़्यादा प्रॉडक्ट की खरीदारी को मैनेज करना

यह सुविधा, Google Play Billing Library के 4.0 और उसके बाद के वर्शन में काम करती है. Google Play, खरीदारी कार्ट में संख्या डालकर, खरीदारों को एक ही इन-ऐप्लिकेशन प्रॉडक्ट की एक से ज़्यादा संख्या में खरीदारी करने की अनुमति देता है. आपके ऐप्लिकेशन में, एक से ज़्यादा संख्या में खरीदारी करने की सुविधा होनी चाहिए. साथ ही, खरीदारी की तय संख्या के आधार पर एनटाइटलमेंट दिया जाना चाहिए.

एक से ज़्यादा आइटम खरीदने की सुविधा देने के लिए, आपके ऐप्लिकेशन के प्रावधान लॉजिक को आइटम की संख्या की जांच करनी होगी. quantity फ़ील्ड को इनमें से किसी एक एपीआई से ऐक्सेस किया जा सकता है:

एक से ज़्यादा प्रॉडक्ट की खरीदारी को मैनेज करने के लिए लॉजिक जोड़ने के बाद, आपको Google Play Developer Console में इन-ऐप्लिकेशन प्रॉडक्ट मैनेजमेंट पेज पर, उस प्रॉडक्ट के लिए एक से ज़्यादा प्रॉडक्ट की खरीदारी की सुविधा चालू करनी होगी.

उपयोगकर्ता के बिलिंग कॉन्फ़िगरेशन के बारे में क्वेरी करना

getBillingConfigAsync() से उस देश की जानकारी मिलती है जिसका इस्तेमाल उपयोगकर्ता, Google Play के लिए करता है.

BillingClient बनाने के बाद, उपयोगकर्ता के बिलिंग कॉन्फ़िगरेशन के बारे में क्वेरी की जा सकती है. नीचे दिए गए कोड स्निपेट में, getBillingConfigAsync() को कॉल करने का तरीका बताया गया है. BillingConfigResponseListener को लागू करके, जवाब मैनेज करें. इस लिसनर को, आपके ऐप्लिकेशन से शुरू की गई सभी बिलिंग कॉन्फ़िगरेशन क्वेरी के अपडेट मिलते हैं.

अगर BillingResult में कोई गड़बड़ी नहीं है, तो उपयोगकर्ता के Play के देश का नाम पाने के लिए, BillingConfig ऑब्जेक्ट में countryCode फ़ील्ड देखें.

Kotlin

// Use the default GetBillingConfigParams.
val getBillingConfigParams = GetBillingConfigParams.newBuilder().build()
billingClient.getBillingConfigAsync(getBillingConfigParams,
    object : BillingConfigResponseListener {
        override fun onBillingConfigResponse(
            billingResult: BillingResult,
            billingConfig: BillingConfig?
        ) {
            if (billingResult.responseCode == BillingResponseCode.OK
                && billingConfig != null) {
                val countryCode = billingConfig.countryCode
                ...
            } else {
                // TODO: Handle errors
            }
        }
    })

Java

// Use the default GetBillingConfigParams.
GetBillingConfigParams getBillingConfigParams = GetBillingConfigParams.newBuilder().build();
billingClient.getBillingConfigAsync(getBillingConfigParams,
    new BillingConfigResponseListener() {
      public void onBillingConfigResponse(
          BillingResult billingResult, BillingConfig billingConfig) {
        if (billingResult.getResponseCode() == BillingResponseCode.OK
            && billingConfig != null) {
            String countryCode = billingConfig.getCountryCode();
            ...
         } else {
            // TODO: Handle errors
        }
      }
    });

Google Play Games के होम पेज पर, कार्ट में आइटम जोड़ने के बाद चेकआउट प्रोसेस छोड़ने पर रिमाइंडर पाने की सुविधा (डिफ़ॉल्ट रूप से चालू है)

जिन गेम डेवलपर को इन-ऐप्लिकेशन परचेज़ (IAP) से कमाई करनी है उनके लिए, Google Play Console में चालू स्टॉक-कीपिंग यूनिट (एसकेयू) को आपके ऐप्लिकेशन के बाहर बेचने का एक तरीका है. यह तरीका, खरीदारी के बिना कार्ट में सामान छोड़ने का रिमाइंडर देने वाली सुविधा है. इस सुविधा की मदद से, लोगों को Google Play Store को ब्राउज़ करते समय, पहले छोड़ी गई खरीदारी को पूरा करने के लिए कहा जाता है. ये खरीदारी, आपके ऐप्लिकेशन के बाहर की जाती हैं. ये खरीदारी, Google Play Store में Google Play Games के होम पेज से की जाती हैं.

यह सुविधा डिफ़ॉल्ट रूप से चालू रहती है, ताकि उपयोगकर्ता उसी जगह से फिर से शुरू कर सकें जहां से उन्होंने पढ़ना छोड़ा था. साथ ही, डेवलपर को बिक्री बढ़ाने में मदद मिल सके. हालांकि, खरीदारी के बिना कार्ट में सामान छोड़ने का रिमाइंडर भेजने वाली सुविधा से ऑप्ट-आउट करने का फ़ॉर्म सबमिट करके, अपने ऐप्लिकेशन को इस सुविधा से ऑप्ट आउट किया जा सकता है. Google Play Console में SKU मैनेज करने के सबसे सही तरीके जानने के लिए, ऐप्लिकेशन में खरीदने के लिए प्रॉडक्ट बनाना लेख पढ़ें.

नीचे दी गई इमेज में, Google Play Store पर कार्ट छोड़ने का रिमाइंडर दिख रहा है:

Google Play Store की स्क्रीन पर, पहले छोड़ी गई खरीदारी के लिए खरीदारी करने का अनुरोध दिखता है
दूसरी इमेज. Google Play Store की स्क्रीन पर, पहले छोड़ी गई खरीदारी के लिए, खरीदारी करने का अनुरोध दिखता है.

Google Play Store की स्क्रीन पर, पहले छोड़ी गई खरीदारी के लिए खरीदारी करने का अनुरोध दिखता है
तीसरी इमेज. Google Play Store की स्क्रीन पर, पहले छोड़ी गई खरीदारी के लिए, खरीदारी करने का अनुरोध दिखता है.