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

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

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

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

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

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

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

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

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

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

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

Groovy

dependencies {
    def billing_version = "8.0.0"

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

Kotlin

dependencies {
    val billing_version = "8.0.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 = "8.0.0"

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

Kotlin

dependencies {
    val billing_version = "8.0.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() {
        // 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.
    }
});

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

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

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

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

Kotlin

val billingClient = BillingClient.newBuilder(context)
    .setListener(listener)
    .enablePendingPurchases()
    .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 से कनेक्शन बनाने के बाद, आपके पास उपलब्ध प्रॉडक्ट के बारे में क्वेरी करने और उन्हें अपने उपयोगकर्ताओं को दिखाने का विकल्प होता है.

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

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

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

Kotlin

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

billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
    billingResult,
    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.
               }
            }
}

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 success 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 क्लास में तरीकों की सूची देखें.

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

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

  • सदस्यताओं के लिए, queryProductDetailsAsync() तरीके से सदस्यता वाले प्रॉडक्ट की जानकारी मिलती है. साथ ही, हर सदस्यता के लिए, उपयोगकर्ता के लिए उपलब्ध ज़्यादा से ज़्यादा 50 ऑफ़र की जानकारी मिलती है. अगर उपयोगकर्ता, ज़रूरी शर्तें पूरी न करने वाला कोई ऑफ़र खरीदने की कोशिश करता है (उदाहरण के लिए, अगर ऐप्लिकेशन में ज़रूरी शर्तें पूरी करने वाले ऑफ़र की पुरानी सूची दिख रही है), तो 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.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)
            // 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.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, 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 होने पर, Play के यूज़र इंटरफ़ेस (यूआई) में जानकारी ज़ाहिर की जाती है. जब false होता है, तब यूज़र इंटरफ़ेस (यूआई) में जानकारी ज़ाहिर नहीं की जाती. डिफ़ॉल्ट वैल्यू false है.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 Library से 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 हो जाता है. इस समय, आपका ऐप्लिकेशन खरीदारी का पता लगाने और उसे प्रोसेस करने के स्टैंडर्ड तरीके का इस्तेमाल करके, खरीदारी को प्रोसेस कर सकता है. आपके ऐप्लिकेशन को, queryPurchasesAsync() को भी कॉल करना चाहिए. ऐसा इसलिए, ताकि जब आपका ऐप्लिकेशन नहीं चल रहा हो, तब PURCHASED स्थिति में ट्रांज़िशन करने वाली खरीदारी को मैनेज किया जा सके.onResume()

जब खरीदारी की स्थिति 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 फ़ील्ड की जांच करें. इससे आपको उपयोगकर्ता के 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 {
                // 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 की होम स्क्रीन पर, कार्ट में जोड़े गए आइटम के लिए रिमाइंडर (डिफ़ॉल्ट रूप से चालू होता है)

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

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

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

Google Play Store की स्क्रीन पर, पहले रद्द की गई खरीदारी के लिए खरीदारी का प्रॉम्प्ट दिखता है
दूसरी इमेज. Google Play Store की स्क्रीन पर, पहले रद्द की गई खरीदारी के लिए खरीदारी का प्रॉम्प्ट दिखता है.

Google Play Store की स्क्रीन पर, पहले रद्द की गई खरीदारी के लिए खरीदारी का प्रॉम्प्ट दिखता है
तीसरी इमेज. Google Play Store की स्क्रीन पर, पहले रद्द की गई खरीदारी के लिए खरीदारी का प्रॉम्प्ट दिखता है.