मई 2022 में सदस्यता में होने वाले बदलावों की गाइड

Google Play का बिलिंग सिस्टम एक ऐसी सेवा है जिसकी मदद से, आपको अपने Android ऐप्लिकेशन में डिजिटल प्रॉडक्ट और कॉन्टेंट बेचने की सुविधा मिलती है. मई 2022 में रिलीज़ किए गए वर्शन में, हमने सदस्यता वाले प्रॉडक्ट तय करने के तरीके में बदलाव किया है. इससे, इन प्रॉडक्ट को ऐप्लिकेशन में बेचने और आपके बैकएंड पर मैनेज करने के तरीके पर असर पड़ेगा. अगर आपको पहली बार Google Play के बिलिंग सिस्टम के साथ इंटिग्रेट करना है, तो तैयारी करना लेख पढ़ें.

अगर आपने मई 2022 से पहले, Google Play के बिलिंग सिस्टम की मदद से सदस्यताएं बेची थीं, तो अपनी मौजूदा सदस्यताओं को बनाए रखते हुए, नई सुविधाओं को अपनाने का तरीका समझना ज़रूरी है.

सबसे पहले यह जान लें कि आपकी सभी मौजूदा सदस्यताएं, ऐप्लिकेशन, और बैकएंड इंटिग्रेशन, मई 2022 में रिलीज़ होने से पहले की तरह ही काम करेंगे. आपको तुरंत कोई बदलाव करने की ज़रूरत नहीं है. साथ ही, इन नई सुविधाओं को समय के साथ इस्तेमाल किया जा सकता है. Google Play Billing Library की हर मुख्य रिलीज़, रिलीज़ होने के दो साल बाद तक काम करती है. Google Play Developer API के साथ मौजूदा इंटिग्रेशन पहले की तरह ही काम करते रहेंगे.

मई 2022 में किए गए अपडेट के बारे में खास जानकारी यहां दी गई है:

  • Google Play Console के नए वर्शन में, सदस्यताएं, बुनियादी प्लान, और ऑफ़र बनाए और मैनेज किए जा सकते हैं. इसमें नई और माइग्रेट की गई सदस्यताएं, दोनों शामिल हैं.
  • Play डेवलपर एपीआई में, एपीआई फ़ॉर्म में Google Play Console के नए यूज़र इंटरफ़ेस (यूआई) की सुविधाओं के साथ काम करने के लिए अपडेट शामिल हैं. ध्यान दें कि Subscription Purchases API का एक नया वर्शन है. सदस्यता की स्थिति देखने और सदस्यता की खरीदारी को मैनेज करने के लिए, इस एपीआई का इस्तेमाल करें.
  • Play Billing Library के नए वर्शन 5 का इस्तेमाल करके, आपके ऐप्लिकेशन को सदस्यता की सभी नई सुविधाओं का फ़ायदा मिल सकता है. जब आप वर्शन 5 पर अपग्रेड करने के लिए तैयार हों, तो माइग्रेशन गाइड में दिए गए निर्देशों का पालन करें.

सदस्यताओं का कॉन्फ़िगरेशन

Google Play Console से सदस्यताएं मैनेज करना

मई 2022 से, आपको Google Play Console में कुछ बदलाव दिखेंगे.

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

पुराने इंटिग्रेशन में, हर सदस्यता में एक ही ऑफ़र शामिल होना चाहिए. इसे SkuDetails ऑब्जेक्ट से दिखाया जाता है. इसलिए, हर सदस्यता में पुराने सिस्टम के साथ काम करने वाला एक ही बुनियादी प्लान या ऑफ़र शामिल हो सकता है. पुराने सिस्टम के साथ काम करने वाला बुनियादी प्लान या ऑफ़र, उन ऐप्लिकेशन के लिए SKU के हिस्से के तौर पर दिखाया जाता है जो अब काम नहीं करने वाले querySkuDetailsAsync() तरीके का इस्तेमाल कर रहे हैं. पुराने सिस्टम के साथ काम करने वाले ऑफ़र को कॉन्फ़िगर और मैनेज करने के बारे में ज़्यादा जानने के लिए, सदस्यताओं के बारे में जानकारी देखें. जब आपका ऐप्लिकेशन सिर्फ़ queryProductDetailsAsync() का इस्तेमाल कर रहा हो और आपके ऐप्लिकेशन के पुराने वर्शन से खरीदारी न की जा रही हो, तब आपको पुराने सिस्टम के साथ काम करने वाले ऑफ़र का इस्तेमाल करने की ज़रूरत नहीं है.

Subscriptions Publishing API की मदद से सदस्यताएं मैनेज करना

Play Developer API में, सदस्यताएं खरीदने के लिए नई सुविधाएं शामिल हैं. SKU मैनेजमेंट के लिए, inappproducts एपीआई पहले की तरह ही काम करता रहेगा. इसमें, एक बार खरीदे जाने वाले प्रॉडक्ट और सदस्यताओं को मैनेज करना भी शामिल है. इसलिए, अपने इंटिग्रेशन को बनाए रखने के लिए, आपको तुरंत कोई बदलाव करने की ज़रूरत नहीं है.

हालांकि, यह ध्यान रखना ज़रूरी है कि Google Play Console सिर्फ़ नई सदस्यता इकाइयों का इस्तेमाल करता है. Console में अपनी सदस्यताओं में बदलाव करने के बाद, inappproducts एपीआई का इस्तेमाल सदस्यताओं के लिए नहीं किया जा सकता.

अगर आपने मई 2022 से पहले Publishing API का इस्तेमाल किया है, तो किसी भी समस्या से बचने के लिए, अब Google Play Console में मौजूदा सदस्यताएं रीड-ओनली के तौर पर दिखेंगी. अगर आपने बदलाव करने की कोशिश की, तो आपको इस पाबंदी के बारे में बताने वाली चेतावनी मिल सकती है. Console में सदस्यताओं में और बदलाव करने से पहले, आपको सदस्यता पब्लिश करने के नए एंडपॉइंट का इस्तेमाल करने के लिए, अपना बैकएंड इंटिग्रेशन अपडेट करना चाहिए. नए monetization.subscriptions, monetization.subscriptions.baseplans, और monetization.subscriptions.offers एंडपॉइंट की मदद से, सभी उपलब्ध बुनियादी प्लान और ऑफ़र मैनेज किए जा सकते हैं. इस टेबल में, यह देखा जा सकता है कि InAppProduct इकाई के अलग-अलग फ़ील्ड, monetization.subscriptions में मौजूद नए ऑब्जेक्ट में कैसे मैप होते हैं:

InAppProduct सदस्यता
packageName packageName
sku productId
status basePlans[0].state
prices basePlans[0].regionalConfigs.price
listings लिस्टिंग
defaultPrice कोई समानता नहीं
subscriptionPeriod basePlans[0].autoRenewingBasePlanType.billingPeriodDuration
trialPeriod basePlans[0].offers[0].phases[0].regionalConfigs[0].free
gracePeriod basePlans[0].autoRenewingBasePlanType.gracePeriodDuration
subscriptionTaxesAndComplianceSettings taxAndComplianceSettings

एपीआई का यह ज़रूरी अपडेट, सिर्फ़ पब्लिशिंग एपीआई (एसकेयू मैनेजमेंट) पर लागू होता है.

Play Billing Library में हुए बदलाव

धीरे-धीरे माइग्रेट करने के लिए, Play Billing Library में पिछले वर्शन में उपलब्ध सभी तरीकों और ऑब्जेक्ट शामिल हैं. SkuDetails querySkuDetailsAsync() जैसे ऑब्जेक्ट और फ़ंक्शन अब भी मौजूद हैं. इसलिए, नई सुविधा का इस्तेमाल करने के लिए, आपको मौजूदा सदस्यताओं के कोड को तुरंत अपडेट करने की ज़रूरत नहीं है. इन तरीकों से कौनसे ऑफ़र उपलब्ध कराने हैं, यह भी कंट्रोल किया जा सकता है. इसके लिए, उन्हें 'पुराने वर्शन के साथ काम करने वाला' के तौर पर मार्क करें.

Play Billing Library 5 में, पुराने तरीकों के साथ-साथ, अब एक नया ProductDetails ऑब्जेक्ट और उससे जुड़ा queryProductDetailsAsync() तरीका भी शामिल है. इनका इस्तेमाल, नई इकाइयों और सुविधाओं को मैनेज करने के लिए किया जाता है. ProductDetails पर अब मौजूदा इन-ऐप्लिकेशन प्रॉडक्ट (एक बार खरीदे जाने वाले और एक बार इस्तेमाल किए जा सकने वाले प्रॉडक्ट) भी काम करते हैं.

किसी सदस्यता के लिए, ProductDetails.getSubscriptionOfferDetails() उन सभी बुनियादी प्लान और ऑफ़र की सूची दिखाता है जिन्हें उपयोगकर्ता खरीद सकता है. इसका मतलब है कि आपके पास उपयोगकर्ता के लिए उपलब्ध सभी बुनियादी प्लान और ऑफ़र को ऐक्सेस करने का विकल्प है. भले ही, वे पुराने सिस्टम के साथ काम करते हों या नहीं. सदस्यता के बिना खरीदे गए प्रॉडक्ट के लिए, getSubscriptionOfferDetails() null दिखाता है. एक बार की जाने वाली खरीदारी के लिए, getOneTimePurchaseOfferDetails() का इस्तेमाल किया जा सकता है.

Play Billing Library 5 में, खरीदारी फ़्लो को लॉन्च करने के लिए, नए और लेगसी, दोनों तरीके शामिल हैं. अगर BillingClient.launchBillingFlow() को पास किया गया BillingFlowParams ऑब्जेक्ट, SkuDetails ऑब्जेक्ट का इस्तेमाल करके कॉन्फ़िगर किया गया है, तो सिस्टम, एसकेयू से जुड़े बुनियादी प्लान या ऑफ़र से, बिक्री के लिए ऑफ़र की जानकारी निकालता है. यह प्लान या ऑफ़र, पुराने सिस्टम के साथ काम करता है. अगर BillingClient.launchBillingFlow() को पास किया गया BillingFlowParams ऑब्जेक्ट, ProductDetailsParams ऑब्जेक्ट का इस्तेमाल करके कॉन्फ़िगर किया गया है, तो सिस्टम उस जानकारी का इस्तेमाल करके, उपयोगकर्ता के खरीदे जा रहे प्रॉडक्ट की पहचान करता है. ProductDetailsParams ऑब्जेक्ट में ProductDetails और String शामिल होते हैं. ProductDetails, खरीदे जा रहे ऑफ़र के लिए खास ऑफ़र टोकन को दिखाता है और String, ऑफ़र के लिए खास ऑफ़र टोकन को दिखाता है.

queryPurchasesAsync(), उपयोगकर्ता के मालिकाना हक वाली सभी खरीदारी दिखाता है. अनुरोध किए गए प्रॉडक्ट टाइप को दिखाने के लिए, पुराने वर्शन की तरह ही BillingClient.SkuType वैल्यू या QueryPurchasesParams ऑब्जेक्ट को पास किया जा सकता है. इस ऑब्जेक्ट में BillingClient.ProductType वैल्यू होती है, जो नई सदस्यता इकाइयों को दिखाती है.

हमारा सुझाव है कि आप जल्द ही अपने ऐप्लिकेशन में, लाइब्रेरी के वर्शन 5 पर अपडेट करें, ताकि सदस्यता की इन नई सुविधाओं का फ़ायदा लिया जा सके.

सदस्यता की स्थिति मैनेज करना

इस सेक्शन में, Google Play के बिलिंग सिस्टम के इंटिग्रेशन के बैकएंड कॉम्पोनेंट में हुए मुख्य बदलावों के बारे में बताया गया है. इन्हें वर्शन 5 पर माइग्रेट करने के लिए लागू करना ज़रूरी है.

डेवलपर से जुड़ी रीयल-टाइम सूचनाएं

जल्द ही, SubscriptionNotification ऑब्जेक्ट में subscriptionId नहीं होगा. अगर सदस्यता वाले प्रॉडक्ट की पहचान करने के लिए, इस फ़ील्ड का इस्तेमाल किया जा रहा है, तो आपको सदस्यता की स्थिति से यह जानकारी पाने के लिए, सूचना मिलने के बाद purchases.subscriptionv2:get का इस्तेमाल करके इसे अपडेट करना चाहिए. खरीदारी की स्थिति के हिस्से के तौर पर दिखाए गए lineItems कलेक्शन के हर SubscriptionPurchaseLineItem एलिमेंट में, उससे जुड़ा productId शामिल होगा.

Subscriptions Purchases API: सदस्यता की स्थिति देखना

Subscriptions Purchases API के पिछले वर्शन में, purchases.subscriptions:get का इस्तेमाल करके, सदस्यता की स्थिति के बारे में जानकारी पाने का विकल्प था. इस एंडपॉइंट में कोई बदलाव नहीं हुआ है. यह पुराने सिस्टम के साथ काम करने वाली सदस्यता की खरीदारी के लिए काम करता रहेगा. यह एंडपॉइंट, मई 2022 में रिलीज़ की गई किसी भी नई सुविधा के साथ काम नहीं करता.

सदस्यता की खरीदारी की स्थिति जानने के लिए, Subscriptions Purchases API के नए वर्शन में, purchases.subscriptionsv2:get का इस्तेमाल करें. यह एपीआई, माइग्रेट की गई सदस्यताओं, नई सदस्यताओं (प्रीपेड और अपने-आप रिन्यू होने वाली, दोनों तरह की), और सभी तरह की खरीदारी के साथ काम करता है. सूचनाएं मिलने पर सदस्यता का स्टेटस देखने के लिए, इस एंडपॉइंट का इस्तेमाल किया जा सकता है. दिखाए गए ऑब्जेक्ट, SubscriptionPurchaseV2 में नए फ़ील्ड शामिल हैं. हालांकि, इसमें अब भी लेगसी डेटा शामिल है. यह डेटा, मौजूदा सदस्यताओं के साथ काम करना जारी रखने के लिए ज़रूरी है.

प्रीपेड प्लान के लिए SubscriptionPurchaseV2 फ़ील्ड

प्रीपेड प्लान के लिए नए फ़ील्ड जोड़े गए हैं. ये प्लान अपने-आप रिन्यू होने के बजाय, उपयोगकर्ता के ज़रिए रिन्यू किए जाते हैं. सभी फ़ील्ड, प्रीपेड प्लान पर लागू होते हैं, जैसे कि अपने-आप रिन्यू होने वाली सदस्यताओं पर लागू होते हैं. हालांकि, इनमें ये अपवाद हैं:

  • [नया फ़ील्ड] lineItems[0].prepaid_plan.allowExtendAfterTime: इससे पता चलता है कि उपयोगकर्ता को अपने प्रीपेड प्लान की समयसीमा बढ़ाने के लिए, कब दूसरा टॉप-अप खरीदने की अनुमति दी जाएगी. ऐसा इसलिए, क्योंकि उपयोगकर्ता के पास एक बार में सिर्फ़ एक ऐसा टॉप-अप हो सकता है जिसका इस्तेमाल नहीं किया गया हो.
  • [नया फ़ील्ड] SubscriptionState: इससे सदस्यता ऑब्जेक्ट की स्थिति के बारे में पता चलता है. प्रीपेड प्लान के लिए, यह वैल्यू हमेशा ACTIVE, PENDING या CANCELED होती है.
  • lineItems[0].expiryTime: यह फ़ील्ड, प्रीपेड प्लान के लिए हमेशा मौजूद होता है.
  • paused_state_context: यह फ़ील्ड कभी मौजूद नहीं होता, क्योंकि प्रीपेड प्लान को रोका नहीं जा सकता.
  • lineItems[0].auto_renewing_plan: यह प्रीपेड प्लान के लिए मौजूद नहीं है.
  • canceled_state_context: यह फ़ील्ड, रिचार्ज वाले प्लान के लिए मौजूद नहीं होता. ऐसा इसलिए है, क्योंकि यह फ़ील्ड सिर्फ़ उन उपयोगकर्ताओं पर लागू होता है जो सदस्यता को रद्द करते हैं.
  • lineItems[0].productId: यह फ़ील्ड, पिछले वर्शन में मौजूद subscriptionId की जगह लेता है.

बार-बार रिन्यू होने वाली सदस्यताओं के लिए SubscriptionPurchaseV2 फ़ील्ड

purchases.subscriptionv2 में नए फ़ील्ड होते हैं, जो सदस्यता के नए ऑब्जेक्ट के बारे में ज़्यादा जानकारी देते हैं. नीचे दी गई टेबल से पता चलता है कि सदस्यता के लेगसी एंडपॉइंट के फ़ील्ड, purchases.subscriptionv2 में मौजूद मिलते-जुलते फ़ील्ड से कैसे मैप होते हैं.

SubscriptionPurchase SubscriptionPurchaseV2
countryCode regionCode
orderId latestOrderId
(कोई मिलता-जुलता फ़ील्ड नहीं) lineItems (SubscriptionPurchaseLineItem की सूची), जो खरीदारी के साथ हासिल किए गए प्रॉडक्ट दिखाती है
(कोई मिलता-जुलता फ़ील्ड नहीं) lineItems.offerDetails.basePlanId
(कोई मिलता-जुलता फ़ील्ड नहीं) lineItems.offerDetails.offerId
(कोई मिलता-जुलता फ़ील्ड नहीं) lineItems.offerDetails.offerTags
startTimeMillis startTime
expiryTimeMillis lineItems.expiryTime (खरीदारी में हासिल की गई हर सदस्यता का अपना expiryTime होता है)
(कोई मिलता-जुलता फ़ील्ड नहीं) subscriptionState ( सदस्यता की स्थिति के बारे में बताता है)
(कोई मिलता-जुलता फ़ील्ड नहीं) pausedStateContext (सिर्फ़ तब दिखता है, जब सदस्यता का स्टेटस SUBSCRIPTION_STATE_PAUSED हो)
autoResumeTimeMillis pausedStateContext.autoResumeTime
(कोई मिलता-जुलता फ़ील्ड नहीं) canceledStateContext (सिर्फ़ तब दिखता है, जब सदस्यता की स्थिति SUBSCRIPTION_STATE_CANCELED हो)
(कोई मिलता-जुलता फ़ील्ड नहीं) testPurchase (सिर्फ़ लाइसेंस रखने वाले टेस्टर की खरीदारी में मौजूद है)
autoRenewing lineItems.autoRenewingPlan.autoRenewEnabled
priceCurrenceCode, priceAmountMicros lineItems.autoRenewingPlan.recurringPrice
introductoryPriceInfo (कोई मिलता-जुलता फ़ील्ड नहीं)
यह जानकारी, खरीदी गई हर सदस्यता के लिए offer में देखी जा सकती है.
developerPayload (कोई मिलता-जुलता फ़ील्ड नहीं) डेवलपर के लिए पेलोड का इस्तेमाल बंद कर दिया गया है
paymentState (इसका कोई मिलता-जुलता फ़ील्ड नहीं है)
पेमेंट की स्थिति का पता subscriptionState से लगाया जा सकता है:
  • पेमेंट को मंज़ूरी मिलना बाकी है:
    • SUBSCRIPTION_STATE_PENDING (लेन-देन बाकी होने पर, नई खरीदारी)
    • SUBSCRIPTION_STATE_IN_GRACE_PERIOD
    • SUBSCRIPTION_STATE_ON_HOLD
  • पेमेंट मिल गया है:
    • SUBSCRIPTION_STATE_ACTIVE
  • मुफ़्त में आज़माएं:
    • (कोई मिलता-जुलता फ़ील्ड नहीं)
  • अपग्रेड / डाउनग्रेड को बाद के लिए शेड्यूल करना:
    • SUBSCRIPTION_STATE_PENDING
cancelReason, userCancellationTimeMillis, cancelSurveyResult canceledStateContext
linkedPurchaseToken linkedPurchaseToken (कोई बदलाव नहीं)
purchaseType जांच करें: testPurchase
के ज़रिए प्रमोशन: signupPromotion
priceChange lineItems.autoRenewingPlan.priceChangeDetails
profileName, emailAddress, givenName, familyName, profileId subscribeWithGoogleInfo
acknowledgementState acknowledgementState (no change)
promotionType, promotionCode signupPromotion
externalAccountId, obfuscatedExternalAccountId, obfuscatedExteranlProfileId externalAccountIdentifiers

सदस्यता मैनेज करने से जुड़े अन्य फ़ंक्शन

purchases.subscriptions:get को purchases.subscriptionsv2:get पर अपग्रेड कर दिया गया है. हालांकि, purchases.subscriptions एंडपॉइंट में डेवलपर की सदस्यता मैनेज करने के बाकी फ़ंक्शन अब भी पहले जैसे ही काम करते रहेंगे. इसलिए, पहले की तरह ही purchases.subscriptions:acknowledge, purchases.subscriptions:cancel, purchases.subscriptions:defer, purchases.subscriptions:refund, और purchases.subscriptions:revoke का इस्तेमाल किया जा सकता है.

Pricing API

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