इस विषय में, प्रॉडक्ट बेचने के लिए, Google Play Billing Library को अपने ऐप्लिकेशन में इंटिग्रेट करने का तरीका बताया गया है.
खरीदारी की लाइफ़
यहां एक बार की जाने वाली खरीदारी या सदस्यता के लिए, सामान्य परचेज़ फ़्लो दिया गया है.
- उपयोगकर्ता को दिखाएं कि वह क्या खरीद सकता है.
- खरीदारी स्वीकार करने के लिए, उपयोगकर्ता के लिए परचेज़ फ़्लो लॉन्च करें.
- अपने सर्वर पर खरीदारी की पुष्टि करें.
- उपयोगकर्ता को कॉन्टेंट दें.
- कॉन्टेंट की डिलीवरी की पुष्टि करें. इस्तेमाल किए जाने वाले प्रॉडक्ट के लिए, खरीदारी का इस्तेमाल करें, ताकि उपयोगकर्ता आइटम को फिर से खरीद सके.
सदस्यताएं तब तक अपने-आप रिन्यू होती रहेंगी, जब तक उन्हें रद्द नहीं कर दिया जाता. सदस्यता को इन स्थितियों में खरीदा जा सकता है:
- चालू: उपयोगकर्ता अच्छी स्थिति में हो और उसके पास सदस्यता का ऐक्सेस हो.
- रद्द की गई: उपयोगकर्ता ने सदस्यता रद्द कर दी है, लेकिन उसके पास सदस्यता खत्म होने तक ऐक्सेस रहेगा.
- ग्रेस पीरियड के दौरान: उपयोगकर्ता को पेमेंट से जुड़ी समस्या हुई, लेकिन 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, 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 Console में रिफ़ंड मैनेज किए जा सकते हैं.
प्लान की कीमत, आपकी ज़रूरत के हिसाब से तय की गई है
अगर आपका ऐप्लिकेशन, यूरोपीय संघ के उपयोगकर्ताओं के लिए उपलब्ध है, तो उपयोगकर्ताओं को यह बताने के लिए setIsOfferPersonalized()
तरीके का इस्तेमाल करें कि किसी आइटम की कीमत, अपने-आप फ़ैसला लेने की सुविधा का इस्तेमाल करके उपयोगकर्ताओं के हिसाब से तय की गई थी.
आपको Art से संपर्क करना होगा. कंज़्यूमर राइट्स डायरेक्टिव 2011/83/ईयू का 6 (1) (ईए) सीआरडी देखें और पता करें कि किसी आइटम की कीमत को उपयोगकर्ताओं के हिसाब से तय किया जा सकता है या नहीं.
setIsOfferPersonalized()
बूलियन इनपुट लेता है. true
होने पर, Play के यूज़र इंटरफ़ेस (यूआई) में जानकारी ज़ाहिर की जाती है. false
होने पर, यूज़र इंटरफ़ेस (यूआई) में जानकारी ज़ाहिर नहीं की जाती. डिफ़ॉल्ट वैल्यूfalse
है.
ज़्यादा जानकारी के लिए, उपभोक्ता सहायता केंद्र पर जाएं.
खरीदारी की प्रोसेस जारी है
जब कोई उपयोगकर्ता खरीदारी पूरी करता है, तो आपके ऐप्लिकेशन को वह खरीदारी प्रोसेस करनी पड़ती है.
ज़्यादातर मामलों में, आपके ऐप्लिकेशन को खरीदारी की सूचना, आपके PurchasesUpdatedListener
से मिलती है. हालांकि, कुछ मामलों में आपको BillingClient.queryPurchasesAsync()
को कॉल करके खरीदारी के बारे में जानकारी दी जाएगी. इस बारे में खरीदारी की जानकारी पाना सेक्शन में बताया गया है.
इसके अलावा, अगर आपके सुरक्षित बैकएंड में डेवलपर से जुड़ी रीयल-टाइम सूचनाएं वाला क्लाइंट है, तो नई खरीदारी की सूचना देने के लिए subscriptionNotification
या oneTimeProductNotification
की मदद से नई खरीदारी रजिस्टर की जा सकती है. ये सूचनाएं मिलने के बाद, पूरी स्थिति जानने और अपने बैकएंड की स्थिति अपडेट करने के लिए, Google Play डेवलपर एपीआई को कॉल करें.
आपका ऐप्लिकेशन, खरीदारी को इस तरह प्रोसेस करना चाहिए:
- खरीदारी की पुष्टि करें.
- उपयोगकर्ता को कॉन्टेंट दें और कॉन्टेंट डिलीवर होने की पुष्टि करें. इसके अलावा, आइटम को 'इस्तेमाल किया गया' के तौर पर मार्क करें, ताकि उपयोगकर्ता उसे फिर से खरीद सके.
खरीदारी की पुष्टि करने के लिए, सबसे पहले देखें कि खरीदारी की स्थिति 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, पूरे नहीं हुए लेन-देन या ऐसे लेन-देन की सुविधा देता है जिनमें उपयोगकर्ता के खरीदारी शुरू करने और खरीदारी के लिए पेमेंट का तरीका प्रोसेस होने के बीच एक या एक से ज़्यादा अतिरिक्त चरण पूरे करने होते हैं. आपके ऐप्लिकेशन को इस तरह की खरीदारी के लिए एनटाइटलमेंट तब तक नहीं देना चाहिए, जब तक 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
फ़ील्ड को इनमें से किसी एक एपीआई से ऐक्सेस किया जा सकता है:
getQuantity()
को Google Play Billing Library से ऐक्सेस किया जा सकता है.- Google Play Developer API से
Purchases.products.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
}
}
});