इस दस्तावेज़ में, प्रॉडक्ट बेचने के लिए Google Play Billing Library को अपने ऐप्लिकेशन में इंटिग्रेट करने का तरीका बताया गया है.
खरीदारी की लाइफ़साइकल
यहां एक बार खरीदने या सदस्यता के लिए, खरीदारी का फ़्लो दिया गया है.
- उपयोगकर्ता को दिखाएं कि वह क्या खरीद सकता है.
- खरीदारी का फ़्लो लॉन्च करें, ताकि उपयोगकर्ता खरीदारी को स्वीकार कर सके.
- अपने सर्वर पर खरीदारी की पुष्टि करें.
- उपयोगकर्ता को कॉन्टेंट उपलब्ध कराना.
- कॉन्टेंट की डिलीवरी की पुष्टि करें. इस्तेमाल किए जा सकने वाले प्रॉडक्ट के लिए, खरीदारी को इस्तेमाल करें, ताकि उपयोगकर्ता आइटम को फिर से खरीद सके.
सदस्यताएं तब तक अपने-आप रिन्यू होती रहती हैं, जब तक उन्हें रद्द नहीं किया जाता. सदस्यता की ये स्थितियां हो सकती हैं:
- चालू है: उपयोगकर्ता की स्थिति अच्छी है और उसके पास सदस्यता का ऐक्सेस है.
- रद्द की गई: उपयोगकर्ता ने सदस्यता रद्द कर दी है, लेकिन उसके पास सदस्यता खत्म होने की तारीख तक इसका ऐक्सेस रहेगा.
- ग्रेस पीरियड में: उपयोगकर्ता को पेमेंट करने में समस्या आई, लेकिन उसके पास अब भी ऐक्सेस है. इस दौरान, Google पेमेंट के तरीके को फिर से आज़मा रहा है.
- रोक दी गई है: उपयोगकर्ता को पेमेंट करने में समस्या आई और अब उसके पास सदस्यता का ऐक्सेस नहीं है. इस दौरान, Google पेमेंट के तरीके को फिर से आज़मा रहा है.
- रोकी गई: उपयोगकर्ता ने अपना ऐक्सेस रोक दिया है. जब तक वह ऐक्सेस को फिर से चालू नहीं करता, तब तक उसके पास ऐक्सेस नहीं होगा.
- Expired: उपयोगकर्ता ने सदस्यता रद्द कर दी है और उसके पास सदस्यता का ऐक्सेस नहीं है. सदस्यता खत्म होने पर, उपयोगकर्ता को चर्न माना जाता है.
Google Play से कनेक्शन शुरू करना
Google Play के बिलिंग सिस्टम को इंटिग्रेट करने के लिए, सबसे पहले अपने ऐप्लिकेशन में Google Play Billing Library जोड़ें और कनेक्शन शुरू करें.
Google Play Billing Library डिपेंडेंसी जोड़ना
अपने ऐप्लिकेशन की build.gradle फ़ाइल में, Google Play Billing Library की डिपेंडेंसी जोड़ें. इसके लिए, यह तरीका अपनाएं:
Groovy
dependencies { def billing_version = "9.1.0" implementation "com.android.billingclient:billing:$billing_version" }
Kotlin
dependencies { val billing_version = "9.1.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 = "9.1.0" implementation "com.android.billingclient:billing-ktx:$billing_version" }
Kotlin
dependencies { val billing_version = "9.1.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. // It's a good practice to query products after the connection is established. queryProductDetails(); } } @Override public void onBillingServiceDisconnected() { // Try to restart the connection on the next request to // Google Play by calling the startConnection() method. // This is automatically handled by the library when you call a method that requires a connection. } });
कनेक्शन अपने-आप फिर से स्थापित होना
BillingClient.Builder के वर्शन 8.0.0 में enableAutoServiceReconnection() तरीके को शामिल किया गया है. इसकी मदद से, Play Billing Library अब सेवा के डिसकनेक्ट होने पर एपीआई कॉल किए जाने पर, सेवा के कनेक्शन को अपने-आप फिर से चालू कर सकता है. इससे SERVICE_DISCONNECTED रिस्पॉन्स में कमी आ सकती है. ऐसा इसलिए, क्योंकि एपीआई कॉल करने से पहले, फिर से कनेक्ट करने की प्रोसेस को अंदरूनी तौर पर मैनेज किया जाता है.
अपने-आप फिर से कनेक्ट होने की सुविधा चालू करने का तरीका
BillingClient इंस्टेंस बनाते समय, BillingClient.Builder में enableAutoServiceReconnection() तरीके का इस्तेमाल करें, ताकि अपने-आप फिर से कनेक्ट होने की सुविधा चालू हो सके.
Kotlin
val billingClient = BillingClient.newBuilder(context) .setListener(listener) .enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build()) .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 से कनेक्शन सेट अप करने के बाद, उपलब्ध प्रॉडक्ट के बारे में क्वेरी की जा सकती है और उन्हें उपयोगकर्ताओं को दिखाया जा सकता है.
अपने उपयोगकर्ताओं को प्रॉडक्ट दिखाने से पहले, प्रॉडक्ट की जानकारी के लिए क्वेरी करना एक ज़रूरी कदम है. इससे प्रॉडक्ट की स्थानीय जानकारी मिलती है. सदस्यताओं के लिए, पुष्टि करें कि आपके प्रॉडक्ट का डिसप्ले Google Play की सभी नीतियों का पालन करता हो.
वन-टाइम प्रॉडक्ट की जानकारी के लिए क्वेरी करने के लिए, queryProductDetailsAsync तरीके को कॉल करें. यह तरीका, आपके वन-टाइम प्रॉडक्ट के कॉन्फ़िगरेशन के आधार पर कई ऑफ़र दिखा सकता है. ज़्यादा जानकारी के लिए, वन-टाइम प्रॉडक्ट के लिए, खरीदारी के कई विकल्प और ऑफ़र लेख पढ़ें.
एसिंक्रोनस ऑपरेशन के नतीजे को मैनेज करने के लिए, आपको एक लिसनर भी तय करना होगा, जो ProductDetailsResponseListener इंटरफ़ेस को लागू करता हो.
इसके बाद, onProductDetailsResponse को बदला जा सकता है. इससे क्वेरी पूरी होने पर, लिसनर को सूचना मिलती है. इसके बारे में यहां दिए गए उदाहरण में बताया गया है:
Kotlin
val queryProductDetailsParams = QueryProductDetailsParams.newBuilder() .setProductList( listOf( Product.newBuilder() .setProductId("product_id_example") .setProductType(ProductType.SUBS) .build() ) ) .build() billingClient.queryProductDetailsAsync(queryProductDetailsParams) { billingResult, queryProductDetailsResult -> if (billingResult.responseCode == BillingResponseCode.OK) { for (productDetails in queryProductDetailsResult.productDetailsList) { // Process successfully retrieved product details here. } for (unfetchedProduct in queryProductDetailsResult.unfetchedProductList) { // 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 successfully 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 के लिए क्वेरी की जा सकती है, ताकि फ़ेच न हो पाने की वजह के हिसाब से स्टेटस कोड मिल सके.
उपलब्ध प्रॉडक्ट की जानकारी देखने के लिए, UnfetchedProduct क्लास में मौजूद तरीकों की सूची देखें.
किसी आइटम को बिक्री के लिए उपलब्ध कराने से पहले, यह देख लें कि उपयोगकर्ता के पास पहले से वह आइटम मौजूद न हो. अगर उपयोगकर्ता के पास कोई ऐसा आइटम है जिसे इस्तेमाल किया जा सकता है और वह अब भी उसकी आइटम लाइब्रेरी में मौजूद है, तो उसे फिर से खरीदने से पहले, उपयोगकर्ता को उस आइटम का इस्तेमाल करना होगा.
सदस्यता का ऑफ़र देने से पहले, पुष्टि करें कि उपयोगकर्ता ने पहले से सदस्यता न ली हो. इन बातों का भी ध्यान रखें:
सदस्यताओं के लिए,
queryProductDetailsAsync()तरीका, शुल्क लेकर सदस्यता देने वाले प्रॉडक्ट की जानकारी दिखाता है. साथ ही, हर सदस्यता के लिए, उपयोगकर्ता को ज़्यादा से ज़्यादा 50 ऑफ़र दिखाता है. अगर उपयोगकर्ता किसी ऐसे ऑफ़र को खरीदने की कोशिश करता है जो ज़रूरी शर्तें पूरी नहीं करता है, तो Google Play उसे इसकी जानकारी देता है. उदाहरण के लिए, अगर ऐप्लिकेशन में ज़रूरी शर्तें पूरी करने वाले ऑफ़र की पुरानी सूची दिख रही है, तो Google Play उपयोगकर्ता को बताता है कि वह ज़रूरी शर्तें पूरी नहीं करता है. इसके बाद, उपयोगकर्ता बुनियादी प्लान खरीद सकता है.वन-टाइम प्रॉडक्ट के लिए,
queryProductDetailsAsync()तरीका सिर्फ़ उन ऑफ़र को दिखाता है जो उपयोगकर्ता के लिए उपलब्ध हैं. अगर कोई उपयोगकर्ता किसी ऐसे ऑफ़र को खरीदने की कोशिश करता है जिसके लिए वह ज़रूरी शर्तें पूरी नहीं करता है, तो Google Play उसे इसकी जानकारी देता है. उदाहरण के लिए, अगर उपयोगकर्ता ने खरीदारी की तय सीमा पूरी कर ली है, तो Google 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.getSubscriptionOfferDetails() // 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<BillingFlowParams.ProductDetailsParams> productDetailsParamsList = ImmutableList.of( 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.getSubscriptionOfferDetails() // 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 होने पर, Google Play के यूज़र इंटरफ़ेस (यूआई) में, जानकारी ज़ाहिर करने वाला मैसेज शामिल होता है. false होने पर, यूज़र इंटरफ़ेस (यूआई) में जानकारी नहीं दिखती. डिफ़ॉल्ट वैल्यू false है.
ज़्यादा जानकारी के लिए, उपभोक्ता सहायता केंद्र पर जाएं.
यूज़र आइडेंटिफ़ायर अटैच करना
खरीदारी का फ़्लो लॉन्च करने पर, आपका ऐप्लिकेशन obfuscatedAccountId या obfuscatedProfileId का इस्तेमाल करके, खरीदारी करने वाले उपयोगकर्ता के लिए मौजूद किसी भी यूज़र आइडेंटिफ़ायर को अटैच कर सकता है. उदाहरण के लिए, आपके सिस्टम में उपयोगकर्ता के लॉगिन का छिपा हुआ वर्शन, आइडेंटिफ़ायर हो सकता है. इन पैरामीटर को सेट करने से, Google को धोखाधड़ी का पता लगाने में मदद मिल सकती है. इसके अलावा, इससे आपको यह पक्का करने में मदद मिल सकती है कि खरीदारी का श्रेय सही उपयोगकर्ता को दिया जाए. इस बारे में, उपयोगकर्ताओं को एनटाइटलमेंट देना लेख में बताया गया है.
खरीदारी का पता लगाना और उसे प्रोसेस करना
इस सेक्शन में बताई गई खरीदारी का पता लगाने और उसे प्रोसेस करने की सुविधा, सभी तरह की खरीदारी पर लागू होती है. इसमें ऐप्लिकेशन के बाहर जाकर की जाने वाली खरीदारी भी शामिल है. जैसे, प्रमोशन रिडीम करना.
आपका ऐप्लिकेशन, नई खरीदारी और पूरी हो चुकी अधूरी खरीदारी का पता इनमें से किसी एक तरीके से लगाता है:
- जब आपके ऐप्लिकेशन के
launchBillingFlowको कॉल करने की वजह से,onPurchasesUpdatedको कॉल किया जाता है (जैसा कि पिछले सेक्शन में बताया गया है) या अगर आपके ऐप्लिकेशन के बाहर कोई खरीदारी की जाती है या कोई अधूरी खरीदारी पूरी की जाती है, तो आपका ऐप्लिकेशन, Play Billing Library के चालू कनेक्शन के साथ काम करता है. उदाहरण के लिए, फ़ैमिली ग्रुप का कोई सदस्य किसी दूसरे डिवाइस पर, अधूरी खरीदारी को मंज़ूरी देता है. - जब आपका ऐप्लिकेशन, उपयोगकर्ता की खरीदारी के बारे में क्वेरी करने के लिए, 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(), निलंबित की गई सदस्यताओं की जानकारी सिर्फ़ तब दिखाएगा, जब
includeSuspendedSubscriptionsपैरामीटर कोQueryPurchasesParams.Builderपर सेट किया गया हो. निलंबित की गई सदस्यताएं,PurchasesUpdatedListenerमें नहीं दिखती हैं.
जब आपके ऐप्लिकेशन को किसी नई या पूरी हो चुकी खरीदारी का पता चलता है, तो उसे:
- खरीदारी की पुष्टि करें.
- खरीदारी पूरी होने पर, उपयोगकर्ता को कॉन्टेंट का ऐक्सेस दें.
- उपयोगकर्ता को सूचना दें.
- Google को सूचना दें कि आपके ऐप्लिकेशन ने खरीदारी की प्रोसेस पूरी कर ली है.
इन चरणों के बारे में, यहां दिए गए सेक्शन में विस्तार से बताया गया है. इसके बाद, सभी चरणों को फिर से दोहराने के लिए एक सेक्शन दिया गया है.
खरीदारी की पुष्टि करना
उपयोगकर्ता को फ़ायदे देने से पहले, आपके ऐप्लिकेशन को हमेशा यह पुष्टि करनी चाहिए कि खरीदारी मान्य है या नहीं. इसके लिए, एनटाइटलमेंट देने से पहले खरीदारी की पुष्टि करना में दिए गए दिशा-निर्देशों का पालन करें. खरीदारी की पुष्टि करने के बाद ही, आपके ऐप्लिकेशन को खरीदारी की प्रोसेस जारी रखनी चाहिए और उपयोगकर्ता को एनटाइटलमेंट देने चाहिए. इसके बारे में अगले सेक्शन में बताया गया है. अगर कोई खरीदारी, पुष्टि करने, ज़रूरी शर्तें पूरी करने या गलत इस्तेमाल की जांच में फ़ेल हो जाती है, तो अस्वीकार की गई या पूरी नहीं की गई खरीदारी को मैनेज करना लेख पढ़ें.
उपयोगकर्ता को ऐक्सेस देना
जब आपका ऐप्लिकेशन किसी खरीदारी की पुष्टि कर लेता है, तो वह उपयोगकर्ता को एनटाइटलमेंट देना जारी रख सकता है और उपयोगकर्ता को इसकी सूचना दे सकता है. एंटाइटलमेंट देने से पहले, पुष्टि करें कि आपका ऐप्लिकेशन यह जांच कर रहा है कि खरीदारी की स्थिति PURCHASED है. अगर खरीदारी की स्थिति PENDING है, तो आपके ऐप्लिकेशन को उपयोगकर्ता को यह सूचना देनी चाहिए कि उसे खरीदारी पूरी करने के लिए, अब भी कुछ कार्रवाइयां करनी होंगी. इसके बाद ही, उसे खरीदारी का ऐक्सेस दिया जाएगा.
एनटाइटलमेंट सिर्फ़ तब दें, जब खरीदारी की स्थिति 'मंज़ूरी बाकी है' से 'खरीदारी पूरी हो गई' में बदल जाए.
ज़्यादा जानकारी के लिए, पेंडिंग लेन-देन मैनेज करना लेख पढ़ें.
अगर आपने यूज़र आइडेंटिफ़ायर अटैच करने के बारे में बताए गए तरीके के मुताबिक, खरीदारी के साथ यूज़र आइडेंटिफ़ायर अटैच किए हैं, तो उन्हें वापस पाया जा सकता है. साथ ही, अपने सिस्टम में सही उपयोगकर्ता को एट्रिब्यूट करने के लिए उनका इस्तेमाल किया जा सकता है. यह तकनीक तब काम आती है, जब खरीदारी का मिलान किया जा रहा हो. ऐसा तब होता है, जब आपके ऐप्लिकेशन को यह जानकारी न हो कि खरीदारी किस उपयोगकर्ता के लिए की गई है. गलत इस्तेमाल से बचने के लिए, Google Play का सुझाव है कि एनटाइटेलमेंट देने से पहले, अपने सुरक्षित बैकएंड पर इन आइडेंटिफ़ायर की पुष्टि करें. ज़्यादा जानकारी के लिए, एनटाइटलमेंट देने से पहले खरीदारी की पुष्टि करना लेख पढ़ें. ध्यान दें कि आपके ऐप्लिकेशन के बाहर की गई खरीदारी के लिए, ये आइडेंटिफ़ायर सेट नहीं किए जाएंगे. ऐसे मामले में, आपका ऐप्लिकेशन लॉग इन किए हुए उपयोगकर्ता को एनटाइटलमेंट दे सकता है या उपयोगकर्ता को पसंदीदा खाता चुनने के लिए कह सकता है.
पहले से ऑर्डर करने के लिए, प्रॉडक्ट के रिलीज़ होने से पहले खरीदारी की स्थिति PENDING होती है. पहले से ऑर्डर करने की सुविधा के लिए रिलीज़ होने के समय, पहले से किया गया ऑर्डर पूरा हो जाएगा. इसके बाद, बिना किसी कार्रवाई के, स्थिति बदलकर 'खरीदा गया' हो जाएगी.
उपयोगकर्ता को सूचना देना
उपयोगकर्ता को एनटाइटलमेंट देने के बाद, आपके ऐप्लिकेशन को खरीदारी पूरी होने की सूचना दिखानी चाहिए. सूचना मिलने की वजह से, उपयोगकर्ता को इस बात को लेकर कोई भ्रम नहीं रहता कि खरीदारी पूरी हुई या नहीं. इससे उपयोगकर्ता आपके ऐप्लिकेशन का इस्तेमाल करना बंद कर सकता है, उपयोगकर्ता सहायता टीम से संपर्क कर सकता है या सोशल मीडिया पर इसकी शिकायत कर सकता है. ध्यान रखें कि आपका ऐप्लिकेशन, लाइफ़साइकल के दौरान किसी भी समय खरीदारी से जुड़े अपडेट का पता लगा सकता है. उदाहरण के लिए, माता-पिता किसी दूसरे डिवाइस पर, अधूरी खरीदारी को मंज़ूरी देते हैं. ऐसे में, हो सकता है कि आपका ऐप्लिकेशन उपयोगकर्ता को सही समय पर सूचना देना चाहे. यहां कुछ ऐसे उदाहरण दिए गए हैं जहां देरी करना सही होगा:
- गेम के ऐक्शन वाले हिस्से या कटसीन के दौरान मैसेज दिखाने से, उपयोगकर्ता का ध्यान भटक सकता है. ऐसे मामले में, कार्रवाई पूरी होने के बाद आपको उपयोगकर्ता को इसकी सूचना देनी होगी.
- गेम के शुरुआती ट्यूटोरियल और उपयोगकर्ता सेटअप के दौरान. उदाहरण के लिए, हो सकता है कि किसी उपयोगकर्ता ने आपका ऐप्लिकेशन इंस्टॉल करने से पहले, आपके ऐप्लिकेशन के बाहर कोई खरीदारी की हो. हमारा सुझाव है कि नए उपयोगकर्ताओं को इनाम की सूचना, गेम खोलने के तुरंत बाद या शुरुआती उपयोगकर्ता सेटअप के दौरान दें. अगर आपके ऐप्लिकेशन में, उपयोगकर्ता को एनटाइटलमेंट देने से पहले, खाता बनाने या लॉग इन करने की ज़रूरत पड़ती है, तो हमारा सुझाव है कि आप उपयोगकर्ता को बताएं कि खरीदारी पर दावा करने के लिए उसे कौनसे चरण पूरे करने होंगे. यह ज़रूरी है, क्योंकि अगर आपके ऐप्लिकेशन ने खरीदारी को प्रोसेस नहीं किया है, तो तीन दिनों के बाद खरीदारी का रिफ़ंड कर दिया जाता है.
उपयोगकर्ता को खरीदारी की सूचना देते समय, Google Play इन तरीकों का सुझाव देता है:
- इन-ऐप्लिकेशन डायलॉग दिखाएं.
- मैसेज को इन-ऐप्लिकेशन मैसेज बॉक्स में डिलीवर करें. साथ ही, साफ़ तौर पर बताएं कि इन-ऐप्लिकेशन मैसेज बॉक्स में एक नया मैसेज है.
- ओएस से मिलने वाली सूचना का इस्तेमाल करें.
सूचना में उपयोगकर्ता को यह बताया जाना चाहिए कि उसे क्या फ़ायदा मिला है. उदाहरण के लिए, "आपने 100 गोल्ड कॉइन खरीदे!". इसके अलावा, अगर खरीदारी Play Pass जैसे किसी प्रोग्राम के फ़ायदे की वजह से की गई थी, तो आपका ऐप्लिकेशन उपयोगकर्ता को इसकी जानकारी देता है. उदाहरण के लिए, "आइटम मिल गए! आपको Play Pass के साथ 100 जेम मिले हैं. जारी रखें.". हर प्रोग्राम में, उपयोगकर्ताओं को फ़ायदों के बारे में बताने के लिए, सुझाए गए टेक्स्ट को दिखाने के बारे में दिशा-निर्देश हो सकते हैं.
Google को सूचना देना कि खरीदारी प्रोसेस हो गई है
जब आपका ऐप्लिकेशन उपयोगकर्ता को एनटाइटलमेंट दे देता है और उसे लेन-देन पूरा होने की सूचना दे देता है, तो आपके ऐप्लिकेशन को Google को यह बताना होगा कि खरीदारी पूरी हो गई है. इसके लिए, खरीदारी को स्वीकार करना होगा. यह काम तीन दिनों के अंदर करना ज़रूरी है, ताकि खरीदारी का रिफ़ंड अपने-आप प्रोसेस न हो और खरीदारी का ऐक्सेस वापस न लिया जाए. अलग-अलग तरह की खरीदारी की पुष्टि करने की प्रोसेस के बारे में, यहां दिए गए सेक्शन में बताया गया है.
इस्तेमाल किए जाने वाले प्रॉडक्ट
इस्तेमाल की जा सकने वाली चीज़ों के लिए, अगर आपके ऐप्लिकेशन में सुरक्षित बैकएंड है, तो हमारा सुझाव है कि आप Purchases.products:consume का इस्तेमाल करें, ताकि खरीदारी को भरोसेमंद तरीके से इस्तेमाल किया जा सके. पक्का करें कि खरीदारी का इस्तेमाल पहले न किया गया हो. इसके लिए, Purchases.products:get को कॉल करने के नतीजे से consumptionState देखें. अगर आपका ऐप्लिकेशन बैकएंड के बिना सिर्फ़ क्लाइंट-ओनली है, तो Google Play Billing Library से consumeAsync() का इस्तेमाल करें. दोनों तरीकों से, खरीदारी की पुष्टि करने की ज़रूरी शर्त पूरी होती है. साथ ही, यह पता चलता है कि आपके ऐप्लिकेशन ने उपयोगकर्ता को एनटाइटलमेंट दे दिया है.
इन तरीकों से, आपके ऐप्लिकेशन को इनपुट परचेज़ टोकन के हिसाब से वन-टाइम प्रॉडक्ट को फिर से खरीदने के लिए उपलब्ध कराने की सुविधा भी मिलती है. consumeAsync() के साथ, आपको एक ऐसा ऑब्जेक्ट भी पास करना होगा जो ConsumeResponseListener इंटरफ़ेस को लागू करता हो. यह ऑब्जेक्ट, इस्तेमाल की कार्रवाई के नतीजे को मैनेज करता है. onConsumeResponse() तरीके को बदला जा सकता है. Google Play Billing Library, कार्रवाई पूरी होने पर इस तरीके को कॉल करता है.
इस उदाहरण में, Google Play Billing Library की मदद से किसी प्रॉडक्ट को इस्तेमाल करने का तरीका बताया गया है. इसके लिए, खरीदारी से जुड़े टोकन का इस्तेमाल किया गया है:
Kotlin
val consumeParams = ConsumeParams.newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build() val consumeResult = withContext(Dispatchers.IO) { client.consumePurchase(consumeParams) }
Java
ConsumeParams consumeParams = ConsumeParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build(); ConsumeResponseListener listener = (billingResult, 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 = billingClient val acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder() .setPurchaseToken(purchase.purchaseToken) val ackPurchaseResult = withContext(Dispatchers.IO) { client.acknowledgePurchase(acknowledgePurchaseParams.build()) }
Java
if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) { if (!purchase.isAcknowledged()) { AcknowledgePurchaseParams acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build(); billingClient.acknowledgePurchase(acknowledgePurchaseParams, (billingResult) -> { // Acknowledgment handled. }); } }
सदस्यताएं
सदस्यताओं को इस्तेमाल न किए जा सकने वाले प्रॉडक्ट की तरह ही मैनेज किया जाता है. अगर हो सके, तो Google Play Developer API से Purchases.subscriptions.acknowledge का इस्तेमाल करें, ताकि आपके सुरक्षित बैकएंड से खरीदारी की पुष्टि की जा सके. पुष्टि करें कि खरीदारी को पहले स्वीकार नहीं किया गया है. इसके लिए, Purchases.subscriptions:get से खरीदारी के संसाधन में acknowledgementState देखें. इसके अलावा, isAcknowledged() की जांच करने के बाद, Google Play Billing Library से BillingClient.acknowledgePurchase() का इस्तेमाल करके, सदस्यता की पुष्टि की जा सकती है. सदस्यता की सभी शुरुआती खरीदारी की पुष्टि करना ज़रूरी है. सदस्यता रिन्यू करने के लिए,
उपयोगकर्ता की सहमति लेने की ज़रूरत नहीं होती. सदस्यताओं की पुष्टि कब करनी चाहिए, इस बारे में ज़्यादा जानने के लिए सदस्यताएं बेचना विषय देखें.
अस्वीकार की गई या पूरी नहीं की गई खरीदारी को मैनेज करना
अगर कोई खरीदारी, बैकएंड की पुष्टि, उपयोगकर्ता की ज़रूरी शर्तों की जांच, धोखाधड़ी और गलत इस्तेमाल की जांच में फ़ेल हो जाती है या आपका सिस्टम एनटाइटलमेंट को पूरा नहीं कर पाता है, तो एनटाइटलमेंट न दें. साथ ही, खरीदारी को स्वीकार या इस्तेमाल न करें.
उपभोक्ता की सुरक्षा के लिए, पुष्टि करने की समयसीमा खत्म होने के बाद, जिन खरीदारी की पुष्टि नहीं की जाती है उन्हें अपने-आप रिफ़ंड और रद्द कर दिया जाता है. हालांकि, खरीदारी को अस्वीकार करने के लिए, इस समयसीमा पर भरोसा न करें. पुष्टि करने की समयसीमा खत्म होने पर, ऑर्डर की पुष्टि नहीं हो पाती. इससे Google Play को यह पता नहीं चल पाता कि डेवलपर ने जान-बूझकर ऑर्डर को अस्वीकार किया है या बैकएंड प्रोसेसिंग टाइम आउट की वजह से ऐसा हुआ है.
इसके बजाय, Google Play Developer API का इस्तेमाल करके, अपने बैकएंड से अस्वीकार की गई खरीदारी को तुरंत रद्द करें और रिफ़ंड करें:
- सदस्यताएं:
revocationContextमें"fullRefund": {}के साथpurchases.subscriptionsv2.revokeपर कॉल करें. इससे सदस्यता तुरंत खत्म हो जाती है, ऐक्सेस वापस ले लिया जाता है, और पूरा रिफ़ंड शुरू हो जाता है. - वन-टाइम प्रॉडक्ट: किसी ऑर्डर का तुरंत रिफ़ंड करने और उसके एनटाइटेलमेंट को रद्द करने के लिए,
orders.refundको कॉल करें. इसके लिए,revokeपैरामीटर कोtrueपर सेट करें. इस तरीके को कॉल करते समय, आपको खरीदारी का ऑर्डर आईडी पास करना होगा. इसेPurchase.getOrderId()याpurchases.productsv2.getproductpurchasev2का इस्तेमाल करके वापस पाया जा सकता है. अस्वीकार की गई खरीदारी के लिए, कभी भीconsumeAsync(),acknowledgePurchase(),Purchases.products:consumeयाPurchases.products:acknowledgeको कॉल न करें. - आरटीडीएन और Voided Purchases API का व्यवहार: डेवलपर की ओर से सदस्यता रद्द करने और रिफ़ंड करने (
purchases.subscriptionsv2.revokeऔरorders.refund, जिसमेंrevokeकोtrueपर सेट किया गया हो) पर, डेवलपर से जुड़ी रीयल-टाइम सूचनाएं ट्रिगर होती हैं. साथ ही, इन्हें Voided Purchases API में रिकॉर्ड किया जाता है (purchases.voidedpurchases.list, जिसमें डेवलपर के लिएvoidedSourceरिस्पॉन्स फ़ील्ड को1पर सेट किया गया हो):- सदस्यताएं: इससे
SUBSCRIPTION_REVOKEDऔरVoidedPurchaseNotification, दोनों सूचनाएं भेजी जाती हैं. - वन-टाइम प्रॉडक्ट:
VoidedPurchaseNotificationभेजता है. साथ ही, अगर आपके ऐप्लिकेशन को Play Console में वन-टाइम प्रॉडक्ट की सभी सूचनाएं पाने के लिए कॉन्फ़िगर किया गया है, तोONE_TIME_PRODUCT_CANCELEDसूचना भेजता है. orders.refundको कॉल करते समय,revokeकोtrueपर सेट न करने से, ऑर्डर का रिफ़ंड तो मिल जाता है, लेकिन एनटाइटलमेंट रद्द नहीं होता. साथ ही, एनटाइटलमेंट रद्द होने या खरीदारी अमान्य होने की सूचना भी ट्रिगर नहीं होती. ज़्यादा जानकारी के लिए, सदस्यताएं और वन-टाइम खरीदारी मैनेज करना लेख पढ़ें.
- सदस्यताएं: इससे
रीकैप
यहां इन चरणों के बारे में खास जानकारी दी गई है.
एंटाइटलमेंट देने से पहले खरीदारी की पुष्टि करने के लिए, खरीदारी की जानकारी अपने सुरक्षित बैकएंड पर भेजें.
खरीदारी करके, अपने एनटाइटेलमेंट स्टोरेज को अपडेट करें. अगर खरीदारी की स्थिति PENDING है, तो पक्का करें कि एनटाइटलमेंट को 'मंज़ूरी बाकी है' के तौर पर मार्क किया गया हो और उपयोगकर्ता को अब तक फ़ायदे न मिल रहे हों. हमारा सुझाव है कि यह चरण आपके सुरक्षित बैकएंड पर पूरा किया जाए. साथ ही, इसे पहले चरण में आपके बैकएंड पर किए गए एपीआई कॉल में जोड़ा जा सकता है.
उपयोगकर्ता को सही मैसेज भेजकर सूचना दें. अगर ज़रूरी हो, तो सूचना भेजने में देरी करें, जैसा कि पहले बताया गया है.
Google को बताएं कि खरीदारी को प्रोसेस कर दिया गया है. इसके लिए, खरीदारी प्रोसेस करने वाले सेक्शन में बताए गए तरीके का इस्तेमाल करें.
यह पुष्टि करने के लिए कि आपके ऐप्लिकेशन ने इन चरणों को सही तरीके से लागू किया है, टेस्टिंग गाइड में दिया गया तरीका अपनाएं.
ऐसे लेन-देन मैनेज करना जिन्हें मंज़ूरी नहीं मिली है
Google Play, ऐसे लेन-देन जिन्हें मंज़ूरी नहीं मिली है या ऐसे लेन-देन को सपोर्ट करता है जिनमें उपयोगकर्ता के खरीदारी शुरू करने और खरीदारी के लिए पेमेंट का तरीका प्रोसेस होने के बीच, एक या उससे ज़्यादा अतिरिक्त चरणों की ज़रूरत होती है. आपके ऐप्लिकेशन को इस तरह की खरीदारी के लिए तब तक एनटाइटलमेंट नहीं देना चाहिए, जब तक Google आपको यह सूचना न दे कि उपयोगकर्ता के पेमेंट के तरीके से शुल्क ले लिया गया है.
उदाहरण के लिए, कोई उपयोगकर्ता किसी स्टोर को चुनकर लेन-देन शुरू कर सकता है. इसके बाद, वह बाद में नकद पेमेंट कर सकता है. उपयोगकर्ता को सूचना और ईमेल, दोनों के ज़रिए एक कोड मिलता है. स्टोर पर पहुंचने के बाद, उपयोगकर्ता कैशियर को कोड दिखाकर उसे रिडीम कर सकता है और कैश में पेमेंट कर सकता है. इसके बाद, Google आपको और उपयोगकर्ता को सूचना देता है कि पेमेंट मिल गया है. इसके बाद, आपका ऐप्लिकेशन उपयोगकर्ता को एनटाइटलमेंट दे सकता है.
अपने ऐप्लिकेशन के लिए, ऐसे लेन-देन चालू करने के लिए जिन्हें मंज़ूरी नहीं मिली है, BillingClient को शुरू करने के दौरान enablePendingPurchases() को कॉल करें. आपके ऐप्लिकेशन में, वन-टाइम प्रॉडक्ट के लिए, ऐसे लेन-देन चालू होने चाहिए जिन्हें मंज़ूरी नहीं मिली है. यह सुविधा जोड़ने से पहले, पक्का करें कि आपको उन लेन-देन के लिए खरीदारी की लाइफ़साइकल के बारे में पता हो जिन्हें मंज़ूरी नहीं मिली है.
जब आपके ऐप्लिकेशन को 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 Console में वन-टाइम प्रॉडक्ट मैनेजमेंट पेज पर जाकर, उस प्रॉडक्ट के लिए एक से ज़्यादा प्रॉडक्ट की खरीदारी की सुविधा चालू करनी होगी.
उपयोगकर्ता के बिलिंग कॉन्फ़िगरेशन के बारे में क्वेरी करना
getBillingConfigAsync() से उस देश की जानकारी मिलती है जिसे उपयोगकर्ता ने Google Play के लिए सेट किया है.
BillingClient बनाने के बाद, उपयोगकर्ता के बिलिंग कॉन्फ़िगरेशन के बारे में क्वेरी की जा सकती है. नीचे दिए गए कोड स्निपेट में, getBillingConfigAsync() को कॉल करने का तरीका बताया गया है. BillingConfigResponseListener को लागू करके, रिस्पॉन्स को मैनेज करें. इस लिसनर को आपके ऐप्लिकेशन से शुरू की गई सभी बिलिंग कॉन्फ़िगरेशन क्वेरी के अपडेट मिलते हैं.
अगर दिखाए गए BillingResult में कोई गड़बड़ी नहीं है, तो BillingConfig ऑब्जेक्ट में countryCode फ़ील्ड की जांच करके, उपयोगकर्ता के Google 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 { // Handle errors } } } )
Java
GetBillingConfigParams getBillingConfigParams = GetBillingConfigParams.newBuilder().build(); billingClient.getBillingConfigAsync( getBillingConfigParams, (billingResult, billingConfig) -> { if (billingResult.getResponseCode() == BillingResponseCode.OK && billingConfig != null) { String countryCode = billingConfig.getCountryCode(); } else { // TODO: Handle errors } });