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

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

खरीदारी की अवधि

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

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

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

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

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

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

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

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

Groovy

dependencies {
    def billing_version = "9.1.0"

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

Kotlin

dependencies {
    val billing_version = "9.1.0"

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

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

Groovy

dependencies {
    def billing_version = "9.1.0"

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

Kotlin

dependencies {
    val billing_version = "9.1.0"

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

BillingClient को शुरू करना

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

  • हमारा सुझाव है कि आप एक समय में एक ही चालू BillingClient कनेक्शन खोलें, ताकि किसी एक इवेंट के लिए कई PurchasesUpdatedListener कॉलबैक न हों.
  • हमारा सुझाव है कि जब आपका ऐप्लिकेशन लॉन्च हो या फ़ोरग्राउंड में आ जाए, तब 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, startConnection() तरीके को कॉल करे, ताकि आगे के अनुरोध करने से पहले Google Play से फिर से कनेक्ट किया जा सके. अगर आपने सेवा के अपने-आप फिर से कनेक्ट होने की सुविधा चालू की है, तो इस तरीके को नो-ऑप के तौर पर लागू किया जा सकता है.

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

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() {
        // If automatic service reconnection is enabled, this can be left empty (no-op)
        // because the library handles retries. You can still use this for non-retry
        // tasks like logging or updating the UI to reflect a disconnected state.
        // Otherwise, 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.
                    // It's a good practice to query products after the connection is established.
                    queryProductDetails();
                }
            }

            @Override
            public void onBillingServiceDisconnected() {
                // Try to restart the connection on the next request to
                // Google Play by calling the startConnection() method.
                // This is automatically handled by the library when you call a method that requires a connection.
            }
        });

कनेक्शन अपने-आप फिर से चालू होना

Play Billing Library के वर्शन 8.0.0 में enableAutoServiceReconnection() मेथड को BillingClient.Builder के तौर पर पेश किया गया है. इससे, सेवा के डिसकनेक्ट होने पर एपीआई कॉल किए जाने पर, Play Billing Library अब सेवा कनेक्शन को अपने-आप फिर से चालू कर सकती है. इससे SERVICE_DISCONNECTED के जवाबों में कमी आ सकती है. ऐसा इसलिए होता है, क्योंकि एपीआई कॉल करने से पहले, फिर से कनेक्ट करने की प्रोसेस को अंदरूनी तौर पर मैनेज किया जाता है.

अपने-आप फिर से कनेक्ट होने की सुविधा चालू करने का तरीका

BillingClient इंस्टेंस बनाते समय, अपने-आप फिर से कनेक्ट होने की सुविधा चालू करने के लिए, BillingClient.Builder में enableAutoServiceReconnection() तरीके का इस्तेमाल करें.

Kotlin

val billingClient = BillingClient.newBuilder(context)
    .setListener(listener)
    .enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build())
    .enableAutoServiceReconnection() // Add this line to enable reconnection
    .build()

Java

BillingClient billingClient = BillingClient.newBuilder(context)
    .setListener(listener)
    .enablePendingPurchases()
    .enableAutoServiceReconnection() // Add this line to enable reconnection
    .build();

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

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

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

वन-टाइम प्रॉडक्ट की जानकारी के लिए क्वेरी करने के लिए, queryProductDetailsAsync तरीके का इस्तेमाल करें. यह तरीका, वन-टाइम प्रॉडक्ट के कॉन्फ़िगरेशन के आधार पर कई ऑफ़र दिखा सकता है. ज़्यादा जानकारी के लिए, वन-टाइम प्रॉडक्ट के लिए, खरीदारी के कई विकल्प और ऑफ़र लेख पढ़ें.

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

Kotlin

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

billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
        billingResult,
        queryProductDetailsResult ->
    if (billingResult.responseCode == BillingResponseCode.OK) {
        for (productDetails in queryProductDetailsResult.productDetailsList) {
            // Process successfully retrieved product details here.
        }

        for (unfetchedProduct in queryProductDetailsResult.unfetchedProductList) {
            // Handle any unfetched products as appropriate.
        }
    }
}

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,
            QueryProductDetailsResult queryProductDetailsResult) {
        if (billingResult.getResponseCode() == BillingResponseCode.OK) {
           for (ProductDetails productDetails : queryProductDetailsResult.getProductDetailsList()) {
             // Process successfully retrieved product details here.
           }

           for (UnfetchedProduct unfetchedProduct : queryProductDetailsResult.getUnfetchedProductList()) {
             // Handle any unfetched products as appropriate.
           }
        }
    }
}
)

प्रॉडक्ट की जानकारी के लिए क्वेरी करते समय, QueryProductDetailsParams का एक इंस्टेंस पास करें. इसमें Google Play Console में बनाई गई प्रॉडक्ट आईडी स्ट्रिंग की सूची के साथ-साथ ProductType भी शामिल हो. 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 7 पर माइग्रेट करने से जुड़ी गाइड में जाकर, पुराने सिस्टम के साथ काम करने वाली सुविधाओं का इस्तेमाल करने का तरीका जानें.

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

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

QueryProductDetailsResult में UnfetchedProduct ऑब्जेक्ट का List भी होता है. इसके बाद, हर UnfetchedProduct के लिए क्वेरी की जा सकती है, ताकि फ़ेच न हो पाने की वजह के हिसाब से स्टेटस कोड मिल सके. प्रॉडक्ट की ऐसी जानकारी देखने के लिए जिसे फ़ेच नहीं किया गया है, UnfetchedProduct क्लास में मौजूद तरीकों की सूची देखें.

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

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

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

  • वन-टाइम प्रॉडक्ट के लिए, 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)
        // Get the offer token:
        // a. For one-time products, call ProductDetails.getOneTimePurchaseOfferDetailsList()
        // for a list of offers that are available to the user.
        // b. For subscriptions, call ProductDetails.getSubscriptionOfferDetails()
        // 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<BillingFlowParams.ProductDetailsParams> productDetailsParamsList =
    ImmutableList.of(
        BillingFlowParams.ProductDetailsParams.newBuilder()
             // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // Get the offer token:
            // a. For one-time products, call ProductDetails.getOneTimePurchaseOfferDetailsList()
            // for a list of offers that are available to the user.
            // b. For subscriptions, call ProductDetails.getSubscriptionOfferDetails()
            // 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 में दिए गए कई रिस्पॉन्स कोड में से कोई एक कोड दिखाता है. इस नतीजे को ज़रूर देखें, ताकि यह पुष्टि की जा सके कि खरीदारी का फ़्लो लॉन्च करने में कोई गड़बड़ी नहीं हुई. OK का BillingResponseCode, लॉन्च के सफल होने का संकेत देता है.

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

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

Google Play, onPurchasesUpdated() को कॉल करता है, ताकि खरीदारी के नतीजे को उस लिसनर तक पहुंचाया जा सके जो PurchasesUpdatedListener इंटरफ़ेस लागू करता है. क्लाइंट को शुरू करते समय, 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 पर खरीदारी पूरी होने की स्क्रीन जनरेट होती है. यह इमेज 2 जैसी दिखती है.

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

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

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

यह बताना कि कीमत को आपकी दिलचस्पी के हिसाब से तय किया गया है

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

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

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

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

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

यूज़र आइडेंटिफ़ायर अटैच करना

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

पहले से किए गए ऑर्डर के लिए, रिलीज़ होने के समय से पहले खरीदारी की स्थिति 'लंबित है' पर सेट होती है. रिलीज़ होने के समय, पहले से ऑर्डर की गई खरीदारी पूरी हो जाएगी. साथ ही, बिना किसी अतिरिक्त कार्रवाई के, उसकी स्थिति बदलकर 'खरीदा गया' हो जाएगी.

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

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

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

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

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

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

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 =
        (billingResult, 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 Library का इस्तेमाल करके, खरीदारी की पुष्टि करने का तरीका बताया गया है:

Kotlin

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

Java

if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) {
    if (!purchase.isAcknowledged()) {
        AcknowledgePurchaseParams acknowledgePurchaseParams =
                AcknowledgePurchaseParams.newBuilder()
                        .setPurchaseToken(purchase.getPurchaseToken())
                        .build();
        billingClient.acknowledgePurchase(acknowledgePurchaseParams, (billingResult) -> {
            // Acknowledgment handled.
        });
    }
}

सदस्यताएं

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

अस्वीकार की गई या पूरी नहीं की गई खरीदारी को मैनेज करना

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

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

इसके बजाय, Google Play Developer API का इस्तेमाल करके, अस्वीकार की गई खरीदारी को तुरंत रद्द करें और अपने बैकएंड से रिफ़ंड करें:

  • सदस्यताएं: revocationContext में "fullRefund": {} के साथ purchases.subscriptionsv2.revoke को कॉल करें. इससे सदस्यता तुरंत रद्द हो जाती है, ऐक्सेस वापस ले लिया जाता है, और पूरा रिफ़ंड शुरू कर दिया जाता है.
  • एक बार खरीदे जाने वाले प्रॉडक्ट: किसी ऑर्डर का तुरंत रिफ़ंड देने और उसके एनटाइटलमेंट को रद्द करने के लिए, revoke पैरामीटर को true पर सेट करके orders.refund को कॉल करें. इस तरीके को कॉल करते समय, आपको खरीदारी का ऑर्डर आईडी पास करना होगा. इसे Purchase.getOrderId() या purchases.productsv2.getproductpurchasev2 से वापस पाया जा सकता है. अस्वीकार की गई खरीदारी के लिए, कभी भी consumeAsync(), acknowledgePurchase(), Purchases.products:consume या Purchases.products:acknowledge को कॉल न करें.
  • आरटीडीएन और रद्द की गई खरीदारी का व्यवहार: डेवलपर की ओर से सदस्यता रद्द करने और रिफ़ंड देने (purchases.subscriptionsv2.revoke और orders.refund के साथ revoke को true पर सेट करना) से, डेवलपर से जुड़ी रीयल-टाइम सूचनाएं ट्रिगर होती हैं. साथ ही, इन्हें रद्द की गई खरीदारी के एपीआई (डेवलपर के लिए voidedSource रिस्पॉन्स फ़ील्ड को 1 पर सेट करने के साथ purchases.voidedpurchases.list) में रिकॉर्ड किया जाता है:
    • सदस्यताएं: इससे SUBSCRIPTION_REVOKED और VoidedPurchaseNotification, दोनों सूचनाएं भेजी जाती हैं.
    • वन-टाइम प्रॉडक्ट: VoidedPurchaseNotification भेजता है. साथ ही, अगर आपका ऐप्लिकेशन Play Console में सभी वन-टाइम प्रॉडक्ट की सूचनाएं पाने के लिए कॉन्फ़िगर किया गया है, तो ONE_TIME_PRODUCT_CANCELED सूचना भेजता है.
    • revoke को true पर सेट किए बिना orders.refund को कॉल करने पर, ऑर्डर का रिफ़ंड मिल जाता है. हालांकि, इसके लिए एनटाइटलमेंट को रद्द नहीं किया जाता. साथ ही, एनटाइटलमेंट रद्द करने या खरीदारी रद्द करने की सूचना भी ट्रिगर नहीं होती. ज़्यादा जानकारी के लिए, सदस्यताओं और एक बार की जाने वाली खरीदारी मैनेज करना लेख पढ़ें.

रीकैप

यहां इन चरणों के बारे में खास जानकारी दी गई है.

  1. एंटाइटलमेंट देने से पहले खरीदारी की पुष्टि करने के लिए, खरीदारी की जानकारी अपने सुरक्षित बैकएंड पर भेजें.

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

  3. उपयोगकर्ता को सही मैसेज भेजकर सूचना दें. अगर ज़रूरत हो, तो सूचना भेजने में देरी करें, जैसा कि पहले बताया गया है.

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

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

ऐसे लेन-देन मैनेज करना जिन्हें मंज़ूरी नहीं मिली है

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 में कोई गड़बड़ी नहीं है, तो BillingConfig ऑब्जेक्ट में countryCode फ़ील्ड की जांच करके, उपयोगकर्ता के Google Play खाते में सेट किए गए देश की जानकारी हासिल की जा सकती है.

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 {
                // Handle errors
            }
        }
    }
)

Java

GetBillingConfigParams getBillingConfigParams = GetBillingConfigParams.newBuilder().build();
billingClient.getBillingConfigAsync(
        getBillingConfigParams,
        (billingResult, billingConfig) -> {
            if (billingResult.getResponseCode() == BillingResponseCode.OK && billingConfig != null) {
                String countryCode = billingConfig.getCountryCode();
            } else {
                // TODO: Handle errors
            }
        });