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 की डिपेंडेंसी जोड़ें फ़ाइल देखें:

ग्रूवी

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 सुविधा के तरीके उपलब्ध कराता है. सिंक्रोनस (इन दोनों स्थितियों में एक साथ काम करने वाले दोनों तरीके) और एसिंक्रोनस इस्तेमाल हो सकते हैं. हमारा सुझाव है कि आप यह कि आपके पास एक समय पर एक चालू BillingClient कनेक्शन खुला हुआ है एक इवेंट के लिए कई PurchasesUpdatedListener कॉलबैक से बचें.

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

Kotlin

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

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

Java

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

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

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

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

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

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

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

Kotlin

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

Java

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

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

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

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

ऐप्लिकेशन में खरीदे जा सकने वाले प्रॉडक्ट के बारे में क्वेरी करने के लिए, queryProductDetailsAsync() पर कॉल करें.

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

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, जो प्रॉडक्ट आईडी स्ट्रिंग की सूची के बारे में बताता है को 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 के पुराने वर्शन की वजह से ऐसा होता है सेवाएं. इस स्थिति में सही तरीके से मदद पाने के लिए, Play Billing Library 5 माइग्रेशन में पुराने सिस्टम के साथ काम करने की सुविधा से जुड़ी सुविधाएं गाइड देखें.

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

Google Play Billing Library, क्वेरी के नतीजों को List में सेव करता है ProductDetails ऑब्जेक्ट. इसके बाद, कॉल करने के कई तरीके उपलब्ध हैं. किसी इन-ऐप्लिकेशन के बारे में काम की जानकारी देखने के लिए, सूची में मौजूद 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 को 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) {
           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 की खरीदारी वाली स्क्रीन, जो दिखाती है कि उपयोगकर्ता के हिसाब से यह कीमत तय की गई है.

आपको 6 (1) (ea) उपभोक्ता अधिकारों के निर्देश के लिए सीआरडी 2011/83/EU. इसमें यह तय करने के लिए कि उपयोगकर्ताओं को जो कीमत ऑफ़र की जा रही है वह है या नहीं आपके हिसाब से बनाया गया.

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

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

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

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

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

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

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

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

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

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

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

खाने के प्रॉडक्ट

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

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

नीचे दिए गए उदाहरण में, Google Play Billing Library:

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);
        }
    }
}

सदस्यताएं

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

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

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

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

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

नीचे दिए गए उदाहरण में, उपयोगकर्ता की सदस्यता की खरीदारी को फ़ेच करने का तरीका बताया गया है. ध्यान दें कि 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

      }
    }
);

आपके ऐप्लिकेशन के बाहर की जाने वाली खरीदारी को मैनेज करना

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

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

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

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

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

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

रुके हुए लेन-देन मैनेज करना

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

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

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

जब आपके ऐप्लिकेशन को कोई नई खरीदारी मिलती है, तो 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
        }
      }
    });