इस दस्तावेज़ में, Google Play Billing Library को अपने ऐप्लिकेशन में इंटिग्रेट करने का तरीका बताया गया है, ताकि प्रॉडक्ट बेचे जा सकें.
खरीदारी की अवधि
यहां एक बार की जाने वाली खरीदारी या सदस्यता के लिए, खरीदारी का सामान्य फ़्लो दिया गया है.
- उपयोगकर्ता को दिखाएं कि वह क्या खरीद सकता है.
- उपयोगकर्ता के लिए खरीदारी का फ़्लो लॉन्च करें, ताकि वह खरीदारी स्वीकार कर सके.
- अपने सर्वर पर खरीदारी की पुष्टि करें.
- उपयोगकर्ता को कॉन्टेंट देना.
- कॉन्टेंट डिलीवर होने की पुष्टि करें. इस्तेमाल होने वाले प्रॉडक्ट के लिए, खरीदारी को इस्तेमाल करें, ताकि उपयोगकर्ता आइटम को फिर से खरीद सके.
सदस्यताएं तब तक अपने-आप रिन्यू होती रहती हैं, जब तक उन्हें रद्द नहीं किया जाता. सदस्यता की ये स्थितियां हो सकती हैं:
- चालू है: उपयोगकर्ता की सदस्यता अच्छी स्थिति में है और उसके पास सदस्यता का ऐक्सेस है.
- रद्द की गई: उपयोगकर्ता ने सदस्यता रद्द कर दी है, लेकिन उसके पास सदस्यता खत्म होने तक इसे ऐक्सेस करने की सुविधा है.
- ग्रेस पीरियड में है: उपयोगकर्ता को पेमेंट से जुड़ी समस्या आ रही है, लेकिन उसके पास अब भी ऐक्सेस है. ऐसा तब होता है, जब Google पेमेंट के तरीके को फिर से आज़मा रहा हो.
- होल्ड पर है: उपयोगकर्ता को पेमेंट से जुड़ी समस्या हुई है और अब उसके पास ऐक्सेस नहीं है. वहीं, Google पेमेंट के तरीके को फिर से आज़मा रहा है.
- रोका गया: उपयोगकर्ता ने ऐक्सेस रोक दिया है. जब तक वह इसे फिर से शुरू नहीं करता, तब तक उसके पास ऐक्सेस नहीं होगा.
- समयसीमा खत्म हो गई है: उपयोगकर्ता ने सदस्यता रद्द कर दी है और उसके पास सदस्यता का ऐक्सेस नहीं है. सदस्यता खत्म होने पर, उपयोगकर्ता को छोड़ दिया गया माना जाता है.
Google Play से कनेक्शन शुरू करना
Google Play के बिलिंग सिस्टम को इंटिग्रेट करने के लिए, सबसे पहले अपने ऐप्लिकेशन में Google Play Billing Library जोड़ें और कनेक्शन शुरू करें.
Google Play Billing Library की डिपेंडेंसी जोड़ना
अपने ऐप्लिकेशन की build.gradle फ़ाइल में, Google Play Billing Library की डिपेंडेंसी जोड़ें. इसके लिए, यहां दिया गया तरीका अपनाएं:
Groovy
dependencies { def billing_version = "8.3.0" implementation "com.android.billingclient:billing:$billing_version" }
Kotlin
dependencies { val billing_version = "8.3.0" implementation("com.android.billingclient:billing:$billing_version") }
अगर Kotlin का इस्तेमाल किया जा रहा है, तो Google Play Billing Library KTX मॉड्यूल में Kotlin एक्सटेंशन और कोराउटीन सपोर्ट शामिल होता है. इससे Google Play Billing Library का इस्तेमाल करते समय, Kotlin के स्टैंडर्ड कोड लिखे जा सकते हैं. इन एक्सटेंशन को अपने प्रोजेक्ट में शामिल करने के लिए, अपने ऐप्लिकेशन की build.gradle फ़ाइल में यहां दिखाई गई डिपेंडेंसी जोड़ें:
Groovy
dependencies { def billing_version = "8.3.0" implementation "com.android.billingclient:billing-ktx:$billing_version" }
Kotlin
dependencies { val billing_version = "8.3.0" implementation("com.android.billingclient:billing-ktx:$billing_version") }
BillingClient को शुरू करना
Google Play Billing Library पर डिपेंडेंसी जोड़ने के बाद, आपको BillingClient इंस्टेंस को शुरू करना होगा. BillingClient, Google Play Billing Library और आपके ऐप्लिकेशन के बाकी हिस्सों के बीच कम्यूनिकेशन के लिए मुख्य इंटरफ़ेस है. BillingClient, बिलिंग से जुड़ी कई सामान्य कार्रवाइयों के लिए, सिंक्रोनस और असिंक्रोनस, दोनों तरह के सुविधाजनक तरीके उपलब्ध कराता है. इन बातों का ध्यान रखें:
- हमारा सुझाव है कि एक बार में सिर्फ़ एक
BillingClientकनेक्शन खुला रखें, ताकि एक इवेंट के लिए कईPurchasesUpdatedListenerकॉलबैक न हों. - हमारा सुझाव है कि जब आपका ऐप्लिकेशन लॉन्च हो या फ़ोरग्राउंड में आए, तब BillingClient के लिए कनेक्शन शुरू करें. इससे यह पक्का किया जा सकेगा कि आपका ऐप्लिकेशन, खरीदारी को समय पर प्रोसेस कर रहा है. इसके लिए,
registerActivityLifecycleCallbacksसे रजिस्टर किए गएActivityLifecycleCallbacksका इस्तेमाल किया जा सकता है. साथ ही, गतिविधि के फिर से शुरू होने का पता चलने पर, कनेक्शन शुरू करने के लिए onActivityResumed को सुना जा सकता है. इस सबसे सही तरीके का पालन क्यों करना चाहिए, इस बारे में ज़्यादा जानने के लिए, खरीदारी प्रोसेस करने सेक्शन देखें. यह भी याद रखें कि ऐप्लिकेशन बंद होने पर, कनेक्शन बंद कर दें.
BillingClient बनाने के लिए, newBuilder का इस्तेमाल करें. newBuilder() को कोई भी कॉन्टेक्स्ट पास किया जा सकता है. BillingClient इसका इस्तेमाल, ऐप्लिकेशन कॉन्टेक्स्ट पाने के लिए करता है. इसका मतलब है कि आपको मेमोरी लीक की चिंता करने की ज़रूरत नहीं है. खरीदारी से जुड़े अपडेट पाने के लिए, आपको setListener को कॉल करके, PurchasesUpdatedListener का रेफ़रंस देना होगा. यह लिसनर, आपके ऐप्लिकेशन में की गई सभी खरीदारी के अपडेट पाता है.
Kotlin
private val purchasesUpdatedListener = PurchasesUpdatedListener { billingResult, purchases -> // To be implemented in a later section. } private var billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) // Configure other settings. .build()
Java
private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() { @Override public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) { // To be implemented in a later section. } }; private BillingClient billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) // Configure other settings. .build();
Google Play से कनेक्ट करना
BillingClient बनाने के बाद, आपको Google Play से कनेक्शन बनाना होगा.
Google Play से कनेक्ट करने के लिए, startConnection पर कॉल करें. कनेक्शन की प्रोसेस एसिंक्रोनस होती है. आपको BillingClientStateListener लागू करना होगा, ताकि क्लाइंट का सेटअप पूरा होने के बाद आपको कॉलबैक मिल सके. इसके बाद, क्लाइंट आगे के अनुरोध करने के लिए तैयार हो जाएगा.
अगर आपने सेवा के अपने-आप फिर से कनेक्ट होने की सुविधा चालू नहीं की है, तो आपको Google Play से कनेक्शन के बंद होने की समस्या को ठीक करने के लिए, फिर से कोशिश करने की सुविधा भी लागू करनी होगी. फिर से कोशिश करने की सुविधा लागू करने के लिए, onBillingServiceDisconnected() कॉलबैक तरीके को ओवरराइड करें. साथ ही, यह पक्का करें कि BillingClient, startConnection() तरीके को कॉल करता हो, ताकि आगे के अनुरोध करने से पहले Google Play से फिर से कनेक्ट किया जा सके. अगर आपने सेवा के अपने-आप फिर से कनेक्ट होने की सुविधा चालू की है, तो इस तरीके को नो-ऑप के तौर पर लागू किया जा सकता है.
यहां दिए गए उदाहरण में, कनेक्शन शुरू करने और यह जांचने का तरीका बताया गया है कि कनेक्शन इस्तेमाल करने के लिए तैयार है या नहीं:
Kotlin
billingClient.startConnection(object : BillingClientStateListener { override fun onBillingSetupFinished(billingResult: BillingResult) { if (billingResult.responseCode == BillingResponseCode.OK) { // The BillingClient is ready. You can query purchases here. } } override fun onBillingServiceDisconnected() { // If automatic service reconnection is enabled, this can be left empty (no-op) // because the library handles retries. You can still use this for non-retry // tasks like logging or updating the UI to reflect a disconnected state. // Otherwise, try to restart the connection on the next request to // Google Play by calling the startConnection() method. } })
Java
billingClient.startConnection(new BillingClientStateListener() { @Override public void onBillingSetupFinished(BillingResult billingResult) { if (billingResult.getResponseCode() == BillingResponseCode.OK) { // The BillingClient is ready. You can query purchases here. } } @Override public void onBillingServiceDisconnected() { // If automatic service reconnection is enabled, this can be left empty (no-op) // because the library handles retries. You can still use this for non-retry // tasks like logging or updating the UI to reflect a disconnected state. // Otherwise, try to restart the connection on the next request to // Google Play by calling the startConnection() method. } });
कनेक्शन अपने-आप फिर से चालू होने की सुविधा
Play Billing Library के वर्शन 8.0.0 में BillingClient.Builder में enableAutoServiceReconnection() तरीके को शामिल किया गया है. इससे, सेवा के डिसकनेक्ट होने के दौरान एपीआई कॉल किए जाने पर, Play Billing Library अब सेवा कनेक्शन को अपने-आप फिर से चालू कर सकती है. इससे SERVICE_DISCONNECTED के जवाबों की संख्या कम हो सकती है, क्योंकि एपीआई कॉल करने से पहले, फिर से कनेक्ट करने की प्रोसेस को अंदरूनी तौर पर मैनेज किया जाता है.
अपने-आप फिर से कनेक्ट होने की सुविधा चालू करने का तरीका
BillingClient इंस्टेंस बनाते समय, BillingClient.Builder में enableAutoServiceReconnection() तरीके का इस्तेमाल करके, अपने-आप फिर से कनेक्ट होने की सुविधा चालू करें.
Kotlin
val billingClient = BillingClient.newBuilder(context)
.setListener(listener)
.enablePendingPurchases()
.enableAutoServiceReconnection() // Add this line to enable reconnection
.build()
Java
BillingClient billingClient = BillingClient.newBuilder(context)
.setListener(listener)
.enablePendingPurchases()
.enableAutoServiceReconnection() // Add this line to enable reconnection
.build();
खरीदारी के लिए उपलब्ध प्रॉडक्ट दिखाना
Google Play से कनेक्ट करने के बाद, आपके पास उपलब्ध प्रॉडक्ट के बारे में क्वेरी करने और उन्हें अपने उपयोगकर्ताओं को दिखाने का विकल्प होता है.
उपयोगकर्ताओं को अपने प्रॉडक्ट दिखाने से पहले, प्रॉडक्ट की जानकारी के लिए क्वेरी करना एक ज़रूरी चरण है. इससे, प्रॉडक्ट की जानकारी स्थानीय भाषा में मिलती है. सदस्यताओं के लिए, पुष्टि करें कि आपका प्रॉडक्ट डिसप्ले Play की सभी नीतियों का पालन करता हो.
वन-टाइम प्रॉडक्ट की जानकारी के लिए क्वेरी करने के लिए, queryProductDetailsAsync
तरीके का इस्तेमाल करें. यह तरीका, वन-टाइम प्रॉडक्ट के कॉन्फ़िगरेशन के आधार पर कई ऑफ़र दिखा सकता है. ज़्यादा जानकारी के लिए, वन-टाइम प्रॉडक्ट के लिए खरीदारी के कई विकल्प और ऑफ़र लेख पढ़ें.
एसिंक्रोनस ऑपरेशन के नतीजे को मैनेज करने के लिए, आपको एक लिसनर भी तय करना होगा. यह लिसनर, ProductDetailsResponseListener इंटरफ़ेस को लागू करता है.
इसके बाद, onProductDetailsResponse को बदला जा सकता है. इससे क्वेरी पूरी होने पर लिसनर को सूचना मिलती है. इसे यहां दिए गए उदाहरण में दिखाया गया है:
Kotlin
val queryProductDetailsParams = QueryProductDetailsParams.newBuilder() .setProductList( ImmutableList.of( Product.newBuilder() .setProductId("product_id_example") .setProductType(ProductType.SUBS) .build())) .build() billingClient.queryProductDetailsAsync(queryProductDetailsParams) { billingResult, queryProductDetailsResult -> if (billingResult.getResponseCode() == BillingResponseCode.OK) { for (ProductDetails productDetails : queryProductDetailsResult.getProductDetailsList()) { // Process successfully retrieved product details here. } for (UnfetchedProduct unfetchedProduct : queryproductDetailsResult.getUnfetchedProductList()) { // Handle any unfetched products as appropriate. } } }
Java
QueryProductDetailsParams queryProductDetailsParams = QueryProductDetailsParams.newBuilder() .setProductList( ImmutableList.of( Product.newBuilder() .setProductId("product_id_example") .setProductType(ProductType.SUBS) .build())) .build(); billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse(BillingResult billingResult, QueryProductDetailsResult queryProductDetailsResult) { if (billingResult.getResponseCode() == BillingResponseCode.OK) { for (ProductDetails productDetails : queryProductDetailsResult().getProductDetailsList()) { // Process success retrieved product details here. } for (UnfetchedProduct unfetchedProduct : queryproductDetailsResult.getUnfetchedProductList()) { // Handle any unfetched products as appropriate. } } } } )
प्रॉडक्ट की जानकारी के लिए क्वेरी करते समय, QueryProductDetailsParams का एक ऐसा इंस्टेंस पास करें जिसमें Google Play Console में बनाए गए प्रॉडक्ट आईडी स्ट्रिंग की सूची के साथ-साथ ProductType भी शामिल हो. ProductType एट्रिब्यूट की वैल्यू, एक बार खरीदे जाने वाले प्रॉडक्ट के लिए ProductType.INAPP या सदस्यता के लिए ProductType.SUBS हो सकती है.
Kotlin एक्सटेंशन के साथ क्वेरी करना
अगर Kotlin एक्सटेंशन का इस्तेमाल किया जा रहा है, तो queryProductDetails() एक्सटेंशन फ़ंक्शन को कॉल करके, वन-टाइम प्रॉडक्ट की जानकारी के लिए क्वेरी की जा सकती है.
queryProductDetails(), Kotlin को-रूटीन का इस्तेमाल करता है, ताकि आपको अलग से लिसनर तय न करना पड़े. इसके बजाय, क्वेरी पूरी होने तक फ़ंक्शन सस्पेंड हो जाता है. इसके बाद, नतीजे को प्रोसेस किया जा सकता है:
suspend fun processPurchases() {
val productList = listOf(
QueryProductDetailsParams.Product.newBuilder()
.setProductId("product_id_example")
.setProductType(BillingClient.ProductType.SUBS)
.build()
)
val params = QueryProductDetailsParams.newBuilder()
params.setProductList(productList)
// leverage queryProductDetails Kotlin extension function
val productDetailsResult = withContext(Dispatchers.IO) {
billingClient.queryProductDetails(params.build())
}
// Process the result.
}
कभी-कभी, कुछ डिवाइसों पर ProductDetails और queryProductDetailsAsync() काम नहीं करते. ऐसा आम तौर पर, Google Play services के पुराने वर्शन की वजह से होता है. इस स्थिति में सही तरीके से सहायता पाने के लिए, Play Billing Library 7 पर माइग्रेट करने से जुड़ी गाइड में जाकर, पुराने सिस्टम के साथ काम करने वाली सुविधाओं का इस्तेमाल करने का तरीका जानें.
नतीजे को प्रोसेस करना
Google Play Billing Library, क्वेरी के नतीजों को QueryProductDetailsResult ऑब्जेक्ट में सेव करती है. QueryProductDetailsResult में ProductDetails ऑब्जेक्ट का List शामिल है. इसके बाद, सूची में मौजूद हर ProductDetails ऑब्जेक्ट के लिए अलग-अलग तरीकों का इस्तेमाल किया जा सकता है. इससे, एक बार खरीदे जाने वाले किसी प्रॉडक्ट के बारे में काम की जानकारी देखी जा सकती है. जैसे, उसकी कीमत या ब्यौरा. प्रॉडक्ट के बारे में उपलब्ध जानकारी देखने के लिए, ProductDetails क्लास में मौजूद तरीकों की सूची देखें.
QueryProductDetailsResult में UnfetchedProduct ऑब्जेक्ट का List भी शामिल होता है. इसके बाद, फ़ेच न किए गए हर प्रॉडक्ट के लिए क्वेरी की जा सकती है, ताकि फ़ेच न हो पाने की वजह से जुड़ा स्टेटस कोड मिल सके.
फ़ेच नहीं की गई, उपलब्ध प्रॉडक्ट की जानकारी देखने के लिए, UnfetchedProduct क्लास में तरीकों की सूची देखें.
किसी आइटम को बिक्री के लिए उपलब्ध कराने से पहले, यह देख लें कि उपयोगकर्ता के पास पहले से वह आइटम न हो. अगर उपयोगकर्ता के पास ऐसा आइटम है जिसका इस्तेमाल किया जा सकता है और वह अब भी उसकी आइटम लाइब्रेरी में है, तो उसे आइटम का इस्तेमाल करना होगा. इसके बाद ही, वह उसे फिर से खरीद पाएगा.
सदस्यता ऑफ़र करने से पहले, पुष्टि करें कि उपयोगकर्ता ने पहले से सदस्यता न ली हो. इन बातों का भी ध्यान रखें:
सदस्यताओं के लिए,
queryProductDetailsAsync()तरीके से सदस्यता वाले प्रॉडक्ट की जानकारी मिलती है. साथ ही, हर सदस्यता के लिए, उपयोगकर्ता के लिए उपलब्ध ज़्यादा से ज़्यादा 50 ऑफ़र की जानकारी मिलती है. अगर उपयोगकर्ता, ज़रूरी शर्तें पूरी न करने वाला कोई ऑफ़र खरीदने की कोशिश करता है (उदाहरण के लिए, अगर ऐप्लिकेशन में ज़रूरी शर्तें पूरी करने वाले ऑफ़र की पुरानी सूची दिख रही है), तो Play उसे बताता है कि वह ज़रूरी शर्तें पूरी नहीं करता. इसके बाद, उपयोगकर्ता के पास बुनियादी प्लान खरीदने का विकल्प होता है.वन-टाइम प्रॉडक्ट के लिए,
queryProductDetailsAsync()तरीके से सिर्फ़ वे ऑफ़र दिखते हैं जो उपयोगकर्ता के लिए उपलब्ध हैं. अगर कोई उपयोगकर्ता ऐसे ऑफ़र को खरीदने की कोशिश करता है जिसके लिए वह ज़रूरी शर्तें पूरी नहीं करता है (उदाहरण के लिए, अगर उपयोगकर्ता ने खरीदारी की सीमा पूरी कर ली है), तो Play उसे बताता है कि वह ज़रूरी शर्तें पूरी नहीं करता है. इसके बाद, उपयोगकर्ता के पास खरीदारी के विकल्प वाले ऑफ़र को खरीदने का विकल्प होता है.
खरीदारी का फ़्लो लॉन्च करना
अपने ऐप्लिकेशन से खरीदारी का अनुरोध शुरू करने के लिए, अपने ऐप्लिकेशन के मुख्य थ्रेड से launchBillingFlow()
तरीके को कॉल करें. यह तरीका, BillingFlowParams ऑब्जेक्ट का रेफ़रंस लेता है. इस ऑब्जेक्ट में, queryProductDetailsAsync को कॉल करने से मिला काम का ProductDetails ऑब्जेक्ट होता है. BillingFlowParams ऑब्जेक्ट बनाने के लिए, BillingFlowParams.Builder क्लास का इस्तेमाल करें.
Kotlin
// An activity reference from which the billing flow will be launched. val activity : Activity = ...; val productDetailsParamsList = listOf( BillingFlowParams.ProductDetailsParams.newBuilder() // retrieve a value for productDetails by calling queryProductDetailsAsync() .setProductDetails(productDetails) // Get the offer token: // a. For one-time products, call ProductDetails.getOneTimePurchaseOfferDetailsList() // for a list of offers that are available to the user. // b. For subscriptions, call ProductDetails.subscriptionOfferDetails() // for a list of offers that are available to the user. .setOfferToken(selectedOfferToken) .build() ) val billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build() // Launch the billing flow val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)
Java
// An activity reference from which the billing flow will be launched. Activity activity = ...; ImmutableList<ProductDetailsParams> productDetailsParamsList = ImmutableList.of( ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // Get the offer token: // a. For one-time products, call ProductDetails.getOneTimePurchaseOfferDetailsList() // for a list of offers that are available to the user. // b. For subscriptions, call ProductDetails.subscriptionOfferDetails() // for a list of offers that are available to the user. .setOfferToken(selectedOfferToken) .build() ); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); // Launch the billing flow BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
launchBillingFlow() वाला तरीका, BillingClient.BillingResponseCode में दिए गए कई रिस्पॉन्स कोड में से कोई एक कोड दिखाता है. इस नतीजे को ज़रूर देखें, ताकि यह पुष्टि की जा सके कि खरीदारी की प्रोसेस शुरू करने में कोई गड़बड़ी नहीं हुई है. OK में BillingResponseCode का मतलब है कि लॉन्च सफल रहा.
launchBillingFlow() को कॉल करने पर, सिस्टम Google Play पर खरीदारी की स्क्रीन दिखाता है. पहली इमेज में, सदस्यता खरीदने की स्क्रीन दिखाई गई है:
Google Play, onPurchasesUpdated() को कॉल करता है, ताकि खरीदारी के नतीजे को उस लिसनर तक पहुंचाया जा सके जो PurchasesUpdatedListener इंटरफ़ेस लागू करता है. क्लाइंट को शुरू करते समय, setListener() तरीके का इस्तेमाल करके लिसनर तय किया जाता है.
आपको onPurchasesUpdated() लागू करना होगा, ताकि संभावित रिस्पॉन्स कोड को मैनेज किया जा सके. यहां दिए गए उदाहरण में, onPurchasesUpdated() को बदलने का तरीका बताया गया है:
Kotlin
override fun onPurchasesUpdated(billingResult: BillingResult, purchases: List<Purchase>?) { if (billingResult.responseCode == BillingResponseCode.OK && purchases != null) { for (purchase in purchases) { // Process the purchase as described in the next section. } } else if (billingResult.responseCode == BillingResponseCode.USER_CANCELED) { // Handle an error caused by a user canceling the purchase flow. } else { // Handle any other error codes. } }
Java
@Override void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) { if (billingResult.getResponseCode() == BillingResponseCode.OK && purchases != null) { for (Purchase purchase : purchases) { // Process the purchase as described in the next section. } } else if (billingResult.getResponseCode() == BillingResponseCode.USER_CANCELED) { // Handle an error caused by a user canceling the purchase flow. } else { // Handle any other error codes. } }
खरीदारी पूरी होने पर, Google Play पर खरीदारी पूरी होने की स्क्रीन दिखती है. यह स्क्रीन, इमेज 2 में दिखाई गई स्क्रीन जैसी होती है.
खरीदारी पूरी होने पर, एक परचेज़ टोकन भी जनरेट होता है. यह एक यूनीक आइडेंटिफ़ायर होता है. यह उस उपयोगकर्ता और वन-टाइम प्रॉडक्ट के प्रॉडक्ट आईडी को दिखाता है जिसे उसने खरीदा है. आपके ऐप्लिकेशन, खरीदारी के टोकन को स्थानीय तौर पर सेव कर सकते हैं. हालांकि, हम आपको टोकन को अपने सुरक्षित बैकएंड सर्वर पर भेजने का सुझाव देते हैं. इससे, खरीदारी की पुष्टि की जा सकती है और धोखाधड़ी से बचा जा सकता है. इस प्रोसेस के बारे में ज़्यादा जानकारी खरीदारी का पता लगाना और उसे प्रोसेस करना लेख में दी गई है.
उपयोगकर्ता को लेन-देन की रसीद भी ईमेल की जाती है. इसमें ऑर्डर आईडी या लेन-देन का यूनीक आईडी शामिल होता है. उपयोगकर्ताओं को एक बार किए जाने वाले हर प्रॉडक्ट की खरीदारी के लिए, एक यूनीक ऑर्डर आईडी वाला ईमेल मिलता है. साथ ही, उन्हें सदस्यता की शुरुआती खरीदारी और बार-बार होने वाले अपने-आप रिन्यू होने वाले प्लान के लिए भी ऐसा ईमेल मिलता है. Google Play Console में रिफ़ंड मैनेज करने के लिए, ऑर्डर आईडी का इस्तेमाल किया जा सकता है.
व्यक्तिगत ज़रूरत के हिसाब से तय की गई कीमत की जानकारी देना
अगर आपका ऐप्लिकेशन, यूरोपीय संघ में रहने वाले लोगों के लिए उपलब्ध है, तो launchBillingFlow को कॉल करते समय setIsOfferPersonalized() तरीके का इस्तेमाल करें. इससे लोगों को यह जानकारी दी जा सकेगी कि किसी आइटम की कीमत, फ़ैसले लेने की अपने-आप होने वाली प्रोसेस का इस्तेमाल करके तय की गई है.
आपको अनुच्छेद कंज़्यूमर राइट्स डायरेक्टिव 2011/83/ईयू का 6 (1) (ईए) देखें और पता करें कि किसी आइटम की कीमत को उपयोगकर्ताओं के हिसाब से तय किया जा सकता है या नहीं.
setIsOfferPersonalized(), बूलियन इनपुट लेता है. true होने पर, Play के यूज़र इंटरफ़ेस (यूआई) में जानकारी ज़ाहिर की जाती है. जब false होता है, तब यूज़र इंटरफ़ेस (यूआई) में जानकारी ज़ाहिर नहीं की जाती. डिफ़ॉल्ट वैल्यू false है.
ज़्यादा जानकारी के लिए, उपयोगकर्ता सहायता केंद्र पर जाएं.
यूज़र आइडेंटिफ़ायर अटैच करना
खरीदारी का फ़्लो लॉन्च करते समय, आपका ऐप्लिकेशन obfuscatedAccountId या obfuscatedProfileId का इस्तेमाल करके, खरीदारी करने वाले उपयोगकर्ता के लिए आपके पास मौजूद किसी भी उपयोगकर्ता आइडेंटिफ़ायर को अटैच कर सकता है. उदाहरण के लिए, आइडेंटिफ़ायर, आपके सिस्टम में उपयोगकर्ता के लॉगिन का अस्पष्ट वर्शन हो सकता है. इन पैरामीटर को सेट करने से, Google को धोखाधड़ी का पता लगाने में मदद मिल सकती है. इसके अलावा, इससे यह पक्का करने में मदद मिल सकती है कि खरीदारी का क्रेडिट सही उपयोगकर्ता को मिले. इसके बारे में उपयोगकर्ताओं को एनटाइटलमेंट देना लेख में बताया गया है.
खरीदारी का पता लगाना और उसे प्रोसेस करना
इस सेक्शन में बताई गई खरीदारी का पता लगाने और उसे प्रोसेस करने की सुविधा, सभी तरह की खरीदारी पर लागू होती है. इसमें ऐप्लिकेशन के बाहर की जाने वाली खरीदारी भी शामिल है. जैसे, प्रमोशन रिडीम करना.
आपका ऐप्लिकेशन, नई खरीदारी और पूरी हो चुकी पूरी न हुई खरीदारी का पता इनमें से किसी एक तरीके से लगाता है:
- जब आपके ऐप्लिकेशन के
onPurchasesUpdatedको कॉल किया जाता है (जैसा कि पिछले सेक्शन में बताया गया है) या जब आपका ऐप्लिकेशन, Billing Library के चालू कनेक्शन के साथ चल रहा हो और आपके ऐप्लिकेशन के बाहर कोई खरीदारी की गई हो या कोई लंबित खरीदारी पूरी की गई हो.launchBillingFlowउदाहरण के लिए, परिवार का कोई सदस्य किसी दूसरे डिवाइस पर, मंज़ूरी के लिए लंबित खरीदारी को मंज़ूरी देता है. - जब आपका ऐप्लिकेशन, उपयोगकर्ता की खरीदारी के बारे में क्वेरी करने के लिए queryPurchasesAsync को कॉल करता है.
#1 के लिए, नई या पूरी की गई खरीदारी के लिए onPurchasesUpdated को अपने-आप कॉल किया जाएगा. ऐसा तब तक होगा, जब तक आपका ऐप्लिकेशन चल रहा है और उसमें Google Play Billing Library का कनेक्शन चालू है. अगर आपका ऐप्लिकेशन नहीं चल रहा है या आपके ऐप्लिकेशन में Google Play Billing Library का चालू कनेक्शन नहीं है, तो onPurchasesUpdated को शुरू नहीं किया जाएगा. ध्यान रखें कि जब तक आपका ऐप्लिकेशन फ़ोरग्राउंड में है, तब तक उसे चालू कनेक्शन बनाए रखने की कोशिश करनी चाहिए. इससे, आपके ऐप्लिकेशन को खरीदारी से जुड़े अपडेट समय पर मिल पाएंगे.
दूसरे चरण के लिए, आपको BillingClient.queryPurchasesAsync() को कॉल करना होगा, ताकि यह पक्का किया जा सके कि आपका ऐप्लिकेशन सभी खरीदारी को प्रोसेस करता है. हमारा सुझाव है कि आप ऐसा तब करें, जब आपका ऐप्लिकेशन Google Play Billing Library से कनेक्ट हो जाए. हमारा सुझाव है कि आप ऐसा तब करें, जब आपका ऐप्लिकेशन लॉन्च हो या फ़ोरग्राउंड में आ जाए. इसके बारे में BillingClient को शुरू करना लेख में बताया गया है. इसके लिए, onServiceConnected को कॉल करने पर, queryPurchasesAsync को कॉल करें. इस सुझाव को लागू करना ज़रूरी है, ताकि इन इवेंट और स्थितियों को मैनेज किया जा सके:
- खरीदारी के दौरान नेटवर्क की समस्याएं: कोई उपयोगकर्ता खरीदारी कर सकता है और उसे Google से पुष्टि मिल सकती है. हालांकि, इससे पहले कि उसके डिवाइस और आपके ऐप्लिकेशन को
PurchasesUpdatedListenerके ज़रिए खरीदारी की सूचना मिले, उसके डिवाइस का नेटवर्क कनेक्शन बंद हो जाता है. - एक से ज़्यादा डिवाइस: कोई उपयोगकर्ता किसी डिवाइस पर कोई आइटम खरीद सकता है. इसके बाद, वह डिवाइस बदलने पर भी उस आइटम को देखना चाहेगा.
- ऐप्लिकेशन से बाहर की गई खरीदारी मैनेज करना: कुछ खरीदारी, जैसे कि प्रमोशन रिडीम करना, आपके ऐप्लिकेशन से बाहर की जा सकती है.
- खरीदारी की स्थिति में बदलावों को मैनेज करना: ऐसा हो सकता है कि कोई उपयोगकर्ता, आपका ऐप्लिकेशन बंद होने के दौरान, 'लंबित' स्थिति में मौजूद खरीदारी के लिए पेमेंट पूरा कर ले. ऐसे में, जब वह आपका ऐप्लिकेशन खोलेगा, तो उसे इस बात की पुष्टि मिलनी चाहिए कि खरीदारी पूरी हो गई है.
- निलंबित की गई सदस्यताएं: किसी सदस्यता को सदस्यता के लाइफ़साइकल के दौरान निलंबित किया जा सकता है. BillingClient.queryPurchasesAsync() सिर्फ़ निलंबित की गई सदस्यताएं तब दिखाएगा, जब
QueryPurchasesParams.BuilderपरincludeSuspendedSubscriptionsपैरामीटर सेट किया गया हो. निलंबित की गई सदस्यताएं,PurchasesUpdatedListenerमें नहीं दिखती हैं.
जब आपका ऐप्लिकेशन, नई या पूरी की गई खरीदारी का पता लगा लेता है, तो उसे यह काम करना चाहिए:
- खरीदारी की पुष्टि करें.
- खरीदारी पूरी होने पर, उपयोगकर्ता को कॉन्टेंट का ऐक्सेस देना.
- उपयोगकर्ता को सूचना दें.
- Google को सूचना दें कि आपके ऐप्लिकेशन ने खरीदारी पूरी होने की प्रोसेस कर ली है.
इन चरणों के बारे में यहां दिए गए सेक्शन में विस्तार से बताया गया है. इसके बाद, एक सेक्शन में सभी चरणों के बारे में खास जानकारी दी गई है.
खरीदारी की पुष्टि करना
आपका ऐप्लिकेशन, किसी उपयोगकर्ता को फ़ायदे देने से पहले, हमेशा खरीदारी की वैधता की पुष्टि करे. इसके लिए, एनटाइटलमेंट देने से पहले खरीदारी की पुष्टि करें में दिए गए दिशा-निर्देशों का पालन करें. खरीदारी की पुष्टि करने के बाद ही, आपके ऐप्लिकेशन को खरीदारी की प्रोसेस जारी रखनी चाहिए और उपयोगकर्ता को एनटाइटलमेंट देने चाहिए. इसके बारे में अगले सेक्शन में बताया गया है.
उपयोगकर्ता को एनटाइटलमेंट देना
जब आपका ऐप्लिकेशन किसी खरीदारी की पुष्टि कर लेता है, तब वह उपयोगकर्ता को एनटाइटलमेंट देना जारी रख सकता है. साथ ही, उपयोगकर्ता को इसकी सूचना भी दे सकता है. एनटाइटलमेंट देने से पहले, पुष्टि करें कि आपका ऐप्लिकेशन यह जांच कर रहा हो कि खरीदारी की स्थिति PURCHASED है. अगर खरीदारी की स्थिति 'लंबित है' है, तो आपके ऐप्लिकेशन को उपयोगकर्ता को यह सूचना देनी चाहिए कि एनटाइटलमेंट मिलने से पहले, उसे खरीदारी पूरी करने के लिए कुछ कार्रवाइयां करनी होंगी.
एनटाइटलमेंट सिर्फ़ तब दें, जब खरीदारी की स्थिति PENDING से SUCCESS पर बदल जाए.
ज़्यादा जानकारी के लिए, बाद में पैसे चुकाने की सुविधा से जुड़े लेन-देन मैनेज करना लेख पढ़ें.
अगर आपने खरीदारी से उपयोगकर्ता आइडेंटिफ़ायर जोड़े हैं, जैसा कि उपयोगकर्ता आइडेंटिफ़ायर जोड़ने लेख में बताया गया है, तो आपके पास उन्हें फिर से पाने का विकल्प होता है. साथ ही, उन्हें अपने सिस्टम में सही उपयोगकर्ता को एट्रिब्यूट करने के लिए इस्तेमाल किया जा सकता है. यह तकनीक तब काम आती है, जब आपको खरीदारी का मिलान करना हो. ऐसा तब हो सकता है, जब आपके ऐप्लिकेशन को यह पता न हो कि खरीदारी किस उपयोगकर्ता के लिए की गई है. ध्यान दें, आपके ऐप्लिकेशन के बाहर की गई खरीदारी के लिए, ये आइडेंटिफ़ायर सेट नहीं किए जाएंगे. इस मामले में, आपका ऐप्लिकेशन या तो लॉग इन किए गए उपयोगकर्ता को एनटाइटलमेंट दे सकता है या उपयोगकर्ता को अपनी पसंद का खाता चुनने के लिए प्रॉम्प्ट कर सकता है.
पहले से किए गए ऑर्डर के लिए, रिलीज़ होने के समय तक खरीदारी की स्थिति 'लंबित है' होती है. रिलीज़ होने के समय, पहले से ऑर्डर की गई खरीदारी पूरी हो जाएगी. साथ ही, बिना किसी अतिरिक्त कार्रवाई के, स्थिति बदलकर 'खरीदा गया' हो जाएगी.
उपयोगकर्ता को सूचना देना
उपयोगकर्ता को एनटाइटलमेंट देने के बाद, आपके ऐप्लिकेशन को खरीदारी की पुष्टि करने के लिए एक सूचना दिखानी चाहिए. सूचना मिलने से, उपयोगकर्ता को यह पता चल जाता है कि खरीदारी पूरी हो गई है या नहीं. इससे उपयोगकर्ता को यह भ्रम नहीं होता कि खरीदारी पूरी हुई है या नहीं. ऐसा होने पर, उपयोगकर्ता आपके ऐप्लिकेशन का इस्तेमाल करना बंद कर सकता है, उपयोगकर्ता सहायता टीम से संपर्क कर सकता है या सोशल मीडिया पर इसकी शिकायत कर सकता है. ध्यान दें कि आपका ऐप्लिकेशन, ऐप्लिकेशन के लाइफ़साइकल के दौरान किसी भी समय खरीदारी से जुड़े अपडेट का पता लगा सकता है. उदाहरण के लिए, माता-पिता किसी दूसरे डिवाइस पर खरीदारी के लिए मंज़ूरी देते हैं. ऐसे में, आपका ऐप्लिकेशन उपयोगकर्ता को सही समय पर सूचना देने में देरी कर सकता है. यहां कुछ उदाहरण दिए गए हैं, जिनमें देरी करना सही होगा:
- गेम के ऐक्शन वाले हिस्से या कटसीन के दौरान, मैसेज दिखाने से उपयोगकर्ता का ध्यान भटक सकता है. ऐसे मामले में, कार्रवाई पूरी होने के बाद आपको उपयोगकर्ता को इसकी सूचना देनी होगी.
- गेम के शुरुआती ट्यूटोरियल और उपयोगकर्ता के सेटअप के दौरान. उदाहरण के लिए, ऐसा हो सकता है कि किसी उपयोगकर्ता ने आपका ऐप्लिकेशन इंस्टॉल करने से पहले, ऐप्लिकेशन के बाहर खरीदारी की हो. हमारा सुझाव है कि नए उपयोगकर्ताओं को इनाम मिलने की सूचना, गेम खोलने के तुरंत बाद या उपयोगकर्ता के शुरुआती सेटअप के दौरान दें. अगर आपके ऐप्लिकेशन में, उपयोगकर्ता को एनटाइटलमेंट देने से पहले खाता बनाने या लॉग इन करने की ज़रूरत होती है, तो हमारा सुझाव है कि आप उपयोगकर्ता को बताएं कि खरीदारी का दावा करने के लिए, उसे कौनसे चरण पूरे करने होंगे. यह ज़रूरी है, क्योंकि अगर आपका ऐप्लिकेशन खरीदारी को प्रोसेस नहीं करता है, तो तीन दिनों के बाद खरीदारी का रिफ़ंड कर दिया जाता है.
खरीदारी के बारे में उपयोगकर्ता को सूचना देते समय, Google Play इन तरीकों का सुझाव देता है:
- ऐप्लिकेशन में डायलॉग दिखाएं.
- मैसेज को इन-ऐप्लिकेशन मैसेज बॉक्स में डिलीवर करें. साथ ही, साफ़ तौर पर बताएं कि इन-ऐप्लिकेशन मैसेज बॉक्स में एक नया मैसेज है.
- ओएस की सूचना वाले मैसेज का इस्तेमाल करें.
सूचना में, उपयोगकर्ता को मिले फ़ायदे के बारे में बताया जाना चाहिए. उदाहरण के लिए, "आपने 100 गोल्ड कॉइन खरीदे!". इसके अलावा, अगर खरीदारी Play Pass जैसे किसी प्रोग्राम के फ़ायदे की वजह से की गई है, तो आपका ऐप्लिकेशन उपयोगकर्ता को इसकी जानकारी देता है. उदाहरण के लिए, "आइटम मिल गए! आपको Play Pass के साथ 100 Gems मिले हैं. जारी रखें.". हर प्रोग्राम में, उपयोगकर्ताओं को फ़ायदे बताने के लिए सुझाए गए टेक्स्ट के बारे में दिशा-निर्देश दिए जा सकते हैं.
Google को सूचना दें कि खरीदारी प्रोसेस हो गई है
जब आपका ऐप्लिकेशन, उपयोगकर्ता को एनटाइटलमेंट दे देता है और उसे लेन-देन के पूरा होने की सूचना दे देता है, तब उसे Google को यह सूचना देनी होती है कि खरीदारी की प्रोसेस पूरी हो गई है. इसके लिए, खरीदारी को स्वीकार करना ज़रूरी है. साथ ही, इसे तीन दिनों के अंदर करना होगा, ताकि खरीदारी का रिफ़ंड अपने-आप प्रोसेस न हो और एनटाइटलमेंट वापस न लिया जाए. अलग-अलग तरह की खरीदारी की पुष्टि करने की प्रोसेस के बारे में यहां बताया गया है.
इस्तेमाल किए जाने वाले प्रॉडक्ट
अगर आपके ऐप्लिकेशन में सुरक्षित बैकएंड है, तो हमारा सुझाव है कि आप इस्तेमाल की जा सकने वाली चीज़ों के लिए, Purchases.products:consume का इस्तेमाल करें, ताकि खरीदारी को भरोसेमंद तरीके से इस्तेमाल किया जा सके. पक्का करें कि खरीदारी पहले ही इस्तेमाल न की गई हो. इसके लिए, Purchases.products:get को कॉल करने के नतीजे से consumptionState की जांच करें. अगर आपका ऐप्लिकेशन सिर्फ़ क्लाइंट-साइड पर काम करता है और इसमें बैकएंड नहीं है, तो Google Play Billing Library से consumeAsync() का इस्तेमाल करें. इन दोनों तरीकों से, पुष्टि करने की ज़रूरी शर्त पूरी होती है. साथ ही, यह पता चलता है कि आपके ऐप्लिकेशन ने उपयोगकर्ता को एनटाइटलमेंट दिया है.
इन तरीकों से, आपका ऐप्लिकेशन इनपुट किए गए परचेज़ टोकन से जुड़े वन-टाइम प्रॉडक्ट को फिर से खरीदने के लिए उपलब्ध करा सकता है. consumeAsync() के साथ, आपको ऐसा ऑब्जेक्ट भी पास करना होगा जो ConsumeResponseListener इंटरफ़ेस को लागू करता है. यह ऑब्जेक्ट, खपत की कार्रवाई के नतीजे को मैनेज करता है. ऑपरेशन पूरा होने पर, Google Play Billing Library onConsumeResponse() तरीके को कॉल करती है. आपके पास इसे बदलने का विकल्प होता है.
यहां दिए गए उदाहरण में, Google Play Billing Library का इस्तेमाल करके किसी प्रॉडक्ट को इस्तेमाल करने का तरीका बताया गया है. इसके लिए, खरीदारी से जुड़े टोकन का इस्तेमाल किया गया है:
Kotlin
val consumeParams = ConsumeParams.newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build() val consumeResult = withContext(Dispatchers.IO) { client.consumePurchase(consumeParams) }
Java
ConsumeParams consumeParams = ConsumeParams.newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build(); ConsumeResponseListener listener = new ConsumeResponseListener() { @Override public void onConsumeResponse(BillingResult billingResult, String purchaseToken) { if (billingResult.getResponseCode() == BillingResponseCode.OK) { // Handle the success of the consume operation. } } }; billingClient.consumeAsync(consumeParams, listener);
ऐसे प्रॉडक्ट जिनका इस्तेमाल बार-बार किया जा सकता है
अगर आपके ऐप्लिकेशन का बैकएंड सुरक्षित है, तो हमारा सुझाव है कि न मिटाई जा सकने वाली खरीदारी की पुष्टि करने के लिए, Purchases.products:acknowledge का इस्तेमाल करें. इससे खरीदारी की पुष्टि भरोसेमंद तरीके से की जा सकेगी. पक्का करें कि खरीदारी को पहले स्वीकार न किया गया हो. इसके लिए, Purchases.products:get को कॉल करने के नतीजे में acknowledgementState देखें.
अगर आपका ऐप्लिकेशन सिर्फ़ क्लाइंट है, तो अपने ऐप्लिकेशन में Google Play Billing Library से BillingClient.acknowledgePurchase() का इस्तेमाल करें. खरीदारी की पुष्टि करने से पहले, आपके ऐप्लिकेशन को यह जांच करनी चाहिए कि क्या इसकी पुष्टि पहले ही की जा चुकी है. इसके लिए, Google Play Billing Library में isAcknowledged() तरीके का इस्तेमाल करें.
यहां दिए गए उदाहरण में, Google Play Billing Library का इस्तेमाल करके, खरीदारी की पुष्टि करने का तरीका बताया गया है:
Kotlin
val client: BillingClient = ... val acknowledgePurchaseResponseListener: AcknowledgePurchaseResponseListener = ... val acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder() .setPurchaseToken(purchase.purchaseToken) val ackPurchaseResult = withContext(Dispatchers.IO) { client.acknowledgePurchase(acknowledgePurchaseParams.build()) }
Java
BillingClient client = ... AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener = ... AcknowledgePurchaseParams acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build(); client.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener);
सदस्यताएं
सदस्यताओं को, बिना इस्तेमाल की गई चीज़ों की तरह ही मैनेज किया जाता है. अगर हो सके, तो Google Play Developer API से Purchases.subscriptions.acknowledge का इस्तेमाल करें. इससे आपको अपने सुरक्षित बैकएंड से खरीदारी स्वीकार करने में मदद मिलेगी. पुष्टि करें कि खरीदारी को पहले स्वीकार नहीं किया गया है. इसके लिए, Purchases.subscriptions:get से खरीदारी के संसाधन में acknowledgementState देखें. इसके अलावा, isAcknowledged() की जांच करने के बाद, Google Play Billing Library से BillingClient.acknowledgePurchase() का इस्तेमाल करके, सदस्यता की पुष्टि की जा सकती है. सदस्यता की सभी शुरुआती खरीदारी को स्वीकार करना ज़रूरी है. सदस्यता रिन्यू करने की सूचना देने की ज़रूरत नहीं है. सदस्यताओं की पुष्टि कब करनी होती है, इस बारे में ज़्यादा जानने के लिए, सदस्यताएं बेचना विषय देखें.
रीकैप
यहां दिए गए कोड स्निपेट में, इन चरणों की खास जानकारी दी गई है.
Kotlin
fun handlePurchase(Purchase purchase) { // Purchase retrieved from BillingClient#queryPurchasesAsync or your // onPurchasesUpdated. Purchase purchase = ...; // Step 1: Send the purchase to your secure backend to verify the purchase // following // https://developer.android.com/google/play/billing/security#verify . // Step 2: Update your entitlement storage with the purchase. If purchase is // in PENDING state then ensure the entitlement is marked as pending and the // user does not receive benefits yet. It is recommended that this step is // done on your secure backend and can combine in the API call to your // backend in step 1. // Step 3: Notify the user using appropriate messaging (delaying // notification if needed as discussed above). // Step 4: Notify Google the purchase was processed using the steps // discussed in the processing purchases section. }
Java
void handlePurchase(Purchase purchase) { // Purchase retrieved from BillingClient#queryPurchasesAsync or your // onPurchasesUpdated. Purchase purchase = ...; // Step 1: Send the purchase to your secure backend to verify the purchase // following // https://developer.android.com/google/play/billing/security#verify // Step 2: Update your entitlement storage with the purchase. If purchase is // in PENDING state then ensure the entitlement is marked as pending and the // user does not receive benefits yet. It is recommended that this step is // done on your secure backend and can combine in the API call to your // backend in step 1. // Step 3: Notify the user using appropriate messaging (delaying // notification if needed as discussed above). // Step 4: Notify Google the purchase was processed using the steps // discussed in the processing purchases section. }
यह पुष्टि करने के लिए कि आपके ऐप्लिकेशन में इन चरणों को सही तरीके से लागू किया गया है, जांच करने से जुड़ी गाइड पढ़ें.
ऐसे लेन-देन मैनेज करना जिन्हें मंज़ूरी नहीं मिली है
Google Play, लंबित लेन-देन की सुविधा देता है. ये ऐसे लेन-देन होते हैं जिनमें किसी व्यक्ति के खरीदारी शुरू करने और खरीदारी के लिए पेमेंट के तरीके को प्रोसेस करने के बीच एक या उससे ज़्यादा अतिरिक्त चरणों की ज़रूरत होती है. जब तक Google आपको यह सूचना नहीं देता कि उपयोगकर्ता के पेमेंट के तरीके से शुल्क ले लिया गया है, तब तक आपका ऐप्लिकेशन इन खरीदारी के लिए एनटाइटलमेंट नहीं देगा.
उदाहरण के लिए, कोई व्यक्ति किसी स्टोर में जाकर लेन-देन शुरू कर सकता है. इसके बाद, वह स्टोर में जाकर नकद पेमेंट कर सकता है. उपयोगकर्ता को सूचना और ईमेल, दोनों के ज़रिए कोड मिलता है. स्टोर पर पहुंचने के बाद, उपयोगकर्ता कैशियर को कोड दिखाकर उसे रिडीम कर सकता है और नकद पेमेंट कर सकता है. इसके बाद, Google आपको और उस व्यक्ति को सूचना देता है कि पेमेंट मिल गया है. इसके बाद, आपका ऐप्लिकेशन उपयोगकर्ता को एनटाइटलमेंट दे सकता है.
अपने ऐप्लिकेशन के लिए, पेमेंट न करने की वजह से लगाए गए शुल्क को चुकाने की सुविधा चालू करने के लिए, enablePendingPurchases() को कॉल करें. ऐसा BillingClient को शुरू करने के दौरान किया जाता है. आपके ऐप्लिकेशन में, वन-टाइम प्रॉडक्ट के लिए, पेमेंट न करने की वजह से लगाए गए शुल्क को चुकाने की सुविधा चालू होनी चाहिए. साथ ही, यह सुविधा काम करनी चाहिए. सहायता जोड़ने से पहले, पक्का करें कि आपको लंबित लेन-देन के लिए खरीदारी के लाइफ़साइकल के बारे में पता हो.
जब आपका ऐप्लिकेशन, PurchasesUpdatedListener या queryPurchasesAsync को कॉल करने के ज़रिए नई खरीदारी का अनुरोध पाता है, तब getPurchaseState() तरीके का इस्तेमाल करके यह पता लगाएं कि खरीदारी की स्थिति PURCHASED है या PENDING. आपको एनटाइटलमेंट सिर्फ़ तब देना चाहिए, जब स्थिति PURCHASED हो.
अगर आपका ऐप्लिकेशन चल रहा है और उपयोगकर्ता के खरीदारी पूरी करने के दौरान, Play Billing Library से आपका कनेक्शन चालू है, तो PurchasesUpdatedListener को फिर से कॉल किया जाता है. साथ ही, PurchaseState अब PURCHASED हो जाता है. इस समय, आपका ऐप्लिकेशन खरीदारी का पता लगाने और उसे प्रोसेस करने के स्टैंडर्ड तरीके का इस्तेमाल करके, खरीदारी को प्रोसेस कर सकता है. आपके ऐप्लिकेशन को अपने ऐप्लिकेशन के onResume() तरीके में queryPurchasesAsync() को भी कॉल करना चाहिए, ताकि उन खरीदारी को मैनेज किया जा सके जो ऐप्लिकेशन के बंद होने के दौरान PURCHASED स्थिति में बदल गई हैं.
जब खरीदारी की स्थिति PENDING से PURCHASED में बदलती है, तब आपके real_time_developer_notifications क्लाइंट को ONE_TIME_PRODUCT_PURCHASED या SUBSCRIPTION_PURCHASED सूचना मिलती है. खरीदारी रद्द होने पर, आपको ONE_TIME_PRODUCT_CANCELED या SUBSCRIPTION_PENDING_PURCHASE_CANCELED सूचना मिलेगी. ऐसा तब हो सकता है, जब आपका ग्राहक तय समयसीमा में पेमेंट पूरा न करे. ध्यान दें कि किसी खरीदारी की मौजूदा स्थिति देखने के लिए, Google Play Developer API का इस्तेमाल हमेशा किया जा सकता है.
एक से ज़्यादा प्रॉडक्ट खरीदने की सुविधा मैनेज करना
यह सुविधा, Google Play Billing Library के 4.0 और इसके बाद के वर्शन में उपलब्ध है. Google Play पर, खरीदार एक लेन-देन में एक से ज़्यादा वन-टाइम प्रॉडक्ट खरीद सकते हैं. इसके लिए, उन्हें खरीदारी कार्ट में जाकर प्रॉडक्ट की संख्या तय करनी होगी. आपके ऐप्लिकेशन को एक से ज़्यादा खरीदारी को मैनेज करना होगा. साथ ही, खरीदारी की तय की गई संख्या के आधार पर एनटाइटलमेंट देना होगा.
एक से ज़्यादा आइटम खरीदने की सुविधा देने के लिए, आपके ऐप्लिकेशन के प्रोविज़निंग लॉजिक को आइटम की संख्या की जांच करनी होगी. इनमें से किसी एक एपीआई से quantity फ़ील्ड को ऐक्सेस किया जा सकता है:
- Google Play Billing Library से
getQuantity(). - Google Play Developer API से
Purchases.products.quantity
एक से ज़्यादा बार खरीदारी करने की सुविधा को मैनेज करने के लिए लॉजिक जोड़ने के बाद, आपको Google Play Developer Console में वन-टाइम प्रॉडक्ट मैनेजमेंट पेज पर जाकर, उस प्रॉडक्ट के लिए एक से ज़्यादा बार खरीदारी करने की सुविधा चालू करनी होगी.
उपयोगकर्ता के बिलिंग कॉन्फ़िगरेशन के बारे में क्वेरी करना
getBillingConfigAsync() से पता चलता है कि उपयोगकर्ता Google Play का इस्तेमाल किस देश में करता है.
खाता बनाने के बाद
BillingClient, उपयोगकर्ता के बिलिंग कॉन्फ़िगरेशन के बारे में क्वेरी की जा सकती है. नीचे दिए गए कोड स्निपेट में, getBillingConfigAsync() को कॉल करने का तरीका बताया गया है. BillingConfigResponseListener को लागू करके, जवाब को मैनेज करें. इस लिसनर को, आपके ऐप्लिकेशन से शुरू की गई सभी बिलिंग कॉन्फ़िगरेशन क्वेरी के अपडेट मिलते हैं.
अगर BillingResult में कोई गड़बड़ी नहीं है, तो BillingConfig ऑब्जेक्ट में मौजूद countryCode फ़ील्ड की जांच करें. इससे आपको उपयोगकर्ता के Play खाते में सेट किए गए देश की जानकारी मिलेगी.
Kotlin
// Use the default GetBillingConfigParams. val getBillingConfigParams = GetBillingConfigParams.newBuilder().build() billingClient.getBillingConfigAsync(getBillingConfigParams, object : BillingConfigResponseListener { override fun onBillingConfigResponse( billingResult: BillingResult, billingConfig: BillingConfig? ) { if (billingResult.responseCode == BillingResponseCode.OK && billingConfig != null) { val countryCode = billingConfig.countryCode ... } else { // TODO: Handle errors } } })
Java
// Use the default GetBillingConfigParams. GetBillingConfigParams getBillingConfigParams = GetBillingConfigParams.newBuilder().build(); billingClient.getBillingConfigAsync(getBillingConfigParams, new BillingConfigResponseListener() { public void onBillingConfigResponse( BillingResult billingResult, BillingConfig billingConfig) { if (billingResult.getResponseCode() == BillingResponseCode.OK && billingConfig != null) { String countryCode = billingConfig.getCountryCode(); ... } else { // TODO: Handle errors } } });
Google Play Games की होम स्क्रीन पर, कार्ट में जोड़े गए आइटम के लिए रिमाइंडर (डिफ़ॉल्ट रूप से चालू होता है)
गेम डेवलपर, एक बार खरीदे जाने वाले प्रॉडक्ट से कमाई करते हैं. ऐसे में, Google Play Console में चालू स्टॉक-कीपिंग यूनिट (एसकेयू) को आपके ऐप्लिकेशन के बाहर बेचने का एक तरीका है. यह तरीका, खरीदारी के बिना कार्ट में सामान छोड़ने का रिमाइंडर देने वाली सुविधा है. इस सुविधा की मदद से, लोगों को Google Play Store ब्राउज़ करते समय, पहले छोड़ी गई खरीदारी को पूरा करने के लिए कहा जाता है. ये खरीदारी, आपके ऐप्लिकेशन के बाहर होती हैं. ये Google Play Store में Google Play Games के होम पेज से की जाती हैं.
यह सुविधा डिफ़ॉल्ट रूप से चालू रहती है. इससे लोगों को यह पता चलता है कि उन्होंने कहां तक काम किया था. साथ ही, डेवलपर को बिक्री बढ़ाने में मदद मिलती है. हालांकि, खरीदारी के बिना कार्ट में सामान छोड़ने का रिमाइंडर भेजने वाली सुविधा से ऑप्ट-आउट करने का फ़ॉर्म सबमिट करके, अपने ऐप्लिकेशन को इस सुविधा से ऑप्ट आउट किया जा सकता है. Google Play Console में एसकेयू मैनेज करने के सबसे सही तरीकों के बारे में जानने के लिए, ऐप्लिकेशन में खरीदने के लिए उपलब्ध प्रॉडक्ट बनाना लेख पढ़ें.
यहां दी गई इमेज में, Google Play Store पर कार्ट में जोड़े गए सामान को खरीदने के लिए रिमाइंडर दिखाया गया है: