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 बनाने के लिए, 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.
    }
});

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

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,
    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.
}

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

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

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

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

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

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

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

अपने ऐप्लिकेशन से खरीदारी का अनुरोध शुरू करने के लिए, अपने ऐप्लिकेशन के मुख्य थ्रेड से launchBillingFlow() विधि को कॉल करें. यह तरीका BillingFlowParams ऑब्जेक्ट का रेफ़रंस लेता है, जिसमें कॉल करने से मिला काम का ProductDetails ऑब्जेक्ट मौजूद होता है. यह ऑब्जेक्ट queryProductDetailsAsync() से मिलता है. 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 product, "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) {
           handlePurchase(purchase)
       }
   } else if (billingResult.responseCode == BillingResponseCode.USER_CANCELED) {
       // Handle an error caused by a user cancelling 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) {
            handlePurchase(purchase);
        }
    } else if (billingResult.getResponseCode() == BillingResponseCode.USER_CANCELED) {
        // Handle an error caused by a user cancelling the purchase flow.
    } else {
        // Handle any other error codes.
    }
}

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

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

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

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

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

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

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

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

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

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

खरीदारी की प्रोसेस जारी है

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

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

आपका ऐप्लिकेशन, खरीदारी को इस तरह प्रोसेस करना चाहिए:

  1. खरीदारी की पुष्टि करें.
  2. उपयोगकर्ता को कॉन्टेंट दें और कॉन्टेंट डिलीवर होने की पुष्टि करें. इसके अलावा, आइटम को 'इस्तेमाल किया गया' के तौर पर मार्क करें, ताकि उपयोगकर्ता उसे फिर से खरीद सके.

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

खरीदारी की पुष्टि करने के बाद, आपका ऐप्लिकेशन उपयोगकर्ता को एनटाइटलमेंट देने के लिए तैयार हो जाता है. खरीदारी से जुड़े उपयोगकर्ता खाते की पहचान, इन-ऐप्लिकेशन प्रॉडक्ट की खरीदारी के लिए Purchases.products:get से मिले ProductPurchase.obfuscatedExternalAccountId और सर्वर साइड पर सदस्यताओं के लिए Purchases.subscriptions:get से मिले SubscriptionPurchase.obfuscatedExternalAccountId से की जा सकती है. इसके अलावा, अगर खरीदारी के समय setObfuscatedAccountId से कोई खाता सेट किया गया था, तो क्लाइंट साइड पर Purchase.getAccountIdentifiers() से मिले obfuscatedAccountId से भी खरीदारी से जुड़े उपयोगकर्ता खाते की पहचान की जा सकती है.

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

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

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

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

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

Kotlin

suspend fun handlePurchase(purchase: Purchase) {
    // Purchase retrieved from BillingClient#queryPurchasesAsync or your PurchasesUpdatedListener.
    val purchase : Purchase = ...;

    // Verify the purchase.
    // Ensure entitlement was not already granted for this purchaseToken.
    // Grant entitlement to the user.

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

Java

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

    // Verify the purchase.
    // Ensure entitlement was not already granted for this purchaseToken.
    // Grant entitlement to the user.

    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 = ...

suspend fun handlePurchase() {
    if (purchase.purchaseState === PurchaseState.PURCHASED) {
        if (!purchase.isAcknowledged) {
            val acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder()
                    .setPurchaseToken(purchase.purchaseToken)
            val ackPurchaseResult = withContext(Dispatchers.IO) {
               client.acknowledgePurchase(acknowledgePurchaseParams.build())
            }
        }
     }
}

Java

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

void handlePurchase(Purchase purchase) {
    if (purchase.getPurchaseState() == PurchaseState.PURCHASED) {
        if (!purchase.isAcknowledged()) {
            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() का इस्तेमाल करके, सदस्यता की पुष्टि की जा सकती है. सदस्यता की सभी शुरुआती खरीदारी की पुष्टि ज़रूरी है. सदस्यता रिन्यू करने के लिए, पुष्टि करने की ज़रूरत नहीं होती. सदस्यताओं की पुष्टि कब करनी चाहिए, इस बारे में ज़्यादा जानने के लिए सदस्यताएं बेचना लेख पढ़ें.

खरीदारी की जानकारी फ़ेच की जा रही है

PurchasesUpdatedListener का इस्तेमाल करके खरीदारी से जुड़े अपडेट सुनने से, यह पक्का नहीं होता कि आपका ऐप्लिकेशन सभी खरीदारी को प्रोसेस करता है. ऐसा हो सकता है कि आपके ऐप्लिकेशन को उपयोगकर्ता की सभी खरीदारी की जानकारी न हो. यहां कुछ ऐसे उदाहरण दिए गए हैं जिनमें आपका ऐप्लिकेशन, खरीदारी का ट्रैक नहीं रख पाता या उन्हें रिकॉर्ड नहीं कर पाता:

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

इन स्थितियों को मैनेज करने के लिए, पक्का करें कि आपका ऐप्लिकेशन onResume() तरीके में BillingClient.queryPurchasesAsync() को कॉल करता हो, ताकि यह पक्का किया जा सके कि सभी खरीदारी, खरीदारी प्रोसेस करने में बताए गए तरीके के मुताबिक प्रोसेस की गई हों.

नीचे दिए गए उदाहरण में, उपयोगकर्ता की सदस्यता की खरीदारी को फ़ेच करने का तरीका बताया गया है. ध्यान दें कि queryPurchasesAsync() सिर्फ़ चालू सदस्यताओं और एक बार में की गई ऐसी खरीदारी की जानकारी दिखाता है जिनका इस्तेमाल नहीं किया गया है.

Kotlin

val params = QueryPurchasesParams.newBuilder()
               .setProductType(ProductType.SUBS)

// uses queryPurchasesAsync Kotlin extension function
val purchasesResult = billingClient.queryPurchasesAsync(params.build())

// check purchasesResult.billingResult
// process returned purchasesResult.purchasesList, e.g. display the plans user owns

Java

billingClient.queryPurchasesAsync(
    QueryPurchasesParams.newBuilder()
      .setProductType(ProductType.SUBS)
      .build(),
    new PurchasesResponseListener() {
      public void onQueryPurchasesResponse(BillingResult billingResult, List<Purchase> purchases) {
        // check billingResult
        // process returned purchase list, e.g. display the plans user owns

      }
    }
);

ऐप्लिकेशन से बाहर की गई खरीदारी मैनेज करना

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

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

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

आपको खरीदारी का पता लगाना होगा. भले ही, खरीदारी करते समय ऐप्लिकेशन किसी भी स्थिति में हो. हालांकि, कुछ अपवाद भी हैं. हालांकि, हो सकता है कि आप उपयोगकर्ता को तुरंत सूचित न करें कि आइटम मिल गया है. उदाहरण के लिए:

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

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

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 की स्क्रीन पर, पहले छोड़ी गई खरीदारी के लिए, खरीदारी करने का अनुरोध दिखता है.

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

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

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

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

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

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

जब खरीदारी की स्थिति PENDING से PURCHASED में बदलती है, तो आपके डेवलपर से जुड़ी रीयल-टाइम सूचनाएं क्लाइंट को 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 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
        }
      }
    });