1. परिचय
इस कोडलैब में, सदस्यता प्लान में बदलावों को मैनेज करने के लिए, Google Play Billing Library (PBL) का इस्तेमाल करने का तरीका बताया गया है. आपको यह पता चलेगा कि सदस्यता प्लान में बदलाव करने के अलग-अलग तरीकों से, कीमत और उपयोगकर्ता के अधिकारों पर क्या असर पड़ता है. साथ ही, आपको बैकएंड पर डेवलपर से जुड़ी रीयल-टाइम सूचनाओं (आरटीडीएन) को प्रोसेस करने का तरीका भी पता चलेगा.
दर्शक
यह कोडलैब, Android ऐप्लिकेशन डेवलपर के लिए बनाया गया है. इसमें सदस्यता मैनेज करने की बेहतर सुविधाएं लागू करने के बारे में जानकारी दी गई है. इन दिशा-निर्देशों की मदद से, उपयोगकर्ताओं को अपग्रेड करने, डाउनग्रेड करने या अलग-अलग सदस्यता प्लान के बीच ट्रांज़िशन करने का बेहतर अनुभव दिया जा सकता है.
आपको यह जानकारी मिलेगी...
- Play Console में सदस्यताएं बनाने का तरीका.
- ऐप्लिकेशन को अपग्रेड और डाउनग्रेड करने से जुड़ी नीतियों के हिसाब से, सही
ReplacementMode(जैसे,WITH_TIME_PRORATIONबनामDEFERRED) चुनने का तरीका. - प्लान बदलने के लिए, Google Play से खरीदारी की प्रोसेस को ट्रिगर करने के लिए,
launchBillingFlowमेंBillingFlowParamsको कॉन्फ़िगर करने का तरीका. - अपने बैकएंड पर, पुराने ऐक्सेस को सुरक्षित तरीके से रद्द करने और नया ऐक्सेस देने के लिए, डेवलपर से जुड़ी रीयल-टाइम सूचनाओं (आरटीडीएन) और
purchases.subscriptionsv2API का इस्तेमाल कैसे करें
आपको इन चीज़ों की ज़रूरत होगी
- डेवलपर खाते से Google Play Console को ऐक्सेस करने की सुविधा. अगर आपके पास डेवलपर खाता नहीं है, तो आपको एक खाता बनाना होगा.
- इस कोडलैब के लिए सैंपल के तौर पर मिला ऐप्लिकेशन, जिसे GitHub से डाउनलोड किया जा सकता है.
- Android Studio
2. सैंपल के तौर पर मिला ऐप्लिकेशन बनाना
इस कोडलैब में, एक सैंपल Android ऐप्लिकेशन का इस्तेमाल किया गया है. इसमें बताया गया है कि PBL में सदस्यता बदलने की सुविधा कैसे लागू की जाती है. सैंपल ऐप्लिकेशन को पूरी तरह से काम करने वाले Android ऐप्लिकेशन के तौर पर डिज़ाइन किया गया है. इसमें पूरा सोर्स कोड होता है, जो इन पहलुओं को दिखाता है:
- ऐप्लिकेशन को पीबीएल के साथ इंटिग्रेट करना
- सदस्यता प्लान बदलने की सुविधा लागू करना
अगर आपको सदस्यता बदलने और पीबीएल के बारे में पहले से पता है, तो सैंपल के तौर पर मिला ऐप्लिकेशन डाउनलोड करें और उसका इस्तेमाल करें.
नीचे दिए गए डेमो वीडियो में दिखाया गया है कि सैंपल के तौर पर मिले ऐप्लिकेशन को डिप्लॉय और चलाने के बाद, वह कैसा दिखेगा और कैसे काम करेगा.
ज़रूरी शर्तें
संपल ऐप्लिकेशन बनाने और उसे डिप्लॉय करने से पहले, ये काम करें:
- Google Play Console डेवलपर खाता बनाएं. अगर आपके पास पहले से ही डेवलपर खाता है, तो इस चरण को छोड़ दें.
- Play Console में एक नया ऐप्लिकेशन बनाएं. इसमें कमाई करने की सुविधाएं चालू होनी चाहिए. इसके अलावा, Play Console में मौजूद किसी ऐप्लिकेशन का इस्तेमाल किया जा सकता है. अगर आपके ऐप्लिकेशन के लिए कमाई करने की सुविधाएं चालू नहीं हैं, तो उन्हें सेट अप करने के लिए यह तरीका अपनाएं.
- Android Studio इंस्टॉल करें.
बनाएं
कोड लैब में दिए गए निर्देशों का पालन करने के लिए, सैंपल के तौर पर मिला ऐप्लिकेशन बनाने का तरीका:
- GitHub से सैंपल ऐप्लिकेशन डाउनलोड करें.
- सेंपल ऐप्लिकेशन के
build.gradleमें मौजूदapplicationIdको अपडेट करें, ताकि Play डेवलपर कंसोल में आपके ऐप्लिकेशन का ऐप्लिकेशन आईडी दिखे. - सैंपल ऐप्लिकेशन बनाएं.
ध्यान दें: इससे ऐप्लिकेशन, स्थानीय तौर पर टेस्टिंग के लिए बन जाता है. हालांकि, ऐप्लिकेशन चलाने पर प्रॉडक्ट और उनकी कीमतें नहीं दिखती हैं. ऐसा इसलिए, क्योंकि Play Developer Console में ज़रूरी सदस्यताओं को अब तक नहीं बनाया गया है. अगले सेक्शन में, Developer Console में सदस्यताएं बनाने के बारे में बताया जाएगा.
3. Play Console में सदस्यताएं बनाना
सदस्यता लेने के लिए बनाया गया Google Play का सिस्टम आपको, सदस्यताओं को बनाने, मैनेज करने, और उन्हें बेचने के तरीकों में बदलाव करने की सुविधा देता है. Play Console में, एक सदस्यता को कई बुनियादी प्लान के साथ कॉन्फ़िगर किया जा सकता है. इनमें से हर प्लान में कई ऑफ़र शामिल किए जा सकते हैं. सदस्यता से जुड़े हर ऑफ़र के लिए, अलग-अलग शुल्क और शर्तें तय की जा सकती हैं. इस कोडलैब के लिए, आपको तीन तरह की सदस्यताएं बनानी होंगी: Premium प्लान, Basic प्लान, और Lite प्लान. इससे अलग-अलग कीमत पर सदस्यता देने की सुविधा का इस्तेमाल किया जा सकेगा. इनमें से हर सदस्यता में, हर महीने रिन्यू होने वाला एक बुनियादी प्लान होगा.
नई सदस्यता बनाएं
नई सदस्यता बनाने के लिए
- Play Console खोलें और सदस्यताएं पेज (Google Play का इस्तेमाल करके कमाई करें > प्रॉडक्ट > सदस्यताएं) पर जाएं
- सदस्यता बनाएं पर क्लिक करें.
- अपनी सदस्यता की जानकारी डालें:
- ProductID : कोई यूनीक प्रॉडक्ट आईडी डालें.
premium_planडालें. - नाम : सदस्यता के लिए कोई छोटा नाम डालें. उदाहरण:
Premium Plan.
- ProductID : कोई यूनीक प्रॉडक्ट आईडी डालें.
- बनाएं पर क्लिक करें.
बुनियादी प्लान बनाना
- Play Console खोलें और सदस्यताएं पेज (Google Play का इस्तेमाल करके कमाई करें > प्रॉडक्ट > सदस्यताएं) पर जाएं
- आपको जिस सदस्यता के लिए बुनियादी प्लान बनाना है उसके बगल में बने राइट ऐरो पर क्लिक करके, सदस्यता के बारे में जानकारी देखें.
- बुनियादी प्लान जोड़ें पर क्लिक करें.
- बुनियादी प्लान का आईडी डालें. उदाहरण
monthly-auto-renewing. - टाइप के तौर पर अपने-आप रिन्यू होने वाला चुनें.
- अपने-आप रिन्यू होने वाले बुनियादी प्लान के लिए, यह जानकारी सेट करें:
- बिलिंग अवधि: हर महीने.
- ग्रेस पीरियड: सात दिन.
- बिलिंग प्लान और ऑफ़र से जुड़े बदलाव: बिलिंग की तारीख पर शुल्क लें.
- फिर से सदस्यता लें: अनुमति दें.
- बुनियादी प्लान की कीमत सेट करने के लिए, कीमत और उपलब्धता सेक्शन में जाकर, कीमतें सेट करें पर क्लिक करें.
- सभी देशों और इलाकों को चुनें. इसके बाद, कीमत सेट करें पर क्लिक करें.
- इस बुनियादी प्लान के लिए कीमत 10 डॉलर के तौर पर सेट करें. इसके बाद, अपडेट करें पर क्लिक करें.
- बुनियादी प्लान की कीमत सेट करने के बाद, सबसे नीचे दाईं ओर मौजूद सेव करें और फिर चालू करें पर क्लिक करें.
सैंपल ऐप्लिकेशन के लिए सदस्यताएं बनाना
इस कोडलैब के लिए, यहां दिए गए कॉन्फ़िगरेशन के साथ दो और सदस्यताएं बनाएं:
- बुनियादी प्लान
- प्रॉडक्ट आईडी: basic_plan
- नाम: बुनियादी प्लान
- बुनियादी प्लान का आईडी: monthly-auto-renewing
- कीमत: 500 रुपये
- Lite प्लान
- प्रॉडक्ट आईडी: lite_plan
- नाम: Lite Plan
- बुनियादी प्लान का आईडी: monthly-auto-renewing
- कीमत: 300 रुपये
सैंपल के तौर पर मिले ऐप्लिकेशन को इन प्रॉडक्ट आईडी और बुनियादी प्लान के आईडी का इस्तेमाल करने के लिए कॉन्फ़िगर किया गया है. अलग-अलग कॉन्फ़िगरेशन वाली अलग-अलग सदस्यताएं बनाई जा सकती हैं. ऐसे में, आपको बनाए गए प्रॉडक्ट आईडी का इस्तेमाल करने के लिए, सैंपल के तौर पर मिले ऐप्लिकेशन में बदलाव करना होगा.
सदस्यता बनाने से जुड़ा वीडियो
इस वीडियो में, Play Console में सदस्यता बनाने का तरीका बताया गया है.
4. सदस्यता बदलना
PBL के साथ इंटिग्रेट करने वाले डेवलपर, मौजूदा सदस्यों को उनकी ज़रूरतों के हिसाब से सदस्यता प्लान बदलने के लिए कई विकल्प दे सकते हैं:
- अगर आपने सदस्यता के कई टियर बेचे हैं, जैसे कि बुनियादी और प्रीमियम सदस्यता, तो उपयोगकर्ताओं को टियर स्विच करने की अनुमति दी जा सकती है. इसके लिए, उन्हें किसी दूसरी सदस्यता का बुनियादी प्लान या ऑफ़र खरीदना होगा.
- लोगों को मौजूदा बिलिंग अवधि बदलने की अनुमति दी जा सकती है. जैसे, हर महीने के प्लान से सालाना प्लान पर स्विच करना.
- आपके पास उपयोगकर्ताओं को, अपने-आप रिन्यू होने वाले और प्रीपेड प्लान के बीच स्विच करने की अनुमति देने का विकल्प भी होता है.
जब उपयोगकर्ता अपनी सदस्यता को अपग्रेड, डाउनग्रेड या बदल देते हैं, तब आपको बदलाव का तरीका तय करना होता है. इससे यह तय होता है कि मौजूदा बिलिंग अवधि के लिए, सदस्यता के बचे हुए दिनों का शुल्क कैसे लागू किया जाएगा. साथ ही, यह भी तय होता है कि उपयोगकर्ताओं के लिए एनटाइटलमेंट में बदलाव कब होगा.
Play Billing Library, इस व्यवहार को कंट्रोल करने के लिए कई ReplacementMode विकल्प उपलब्ध कराती है.
बदलाव करने के लिए उपलब्ध मोड
WITH_TIME_PRORATION: सदस्यता वाले आइटम को तुरंत अपग्रेड या डाउनग्रेड कर दिया जाता है. बचे हुए समय को कीमत के अंतर के हिसाब से अडजस्ट किया जाता है. इसके बाद, अगली बिलिंग की तारीख अपडेट करके, उसे नई सदस्यता के लिए क्रेडिट कर दिया जाता है. यह डिफ़ॉल्ट सेटिंग है.CHARGE_PRORATED_PRICE: सदस्यता को तुरंत अपग्रेड कर दिया जाता है और बिलिंग साइकल पहले जैसा ही रहता है. इसके बाद, उपयोगकर्ता से बचे हुए समय के लिए कीमत का अंतर लिया जाता है.CHARGE_FULL_PRICE: सदस्यता वाले आइटम को तुरंत अपग्रेड या डाउनग्रेड कर दिया जाता है. साथ ही, उपयोगकर्ता से इस नए एनटाइटलमेंट के लिए पूरी कीमत तुरंत ले ली जाती है. पिछली सदस्यता की बची हुई वैल्यू को उसी एनटाइटलमेंट के लिए आगे बढ़ाया जाता है. इसके अलावा, किसी दूसरे एनटाइटलमेंट पर स्विच करने पर, बची हुई वैल्यू को समय के हिसाब से बांटा जाता है.WITHOUT_PRORATION: सदस्यता आइटम को तुरंत अपग्रेड या डाउनग्रेड कर दिया जाता है. साथ ही, सदस्यता रिन्यू होने पर नया शुल्क लिया जाता है. बिलिंग साइकल में कोई बदलाव नहीं होता.DEFERRED: सदस्यता को अपग्रेड या डाउनग्रेड सिर्फ़ तब किया जाता है, जब सदस्यता रिन्यू होती है.
5. WITH_TIME_PRORATION
इस मोड में, सदस्यता वाले आइटम को तुरंत अपग्रेड या डाउनग्रेड कर दिया जाता है. बचा हुआ समय, कीमत के अंतर के हिसाब से अडजस्ट किया जाता है. साथ ही, अगली बिलिंग की तारीख को आगे बढ़ाकर, नई सदस्यता में क्रेडिट कर दिया जाता है. यह डिफ़ॉल्ट व्यवहार है.
उदाहरण के तौर पर
किसी व्यक्ति ने 15 अप्रैल को Basic प्लान (4.99 डॉलर/महीना) से Premium प्लान (9.99 डॉलर/महीना) पर स्विच किया. यह तारीख, उसके मासिक बिलिंग साइकल के बीच में पड़ती है.
इस उदाहरण में:
- उपयोगकर्ता को Premium प्लान का ऐक्सेस तुरंत मिल जाता है.
- Google Play, रिफ़ंड की अवधि का हिसाब अपने-आप लगाता है. मान लें कि Play को लगता है कि Basic प्लान के बचे हुए 15 दिनों की कीमत, Premium प्लान के सात दिनों की कीमत के बराबर है. ऐसे में, बिलिंग की अगली तारीख 21 अप्रैल हो जाएगी.
- उपयोगकर्ता को तुरंत पेमेंट करने की ज़रूरत नहीं है.
कोड स्निपेट
// ProductDetails for the plan to be switched to
ProductDetails productDetails = ...;
// The specific offer token for the toBeSwitched plan's base plan
String offerToken = "...";
// The purchase token of the user's current subscription
String oldPurchaseToken = "...";
// The productId for the user's current subscription
String oldProductId = "...";
// The replacementMode to replace the user's subscription
int replacementMode = SubscriptionProductReplacementParams.ReplacementMode.WITH_TIME_PRORATION;
SubscriptionProductReplacementParams subscriptionProductReplacementParams =
SubscriptionProductReplacementParams.newBuilder()
.setOldProductId(oldProductId)
.setReplacementMode(replacementMode)
.build();
ProductDetailsParams productDetailsParams =
ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.setSubscriptionProductReplacementParams(subscriptionProductReplacementParams)
.setOfferToken(offerToken)
.build();
List<ProductDetailsParams> productDetailsParamsList = ImmutableList.of(productDetailsParams);
BillingFlowParams billingFlowParams =
BillingFlowParams.newBuilder()
.setProductDetailsParamsList(productDetailsParamsList)
.setSubscriptionUpdateParams(
SubscriptionUpdateParams.newBuilder().setOldPurchaseToken(oldPurchaseToken).build())
.build();
billingClient.launchBillingFlow(activity, billingFlowParams);
WITH_TIME_PRORATION के साथ अपग्रेड करें
इस उदाहरण को समझने के लिए:
- सैंपल ऐप्लिकेशन के
MainActivityमें, कोड स्निपेट में मौजूदreplacementModeकोSubscriptionProductReplacementParams.ReplacementMode.WITH_TIME_PRORATIONपर अपडेट करें. - ऐप्लिकेशन को फिर से बनाएं और लॉन्च करें.
- Google Play Store से, मौजूदा सदस्यताएं रद्द करें.
- बेसिक प्लान खरीदें.
- Premium प्लान पर स्विच करें.
उपयोगकर्ता के एनटाइटलमेंट को तुरंत Premium प्लान पर अपग्रेड कर दिया जाता है. उपयोगकर्ता को तुरंत $0.00 का पेमेंट करना होगा. बुनियादी प्लान की बची हुई अवधि को, Premium प्लान में जोड़ दिया जाता है. इससे रिन्यूअल की अगली तारीख पहले की तारीख पर आ जाती है. उपयोगकर्ता से, बिलिंग की नई तारीख पर रिन्यूअल के लिए 9.99 डॉलर का शुल्क लिया जाएगा.
WITH_TIME_PRORATION के साथ डाउनग्रेड करें
इस उदाहरण को समझने के लिए:
- सैंपल ऐप्लिकेशन के
MainActivityमें, कोड स्निपेट में मौजूदreplacementModeकोSubscriptionProductReplacementParams.ReplacementMode.WITH_TIME_PRORATIONपर अपडेट करें. - ऐप्लिकेशन को फिर से बनाएं और लॉन्च करें.
- Google Play Store से, मौजूदा सदस्यताएं रद्द करें.
- बेसिक प्लान खरीदें.
- Lite प्लान पर स्विच करें.
उपयोगकर्ता के एनटाइटलमेंट को तुरंत Lite प्लान पर डाउनग्रेड कर दिया जाता है. आपको तुरंत 0.00 डॉलर चुकाने हैं. Basic प्लान की बची हुई अवधि को, Lite प्लान की अवधि में जोड़ दिया जाता है. इससे, रिन्यूअल की अगली तारीख काफ़ी आगे बढ़ जाती है. उपयोगकर्ता से, नई बिलिंग की तारीख पर रिन्यूअल के लिए 2.99 डॉलर का शुल्क लिया जाएगा.
नतीजा
इस सेक्शन में, आपने सीखा कि WITH_TIME_PRORATION, कीमत में अंतर के आधार पर, अगली रिन्यूअल की तारीख को अडजस्ट करके, बिना किसी शुल्क के उपयोगकर्ता के एनटाइटलमेंट में कैसे बदलाव करता है. यह उपयोगकर्ताओं को अपग्रेड या डाउनग्रेड करने की एक असरदार डिफ़ॉल्ट रणनीति है.
6. CHARGE_PRORATED_PRICE
बदलाव वाले इस मोड में, सदस्यता वाले आइटम को तुरंत अपग्रेड कर दिया जाता है. हालांकि, बिलिंग साइकल में कोई बदलाव नहीं होता. इसके बाद, उपयोगकर्ता से बचे हुए समय के लिए कीमत का अंतर लिया जाता है.
ध्यान दें: यह विकल्प सिर्फ़ सदस्यता वाले ऐसे आइटम को अपग्रेड करने के लिए उपलब्ध है जिसमें समय के हिसाब से कीमत बढ़ जाती है.
उदाहरण के तौर पर
मान लें कि किसी व्यक्ति ने 20 अप्रैल को Basic प्लान (हर महीने 4.99 डॉलर) से Premium प्लान (हर महीने 9.99 डॉलर) पर अपग्रेड किया है. उसके मौजूदा प्लान के बिलिंग साइकल में 10 दिन बचे हैं.
इस उदाहरण में:
- उपयोगकर्ता को Premium प्लान का ऐक्सेस तुरंत मिल जाता है.
- उपयोगकर्ता से, मौजूदा बिलिंग साइकल के बचे हुए 10 दिनों के लिए, इस्तेमाल की अवधि के हिसाब से शुल्क तुरंत ले लिया जाता है. यह रकम करीब 2.99 डॉलर है. यह Premium प्लान के 10 दिनों के शुल्क के बराबर है.
- उपयोगकर्ता के लिए बिलिंग की तारीख़ में कोई बदलाव नहीं होता.
कोड स्निपेट
// ProductDetails for the plan to be switched to
ProductDetails productDetails = ...;
// The specific offer token for the toBeSwitched plan's base plan
String offerToken = "...";
// The purchase token of the user's current subscription
String oldPurchaseToken = "...";
// The productId for the user's current subscription
String oldProductId = "...";
// The replacementMode to replace the user's subscription
int replacementMode = SubscriptionProductReplacementParams.ReplacementMode.CHARGE_PRORATED_PRICE;
SubscriptionProductReplacementParams subscriptionProductReplacementParams =
SubscriptionProductReplacementParams.newBuilder()
.setOldProductId(oldProductId)
.setReplacementMode(replacementMode)
.build();
ProductDetailsParams productDetailsParams =
ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.setSubscriptionProductReplacementParams(subscriptionProductReplacementParams)
.setOfferToken(offerToken)
.build();
List<ProductDetailsParams> productDetailsParamsList = ImmutableList.of(productDetailsParams);
BillingFlowParams billingFlowParams =
BillingFlowParams.newBuilder()
.setProductDetailsParamsList(productDetailsParamsList)
.setSubscriptionUpdateParams(
SubscriptionUpdateParams.newBuilder().setOldPurchaseToken(oldPurchaseToken).build())
.build();
billingClient.launchBillingFlow(activity, billingFlowParams);
CHARGE_PRORATED_PRICE के साथ अपग्रेड करें
इस उदाहरण को समझने के लिए:
- सैंपल ऐप्लिकेशन के
MainActivityमें, कोड स्निपेट में मौजूदreplacementModeकोSubscriptionProductReplacementParams.ReplacementMode.CHARGE_PRORATED_PRICEपर अपडेट करें. - ऐप्लिकेशन को फिर से बनाएं और लॉन्च करें.
- Google Play Store से, मौजूदा सदस्यताएं रद्द करें.
- बेसिक प्लान खरीदें.
- Premium प्लान पर स्विच करें.
उपयोगकर्ता को Premium प्लान में तुरंत अपग्रेड कर दिया जाता है. हालांकि, सदस्यता रिन्यू करने की तारीख वही रहती है जो पहले थी. आपको मौजूदा साइकल के बचे हुए दिनों के लिए, प्रीमियम और बेसिक प्लान की कीमतों के बीच के अंतर का हिसाब करके, तुरंत पेमेंट करना होगा. रिन्यूअल की तारीख पर, उपयोगकर्ता से Premium की सदस्यता रिन्यू करने के लिए 9.99 डॉलर का पूरा शुल्क लिया जाएगा.
CHARGE_PRORATED_PRICE का इस्तेमाल करके सदस्यता को डाउनग्रेड करना
इस उदाहरण को समझने के लिए:
- सैंपल ऐप्लिकेशन के
MainActivityमें, कोड स्निपेट में मौजूदreplacementModeकोSubscriptionProductReplacementParams.ReplacementMode.CHARGE_PRORATED_PRICEपर अपडेट करें. - ऐप्लिकेशन को फिर से बनाएं और लॉन्च करें.
- Google Play Store से, मौजूदा सदस्यताएं रद्द करें.
- बेसिक प्लान खरीदें.
- Lite प्लान पर स्विच करें.
इस मोड को बदलने पर, डाउनग्रेड के दौरान गड़बड़ी होती है. ऐसा इसलिए होता है, क्योंकि यह सिर्फ़ सदस्यता आइटम के उन अपग्रेड के लिए उपलब्ध है जिनमें समय के हिसाब से कीमत बढ़ती है. बिलिंग फ़्लो पूरा नहीं होगा. साथ ही, उपयोगकर्ता को एक गड़बड़ी का मैसेज दिखेगा. इसमें बताया जाएगा कि डाउनग्रेड करने के लिए, प्रोरेटेड मोड काम नहीं करता.
नतीजा
इस सेक्शन में बताया गया है कि CHARGE_PRORATED_PRICE की मदद से, सदस्यता को तुरंत अपग्रेड कैसे किया जा सकता है. इसके लिए, उपयोगकर्ताओं से बिलिंग की बची हुई अवधि के लिए, दोनों प्लान के बीच के अंतर के बराबर शुल्क लिया जाता है. साथ ही, बिलिंग साइकल में कोई बदलाव नहीं किया जाता. यह तब काम आता है, जब उपयोगकर्ता को बिलिंग की तारीख बदले बिना, ज़्यादा कीमत वाले टियर पर अपग्रेड करना हो.
7. CHARGE_FULL_PRICE
इस मोड में, सदस्यता वाले आइटम को तुरंत अपग्रेड या डाउनग्रेड कर दिया जाता है. साथ ही, उपयोगकर्ता से नए एनटाइटलमेंट के लिए पूरा शुल्क तुरंत ले लिया जाता है. पिछली सदस्यता की बची हुई वैल्यू को उसी एनटाइटलमेंट के लिए आगे बढ़ाया जाता है. इसके अलावा, किसी दूसरे एनटाइटलमेंट पर स्विच करने पर, बची हुई वैल्यू को समय के हिसाब से बांटा जाता है.
उदाहरण के तौर पर
उपयोगकर्ता ने Basic प्लान लिया है. इसकी कीमत 1 अप्रैल से 4.99 डॉलर/महीना है. उपयोगकर्ता को 20 अप्रैल को, Premium प्लान (9.99 डॉलर प्रति माह) पर स्विच करना है.
इस उदाहरण में:
- उपयोगकर्ता से Premium प्लान (9.99 डॉलर) का पूरा शुल्क तुरंत लिया जाता है.
- बुनियादी प्लान की बची हुई वैल्यू (जैसे, 10 दिनों की वैल्यू) को प्रीमियम प्लान की समतुल्य अवधि में बदल दिया जाता है. इस उदाहरण में, 10 दिनों के लिए Basic प्लान की सदस्यता, पांच दिनों के लिए Premium प्लान की सदस्यता के बराबर है.
- उपयोगकर्ता की सदस्यता रिन्यू होने की अगली तारीख को, इस आनुपातिक समय को शामिल करने के लिए अडजस्ट किया जाता है. इसलिए, सदस्यता रिन्यू करने की तारीख 25 मई (20 अप्रैल + 1 महीना + 5 दिन) हो जाएगी.
- इसके बाद होने वाले रिन्यूअल के लिए, हर महीने 25 मई से शुल्क लिया जाएगा.
कोड स्निपेट
// ProductDetails for the plan to be switched to
ProductDetails productDetails = ...;
// The specific offer token for the toBeSwitched plan's base plan
String offerToken = "...";
// The purchase token of the user's current subscription
String oldPurchaseToken = "...";
// The productId for the user's current subscription
String oldProductId = "...";
// The replacementMode to replace the user's subscription
int replacementMode = SubscriptionProductReplacementParams.ReplacementMode.CHARGE_FULL_PRICE;
SubscriptionProductReplacementParams subscriptionProductReplacementParams =
SubscriptionProductReplacementParams.newBuilder()
.setOldProductId(oldProductId)
.setReplacementMode(replacementMode)
.build();
ProductDetailsParams productDetailsParams =
ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.setSubscriptionProductReplacementParams(subscriptionProductReplacementParams)
.setOfferToken(offerToken)
.build();
List<ProductDetailsParams> productDetailsParamsList = ImmutableList.of(productDetailsParams);
BillingFlowParams billingFlowParams =
BillingFlowParams.newBuilder()
.setProductDetailsParamsList(productDetailsParamsList)
.setSubscriptionUpdateParams(
SubscriptionUpdateParams.newBuilder().setOldPurchaseToken(oldPurchaseToken).build())
.build();
billingClient.launchBillingFlow(activity, billingFlowParams);
CHARGE_FULL_PRICE के साथ अपग्रेड करें
इस उदाहरण को समझने के लिए:
- सैंपल ऐप्लिकेशन के
MainActivityमें, कोड स्निपेट में मौजूदreplacementModeकोSubscriptionProductReplacementParams.ReplacementMode.CHARGE_FULL_PRICEपर अपडेट करें. - ऐप्लिकेशन को फिर से बनाएं और लॉन्च करें.
- Google Play Store से, मौजूदा सदस्यताएं रद्द करें.
- बेसिक प्लान खरीदें.
- Premium प्लान पर स्विच करें.
उपयोगकर्ता को तुरंत Premium प्लान पर अपग्रेड कर दिया जाता है. आपको Premium प्लान के लिए, 9.99 डॉलर का पूरा शुल्क तुरंत चुकाना होगा. बुनियादी प्लान की बची हुई वैल्यू को नए Premium प्लान में बदल दिया जाता है. इससे, रिन्यूअल की पहली तारीख थोड़ी बढ़ जाती है. इसके बाद, रिन्यूअल के लिए हर बार 9.99 डॉलर चुकाने होंगे.
CHARGE_FULL_PRICE के साथ डाउनग्रेड करें
इस उदाहरण को समझने के लिए:
- सैंपल ऐप्लिकेशन के
MainActivityमें, कोड स्निपेट में मौजूदreplacementModeकोSubscriptionProductReplacementParams.ReplacementMode.CHARGE_FULL_PRICEपर अपडेट करें. - ऐप्लिकेशन को फिर से बनाएं और लॉन्च करें.
- Google Play Store से, मौजूदा सदस्यताएं रद्द करें.
- बेसिक प्लान खरीदें.
- Lite प्लान पर स्विच करें.
उपयोगकर्ता को तुरंत Lite प्लान पर डाउनग्रेड कर दिया जाता है और एक नई बिलिंग साइकल शुरू हो जाती है. आपको तुरंत 2.99 डॉलर चुकाने होंगे. यह टारगेट की पूरी कीमत है. Basic प्लान के इस्तेमाल नहीं किए गए हिस्से को नए Lite प्लान में बदल दिया जाता है. इससे, प्लान रिन्यू करने की पहली तारीख आगे बढ़ जाती है. इसके बाद, रिन्यूअल के लिए हर बार 2.99 डॉलर चुकाने होंगे.
नतीजा
इस सेक्शन में, हमने बताया है कि स्विच करने के दिन, CHARGE_FULL_PRICE उपयोगकर्ता से पूरा शुल्क कैसे लेता है. साथ ही, नई बिलिंग साइकल तुरंत शुरू हो जाती है. पिछले प्लान का बचा हुआ बैलेंस, अगले रिन्यूअल की तारीख तक लागू होता है.
8. WITHOUT_PRORATION
इस मोड में, सदस्यता वाले आइटम को तुरंत अपग्रेड या डाउनग्रेड कर दिया जाता है. साथ ही, सदस्यता रिन्यू होने पर नई कीमत ली जाती है.
उदाहरण के तौर पर
उपयोगकर्ता ने Basic प्लान लिया है. इसकी कीमत 1 अप्रैल से 4.99 डॉलर/महीना है. उपयोगकर्ता को 20 अप्रैल को, Premium प्लान (9.99 डॉलर प्रति माह) पर स्विच करना है.
इस उदाहरण में:
- उपयोगकर्ता को Premium प्लान का ऐक्सेस तुरंत मिल जाता है.
- सदस्यता रिन्यू करने की अगली तारीख (1 मई) तक, उपयोगकर्ता को 9.99 डॉलर का ज़्यादा शुल्क नहीं देना होगा.
कोड स्निपेट
// ProductDetails for the plan to be switched to
ProductDetails productDetails = ...;
// The specific offer token for the toBeSwitched plan's base plan
String offerToken = "...";
// The purchase token of the user's current subscription
String oldPurchaseToken = "...";
// The productId for the user's current subscription
String oldProductId = "...";
// The replacementMode to replace the user's subscription
int replacementMode = SubscriptionProductReplacementParams.ReplacementMode.WITHOUT_PRORATION;
SubscriptionProductReplacementParams subscriptionProductReplacementParams =
SubscriptionProductReplacementParams.newBuilder()
.setOldProductId(oldProductId)
.setReplacementMode(replacementMode)
.build();
ProductDetailsParams productDetailsParams =
ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.setSubscriptionProductReplacementParams(subscriptionProductReplacementParams)
.setOfferToken(offerToken)
.build();
List<ProductDetailsParams> productDetailsParamsList = ImmutableList.of(productDetailsParams);
BillingFlowParams billingFlowParams =
BillingFlowParams.newBuilder()
.setProductDetailsParamsList(productDetailsParamsList)
.setSubscriptionUpdateParams(
SubscriptionUpdateParams.newBuilder().setOldPurchaseToken(oldPurchaseToken).build())
.build();
billingClient.launchBillingFlow(activity, billingFlowParams);
WITHOUT_PRORATION का इस्तेमाल करके अपग्रेड करना
इस उदाहरण को समझने के लिए:
- सैंपल ऐप्लिकेशन के
MainActivityमें, कोड स्निपेट में मौजूदreplacementModeकोSubscriptionProductReplacementParams.ReplacementMode.WITHOUT_PRORATIONपर अपडेट करें. - ऐप्लिकेशन को फिर से बनाएं और लॉन्च करें.
- Google Play Store से, मौजूदा सदस्यताएं रद्द करें.
- बेसिक प्लान खरीदें.
- Premium प्लान पर स्विच करें.
उपयोगकर्ता को तुरंत Premium प्लान पर अपग्रेड कर दिया जाता है. साथ ही, रिन्यूअल की मौजूदा तारीख को भी बरकरार रखा जाता है. आपको तुरंत 0.00 डॉलर चुकाने हैं. उपयोगकर्ता के पास, मौजूदा साइकल के बचे हुए समय के लिए Premium प्लान का ऐक्सेस है. इसके बाद, बिलिंग की अगली तारीख को उसे रिन्यूअल के लिए 9.99 डॉलर चुकाने होंगे.
WITHOUT_PRORATION के साथ डाउनग्रेड करना
इस उदाहरण को समझने के लिए:
- सैंपल ऐप्लिकेशन के
MainActivityमें, कोड स्निपेट में मौजूदreplacementModeकोSubscriptionProductReplacementParams.ReplacementMode.WITHOUT_PRORATIONपर अपडेट करें. - ऐप्लिकेशन को फिर से बनाएं और लॉन्च करें.
- Google Play Store से, मौजूदा सदस्यताएं रद्द करें.
- बेसिक प्लान खरीदें.
- Lite प्लान पर स्विच करें.
उपयोगकर्ता को तुरंत Lite प्लान पर डाउनग्रेड कर दिया जाता है. साथ ही, उसे Basic प्लान की उन सुविधाओं का ऐक्सेस नहीं मिलता जिनके लिए उसने शुल्क चुकाया था. आपको तुरंत 0.00 डॉलर चुकाने हैं. बिलिंग साइकल में कोई बदलाव नहीं होगा. साथ ही, उपयोगकर्ता से रिन्यूअल की अगली तारीख पर, 2.99 डॉलर का नया शुल्क लिया जाएगा.
नतीजा
इस सेक्शन में बताया गया है कि WITHOUT_PRORATION, बिलिंग साइकल में कोई बदलाव किए बिना, चेकआउट के लिए शुल्क लिए बिना, उपयोगकर्ता के एनटाइटलमेंट को तुरंत कैसे बदल देता है.
9. DEFERRED
बदलाव के इस मोड में, सदस्यता को सिर्फ़ तब अपग्रेड या डाउनग्रेड किया जाता है, जब सदस्यता रिन्यू होती है. हालांकि, नई खरीदारी तुरंत जारी कर दी जाती है. मौजूदा आइटम को रिन्यू नहीं किया जा सकता. यह मौजूदा बिलिंग साइकल के खत्म होने पर खत्म हो जाएगा. वहीं, नए एनटाइटलमेंट का अनुरोध करने पर, यह तुरंत शुरू हो जाएगा.
उदाहरण के तौर पर
उपयोगकर्ता ने Basic प्लान लिया है. इसकी कीमत 1 अप्रैल से 4.99 डॉलर/महीना है. उपयोगकर्ता को 20 अप्रैल को, Premium प्लान (9.99 डॉलर प्रति माह) पर स्विच करना है.
इस उदाहरण में:
- उपयोगकर्ता से तुरंत कोई शुल्क नहीं लिया जाता.
- उपयोगकर्ता को मौजूदा बिलिंग साइकल (30 अप्रैल) के खत्म होने तक, Basic प्लान की सुविधाएं मिलती रहेंगी.
- सदस्यता प्लान, रिन्यूअल की अगली तारीख (1 मई) को अपने-आप Premium में अपग्रेड हो जाएगा.
कोड स्निपेट
// ProductDetails for the plan to be switched to
ProductDetails productDetails = ...;
// The specific offer token for the toBeSwitched plan's base plan
String offerToken = "...";
// The purchase token of the user's current subscription
String oldPurchaseToken = "...";
// The productId for the user's current subscription
String oldProductId = "...";
// The replacementMode to replace the user's subscription
int replacementMode = SubscriptionProductReplacementParams.ReplacementMode.DEFERRED;
SubscriptionProductReplacementParams subscriptionProductReplacementParams =
SubscriptionProductReplacementParams.newBuilder()
.setOldProductId(oldProductId)
.setReplacementMode(replacementMode)
.build();
ProductDetailsParams productDetailsParams =
ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.setSubscriptionProductReplacementParams(subscriptionProductReplacementParams)
.setOfferToken(offerToken)
.build();
List<ProductDetailsParams> productDetailsParamsList = ImmutableList.of(productDetailsParams);
BillingFlowParams billingFlowParams =
BillingFlowParams.newBuilder()
.setProductDetailsParamsList(productDetailsParamsList)
.setSubscriptionUpdateParams(
SubscriptionUpdateParams.newBuilder().setOldPurchaseToken(oldPurchaseToken).build())
.build();
billingClient.launchBillingFlow(activity, billingFlowParams);
DEFERRED का इस्तेमाल करके अपग्रेड करना
इस उदाहरण को समझने के लिए:
- सैंपल ऐप्लिकेशन के
MainActivityमें, कोड स्निपेट में मौजूदreplacementModeकोSubscriptionProductReplacementParams.ReplacementMode.DEFERREDपर अपडेट करें. - ऐप्लिकेशन को फिर से बनाएं और लॉन्च करें.
- Google Play Store से, मौजूदा सदस्यताएं रद्द करें.
- बेसिक प्लान खरीदें.
- Premium प्लान पर स्विच करें.
मौजूदा बिलिंग साइकल खत्म होने तक, उपयोगकर्ता Basic प्लान पर बना रहेगा. आपको तुरंत 0.00 डॉलर चुकाने हैं. रिन्यूअल की तारीख पर, उनकी सदस्यता Premium प्लान में अपग्रेड हो जाएगी. साथ ही, उनसे रिन्यूअल के लिए 9.99 डॉलर का नया शुल्क लिया जाएगा.
DEFERRED के साथ डाउनग्रेड करना
इस उदाहरण को समझने के लिए:
- सैंपल ऐप्लिकेशन के
MainActivityमें, कोड स्निपेट में मौजूदreplacementModeकोSubscriptionProductReplacementParams.ReplacementMode.DEFERREDपर अपडेट करें. - ऐप्लिकेशन को फिर से बनाएं और लॉन्च करें.
- Google Play Store से, मौजूदा सदस्यताएं रद्द करें.
- बेसिक प्लान खरीदें.
- Lite प्लान पर स्विच करें.
मौजूदा बिलिंग साइकल खत्म होने तक, उपयोगकर्ता Basic प्लान पर बना रहेगा. आपको तुरंत 0.00 डॉलर चुकाने हैं. रिन्यूअल की तारीख पर, उनकी सदस्यता Lite प्लान में अपग्रेड हो जाएगी. साथ ही, उनसे रिन्यूअल के लिए 2.99 डॉलर का नया शुल्क लिया जाएगा.
नतीजा
इस सेक्शन में बताया गया है कि DEFERRED रिप्लेसमेंट मोड, किसी सक्रिय उपयोगकर्ता के लिए अपग्रेड या डाउनग्रेड को तब तक के लिए टाल देता है, जब तक कि पैसे चुकाकर ली गई उसकी सदस्यता खत्म नहीं हो जाती. इसलिए, यह सुविधा खास तौर पर सदस्यता को डाउनग्रेड करने के लिए सबसे सही है. इससे, पहले से खरीदी गई सुविधाओं का ऐक्सेस नहीं खोता है.
10. बैकएंड और क्लाइंट-साइड प्रोसेसिंग
जब कोई उपयोगकर्ता सदस्यता बदलने की प्रोसेस पूरी कर लेता है, तो पक्का करें कि आपका ऐप्लिकेशन और बैकएंड, दोनों इस बदलाव को सही तरीके से हैंडल करें. इससे सेवा में रुकावट आने या दो बार बिलिंग होने जैसी समस्याओं से बचा जा सकता है.
उदाहरण
- उपयोगकर्ता के पास बुनियादी हर महीने का प्लान है. इसका प्रॉडक्ट आईडी
basic_planऔर परचेज़ टोकनbasic_purchase_token_123है. - जब कोई उपयोगकर्ता, तुरंत सदस्यता बदलने के मोड (
WITHOUT_PRORATION,WITH_TIME_PRORATION,CHARGE_PRORATED_PRICE,CHARGE_FULL_PRICEमें से कोई एक) का इस्तेमाल करके Premium प्लान पर स्विच करता है - सदस्यता स्विच करने की प्रोसेस पूरी होने के बाद, Google इसे नई सदस्यता के तौर पर मानता है. साथ ही, Premium प्लान (product_id
premium_planऔर purchase_tokenpremium_purchase_token_123) के लिए एक नया और अलग परचेज़ टोकन बनाता है.
क्लाइंट-साइड प्रोसेसिंग
onPurchasesUpdated
जब खरीदारी पूरी हो जाती है, तब PurchasesUpdatedListener ट्रिगर होता है. यह स्विच करने की सुविधा है. हालांकि, Google Play, Premium प्लान को नई खरीदारी के तौर पर मानता है.
ऐप्लिकेशन को एक Purchase ऑब्जेक्ट मिलेगा. इसमें premium_purchase_token_123 खरीदारी का टोकन और product_id premium_plan शामिल होगा. आपको इस उपयोगकर्ता को नए सदस्य की तरह ही मानना होगा: टोकन की पुष्टि करें और ऐक्सेस देने की तैयारी करें
@Override
public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
if (billingResult.getResponseCode() == BillingResponseCode.OK && purchases != null) {
for (Purchase purchase : purchases) {
// purchase.getPurchaseToken() = premium_purchase_token_123
// purchase.getProducts() will contain premium_plan
// Verify the purchase and grant entitlement
handleNewPurchase(purchase);
}
}
}
queryPurchasesAsync
queryPurchasesAsync सिर्फ़ आपके ऐप्लिकेशन से खरीदी गई चालू सदस्यताएं दिखाता है. आपको इस तरीके का इस्तेमाल करके यह तय करना चाहिए कि उपयोगकर्ता को कौनसी एनटाइटलमेंट दिखानी है. तुरंत सदस्यता बदलने पर, queryPurchasesAsync() पुराने BASIC सदस्यता के परचेज़ टोकन को वापस नहीं करेगा. अब सिर्फ़ नए PREMIUM सदस्यता के परचेज़ टोकन को वापस किया जाएगा.
जब भी आपका ऐप्लिकेशन फिर से शुरू हो या खरीदारी पूरी हो जाए, तब इस तरीके को कॉल करें. अगर Premium टोकन मौजूद है, तो तुरंत Premium की सुविधाएं चालू करें और Basic की सुविधाएं बंद करें.
बैकएंड प्रोसेसिंग (आरटीडीएन)
जब सदस्यता बदली जाती है, तब Google Play, कॉन्फ़िगर किए गए Pub/Sub topic पर डेवलपर से जुड़ी रीयल-टाइम सूचना (आरटीडीएन) भेजता है.
- डिवाइस तुरंत बदलने के मामले में, Google नए खरीदारी टोकन के साथ
SUBSCRIPTION_PURCHASEDआरटीडीएन भेजता है.आरटीडीएन पेलोड का सैंपल{ "version":"1.0", "packageName":"com.google.play.billing.samples.subscriptions", "eventTimeMillis":"...", "subscriptionNotification": { "version":"1.0", "notificationType":4, // SUBSCRIPTION_PURCHASED "purchaseToken":"premium_purchase_token_123" //purchase token for the new subscription } } - जब आपका सर्वर, RTDN से नया परचेज़ टोकन पाता है, तो खरीदारी की जानकारी पाने के लिए, नए परचेज़ टोकन के साथ
purchases.subscriptionsV2एपीआई को कॉल करें. एपीआई रिस्पॉन्स मेंlinkedPurchaseTokenफ़ील्ड होता है. इसका इस्तेमाल यह पता लगाने के लिए किया जाता है कि परचेज़ टोकन, नई सदस्यता की खरीदारी या सदस्यता बदलने से जुड़ा है या नहीं. - सदस्यता बदलने के मामले में,
linkedPurchaseTokenका मतलब पुरानी सदस्यता के परचेज़ टोकन से है. इस उदाहरण में, यहbasic_purchase_token_123होगा.GET purchases.subscriptionsV2रिस्पॉन्स का उदाहरणcurl \ 'https://androidpublisher.googleapis.com/androidpublisher/v3/applications/<application_id>/purchases/subscriptionsv2/tokens/premium_purchase_token_123' \ --header 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' \ --header 'Accept: application/json' { "kind": "androidpublisher#subscriptionPurchaseV2", "startTime": "...", "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE", "latestOrderId": "GPA.<order_id>", "linkedPurchaseToken": "basic_purchase_token_123", // The purchase token of the subscription that was replaced (Basic Plan in this case) "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED", "lineItems": [ { "productId": "premium_plan", // productID of the new subscription (Premium Plan in this case) "expiryTime": "....", "autoRenewingPlan": {...}, "offerDetails": { "basePlanId": "monthly-auto-renewing" // base plan ID of the new subscription }, "itemReplacement": { // Details about the subscription replacement "productId": "subscription_basic", // productID of the old subscription (Basic Plan in this case) "replacementMode": "CHARGE_PRORATED_PRICE", // Replacement strategy used for this subscription change "basePlanId": "monthly-auto-renewing" // base plan ID of the old subscription }, "offerPhase": {...} } ], "etag": "<etag_value>" } - आपको Premium की नई सदस्यता खरीदने की पुष्टि ज़रूर करनी होगी. यह काम, आपके ऐप्लिकेशन में या बैकएंड पर किया जा सकता है. अगर तीन दिनों के अंदर खरीदारी की पुष्टि नहीं की जाती है, तो आपको रिफ़ंड मिल जाएगा और एनटाइटलमेंट रद्द कर दिया जाएगा. खरीदारियों को प्रोसेस करने और उनकी पुष्टि करने के बारे में ज़्यादा जानकारी के लिए, डेवलपर दस्तावेज़ देखें.
नतीजा
इस सेक्शन में, क्लाइंट और आपके बैकएंड, दोनों पर सदस्यता बदलने की प्रोसेस को तुरंत पूरा करने का तरीका बताया गया है. आपको पता चला कि Google Play, नए प्लान को बिलकुल नई खरीदारी मानता है और इसके लिए नया परचेज़ टोकन जारी करता है. क्लाइंट पर, आपको इस नई खरीदारी को PurchasesUpdatedListener का इस्तेमाल करके प्रोसेस करना होगा. साथ ही, queryPurchasesAsync से मिले जवाब के आधार पर एनटाइटलमेंट अपडेट करने होंगे. बैकएंड पर, आपको नए टोकन के लिए SUBSCRIPTION_PURCHASED आरटीडीएन सुनने चाहिए. साथ ही, पुरानी सदस्यता के linkedPurchaseToken की पहचान करने के लिए, purchases.subscriptionsv2 एपीआई का इस्तेमाल करना चाहिए. इसके अलावा, नया एनटाइटलमेंट देते समय, पुराने टोकन से जुड़े ऐक्सेस को तुरंत रद्द कर देना चाहिए. नई खरीदारी की पुष्टि करना न भूलें.
11. DEFERRED रिप्लेसमेंट प्रोसेस करना
सदस्यता को तुरंत बदलने के मोड के उलट, ReplacementMode.DEFERRED सदस्यता में बदलाव और एनटाइटलमेंट अपडेट को मौजूदा बिलिंग साइकल के खत्म होने तक टाल देता है. बदलाव को कुछ समय के लिए रोकने की सुविधा को मैनेज करने के लिए, खास लॉजिक की ज़रूरत होती है. इससे यह पक्का किया जा सकता है कि उपयोगकर्ताओं को सही समय पर सही एनटाइटलमेंट मिले.
उदाहरण
- उपयोगकर्ता के पास Basic हर महीने का प्लान है (प्रॉडक्ट आईडी
basic_planऔर परचेज़ टोकनbasic_purchase_token_123). यह 15 अप्रैल को रिन्यू होगा. - 1 अप्रैल को, उपयोगकर्ता
ReplacementMode.DEFERREDका इस्तेमाल करके Premium प्लान पर स्विच करने का फ़ैसला करता है. - Google, प्रीमियम प्लान (product_id
premium_planऔर purchase_tokenpremium_purchase_123) के लिए नया परचेज़ टोकन तुरंत बना देता है. हालांकि, उपयोगकर्ता से लिया जाने वाला शुल्क और एनटाइटलमेंट, 15 अप्रैल के लिए शेड्यूल किए जाते हैं.
बदलाव को बाद के लिए शेड्यूल करना
1. खरीदारी का फ़्लो पूरा होने के तुरंत बाद (ऐप्लिकेशन)
PurchasesUpdatedListenerको खरीदारी की प्रोसेस पूरी होने के बाद शुरू किया जाता है. ऐप्लिकेशन को एकPurchaseऑब्जेक्ट मिलेगा, जिसमें नया परचेज़ टोकनpremium_purchase_token_123होगा. हालांकि, product_id अब भी पुरानेbasic_planको रेफ़र करेगा, क्योंकि उपयोगकर्ता के पास सिर्फ़ Basic प्लान का एनटाइटलमेंट है. आपको इसे नई खरीदारी की तरह ही मानना होगा और टोकन की पुष्टि करनी होगी.@Override public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) { if (billingResult.getResponseCode() == BillingResponseCode.OK && purchases != null) { for (Purchase purchase : purchases) { // purchase.getPurchaseToken() = premium_purchase_token_123 // purchase.getProducts() will contain basic_plan // Verify and acknowledge the purchase handleNewPurchase(purchase); } } }queryPurchasesAsync, खरीदारी के नए टोकन (premium_purchase_token_123) के साथ खरीदारी को तुरंत वापस कर देता है. साथ ही, इससे जुड़ा मूल एनटाइटलमेंट (basic_plan) भी वापस कर देता है. उपयोगकर्ता को बुनियादी प्लान का एनटाइटलमेंट देने के लिए, इस पर भरोसा किया जा सकता है.
2. खरीदारी का फ़्लो पूरा होने के तुरंत बाद (बैकएंड)
- SUBSCRIPTION_PURCHASED आरटीडीएन, नए परचेज़ टोकन (
premium_purchase_token_123) के लिए खरीदारी के फ़्लो के तुरंत बाद भेजी जाती है. आरटीडीएन पेलोड का सैंपल{ "version":"1.0", "packageName":"com.google.play.billing.samples.subscriptions", "eventTimeMillis":"...", "subscriptionNotification": { "version":"1.0", "notificationType":4, // SUBSCRIPTION_PURCHASED "purchaseToken":"premium_purchase_token_123" //purchase token for the new subscription } } - खरीदारी की जानकारी पाने के लिए, नए परचेज़ टोकन के साथ
GET purchases.subscriptionsv2को कॉल करें. जवाब में दो लाइन आइटम शामिल हैं.- एक सदस्यता, पुराने प्लान (बुनियादी प्लान) को दिखाती है और इसकी
expiryTimeआने वाले समय में है. पुरानी सदस्यता रिन्यू नहीं की जाएगी. साथ ही, आपकोdeferredItemReplacementमिलेगा, जिसमें नई सदस्यता (प्रीमियम प्लान) शामिल होगी. इससे पता चलता है कि सदस्यता खत्म होने पर, नई सदस्यता को बदलने का अनुरोध किया गया है. - एक, नई खरीदी गई सदस्यता को दिखाता है. इसके लिए, 'expiryTime' की कोई वैल्यू सेट नहीं है
{ "kind": "androidpublisher#subscriptionPurchaseV2", "startTime": "2026-05-07T15:50:11.383Z", "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE", "latestOrderId": "GPA.<order_id>", "linkedPurchaseToken": "basic_purchase_token_123", "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED", "lineItems": [ { "productId": "premium_plan", // Premium Plan has no expiry time "autoRenewingPlan": {...}, "offerDetails": {...}, "itemReplacement": {. // Subscription replacement details "productId": "basic_plan", "replacementMode": "DEFERRED", "basePlanId": "monthly-auto-renewing" }, "offerPhase": {} }, { "productId": "basic_plan", // Subscription to be replaced "expiryTime": "2026-05-07T15:54:34.768Z", // Expiry time in the future "autoRenewingPlan": {}, "offerDetails": {...}, "deferredItemReplacement": { // identifier indicating this subscription will be replaced upon renewal "productId": "subscription_premium" }, "latestSuccessfulOrderId": "GPA.<order_id>", "itemReplacement": {...}, } ], "etag": "<etag>" } - एक सदस्यता, पुराने प्लान (बुनियादी प्लान) को दिखाती है और इसकी
- आपको नए परचेज़ टोकन की पुष्टि ज़रूर करनी चाहिए. यह काम, आपके ऐप्लिकेशन में या बैकएंड पर किया जा सकता है. खरीदारियों को प्रोसेस करने और उनकी पुष्टि करने के बारे में ज़्यादा जानकारी के लिए, डेवलपर दस्तावेज़ देखें.
- SUBSCRIPTION_EXPIRED वाला आरटीडीएन, खरीदारी के पुराने टोकन (
basic_purchase_token_123) के लिए भेजा जाता है. आरटीडीएन पेलोड का उदाहरण{ "version":"1.0", "packageName":"com.google.play.billing.samples.subscriptions", "eventTimeMillis":"...", "subscriptionNotification": { "version":"1.0", "notificationType":13, // SUBSCRIPTION_EXPIRED "purchaseToken":"basic_purchase_token_123" //purchase token for the old subscription } } - पुराने परचेज़ टोकन के साथ
GET purchases.subscriptionsv2एपीआई को कॉल करने पर, यह समयसीमा खत्म हो चुके (SUBSCRIPTION_STATE_EXPIRED) के तौर पर दिखता है. पुराने प्लान का एनटाइटलमेंट, बची हुई अवधि के लिए नई खरीदारी में ट्रांसफ़र कर दिया जाता है.
3. बदलाव की तारीख को - खरीदारी के फ़्लो के बाद पहला रिन्यूअल (ऐप्लिकेशन)
queryPurchasesAsync, खरीदारी को नए परचेज़ टोकन (premium_purchase_token_123) और उससे जुड़ी नई सदस्यता (premium_plan) के साथ वापस कर देता है.- खरीदारी की प्रोसेस पूरी होने पर, नई खरीदारी को पहले ही प्रोसेस कर दिया जाना चाहिए. आपको कोई खास कार्रवाई करने की ज़रूरत नहीं है. बस यह पक्का करें कि उपयोगकर्ता को सही सदस्यता का ऐक्सेस दिया गया हो.
4. बदले गए डिवाइस पर सदस्यता रिन्यू होने की तारीख - खरीदारी के फ़्लो के बाद पहली बार रिन्यू होने की तारीख (बैकएंड)
ReplacementMode.DEFERREDके साथ, पहले रिन्यूअल में वही तरीका अपनाया जाता है जोSUBSCRIPTION_RENEWEDआरटीडीएन प्रोसेस करने वाले किसी अन्य रिन्यूअल में अपनाया जाता है. ऐसा होने पर, आपको वैल्यू बदलने के लिए किसी खास लॉजिक की ज़रूरत नहीं होती.- खरीदारी की जानकारी पाने के लिए, नए परचेज़ टोकन के साथ
GET purchases.subscriptionsv2को कॉल करें. जवाब में दो लाइन आइटम शामिल हैं.- एक सदस्यता, पुरानी सदस्यता (बुनियादी प्लान) को दिखाती है और
expiryTimeकी तारीख बीत चुकी है. पुरानी सदस्यता के लिए,deferredItemReplacementफ़ील्ड की वैल्यू सेट नहीं की जाएगी. - एक, नई सदस्यता को दिखाता है. इसमें आने वाले समय में
expiryTimeऔरautoRenewEnabledफ़ील्ड कोtrueपर सेट किया गया है.
{ "kind": "androidpublisher#subscriptionPurchaseV2", "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE", "latestOrderId": "GPA.<order_id>..0", "linkedPurchaseToken": "basic_purchase_token_123", // purchase token of the old subscription "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED", "lineItems": [ { "productId": "premium_plan", // New subscription "expiryTime": "2026-05-07T16:00:09.437Z", // Expiry time set in the future "autoRenewingPlan": { "autoRenewEnabled": true, // Auto Renewing Flag set to True "recurringPrice": {...} }, "offerDetails": {...}, "latestSuccessfulOrderId": "GPA.<order_id>..0", "itemReplacement": {. // Details of the subscription replacement "productId": "basic_plan", "replacementMode": "DEFERRED", "basePlanId": "monthly-auto-renewing" }, "offerPhase": {...} }, { "productId": "basic_plan", // Old subscription, Does not contains the deferredItemReplacement field "expiryTime": "2026-05-07T15:54:34.768Z", // Expiry time set in the past "autoRenewingPlan": {}, "offerDetails": {...}, "latestSuccessfulOrderId": "GPA.<order_id>..0", "itemReplacement": {...}, } ], "etag": "<etag>" } - एक सदस्यता, पुरानी सदस्यता (बुनियादी प्लान) को दिखाती है और
नतीजा
इस सेक्शन में, ReplacementMode.DEFERRED के लिए ज़रूरी खास हैंडलिंग के बारे में बताया गया है. आपने जाना कि तुरंत लागू होने वाले मोड के उलट, एनटाइटलमेंट में बदलाव सिर्फ़ मौजूदा बिलिंग साइकल के खत्म होने पर होता है. इस सेक्शन में, आपके ऐप्लिकेशन और बैकएंड, दोनों के लिए ज़रूरी चरणों के बारे में बताया गया है. इससे, शुरुआती खरीदारी को सही तरीके से प्रोसेस किया जा सकेगा. साथ ही, नए टोकन को स्वीकार किया जा सकेगा. इसके अलावा, पुरानी सदस्यता खत्म होने और नई सदस्यता चालू होने पर, एनटाइटलमेंट स्विच को मैनेज किया जा सकेगा.
12. सदस्यता बदलने की सुविधा का Playground
सैंपल के तौर पर मिले ऐप्लिकेशन में मौजूद रिप्लेसमेंट प्लेग्राउंड सुविधा की मदद से, Google Play Console खाते में कॉन्फ़िगर किए गए शुल्क लेकर सदस्यता देने वाले प्रॉडक्ट के लिए, सदस्यता को अपग्रेड और डाउनग्रेड करने की सुविधा को टेस्ट किया जा सकता है. इस सेक्शन में, बदलाव करने के लिए उपलब्ध टूल सुविधा का इस्तेमाल करने का तरीका बताया गया है.
सेटअप
बदलाव करने के लिए प्लेग्राउंड सुविधा का इस्तेमाल करने के लिए, पक्का करें कि:
- आपकी
build.gradleफ़ाइल में मौजूदpackageId, Google Play Console में कॉन्फ़िगर किए गए ऐप्लिकेशन से मेल खाता हो. - आपका टेस्ट यूज़र खाता, Google Play Console में लाइसेंस टेस्टर के तौर पर रजिस्टर होना चाहिए. लाइसेंस टेस्टिंग के बारे में ज़्यादा जानने के लिए, ऐप्लिकेशन में बिलिंग सिस्टम को लागू करने की जांच करना लेख पढ़ें.
सदस्यता बदलने की सुविधा का Playground
सैंपल के तौर पर मिले ऐप्लिकेशन में बदलावों को आज़माने की जगह टैब शामिल होता है. इसकी मदद से, सदस्यता में किए गए बदलावों को आज़माया जा सकता है. Play Console में तय की गई सदस्यताओं के बारे में क्वेरी की जा सकती है. साथ ही, सदस्यता बदलने के अलग-अलग मोड का इस्तेमाल करके, एक सदस्यता से दूसरी सदस्यता पर स्विच करने की सुविधा को टेस्ट किया जा सकता है. इस प्लेग्राउंड की मदद से, यह समझा जा सकता है कि अलग-अलग मोड, आपकी सदस्यताओं के बिलिंग साइकल और एनटाइटलमेंट पर कैसे असर डालते हैं. इससे यह तय किया जा सकता है कि आपके कारोबार की ज़रूरतों के हिसाब से कौनसा विकल्प सबसे सही है.
प्लेग्राउंड का इस्तेमाल करके, बदलावों का सिम्युलेशन करने के लिए, यह तरीका अपनाएं:
- Playground टैब पर जाएं.
- अगर आपकी सदस्यता चालू है, तो: उसे हाइलाइट किया जाएगा. यह वह सदस्यता है जिसे बदला जाएगा.

- अगर आपके पास चालू सदस्यता नहीं है, तो: आपको पहले सदस्यता खरीदनी होगी.
- Playground में, इस कोडलैब के लिए डिफ़ॉल्ट रूप से बनाए गए Basic, Premium, और Lite प्लान की सूची दिखती है.
- Play कंसोल में कॉन्फ़िगर किए गए अन्य प्लान के साथ टेस्ट करने के लिए, कस्टम प्लान जोड़ें पर क्लिक करें. इसके बाद,
productIdऔरbasePlanIdके हिसाब से खोजें. - चुनी गई सदस्यता खरीदें.
- अब आपको उपयोगकर्ता की नई खरीदी गई चालू सदस्यता दिखनी चाहिए.

- वह टारगेट सदस्यता चुनें जिस पर उपयोगकर्ता को स्विच करना है.
- ट्रांज़िशन के लिए, बदलाव का मोड चुनें.

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

- लेन-देन पूरा करें.
- Play Store ऐप्लिकेशन में सदस्यताएं मैनेज करें पेज पर जाएं. यहां आपको चालू सदस्यता में हुए बदलावों के साथ-साथ, रिन्यूअल की अपडेट की गई तारीखों और कीमतों के बारे में जानकारी मिलेगी.

13. अगले चरण
- Play Billing इंटिग्रेशन का ज़्यादा से ज़्यादा फ़ायदा उठाने का तरीका जानें.
- जब उपयोगकर्ता इन प्रॉडक्ट को खरीदना शुरू कर दें, तब अपने सुरक्षित बैकएंड पर खरीदारी की पुष्टि करने और उन्हें प्रोसेस करने के सबसे सही तरीके अपनाना न भूलें.
रेफ़रंस के लिए दस्तावेज़
14. बधाई हो
बधाई हो! आपने सदस्यता बदलने की सुविधा को अलग-अलग प्रोरिएशन मोड के साथ लागू कर दिया है. साथ ही, प्लान ट्रांज़िशन के लिए बैकएंड हैंडलिंग को कॉन्फ़िगर कर दिया है.
आपने क्या सीखा
SubscriptionProductReplacementParamsको खास रिप्लेसमेंट मोड के साथ कॉन्फ़िगर करने का तरीका.- अपग्रेड तुरंत लागू होने और डाउनग्रेड बाद में लागू होने के बीच अंतर.
- आरटीडीएन का इस्तेमाल करके, सदस्यता के पुराने टोकन को बंद करने का तरीका.
linkedPurchaseToken
सर्वे
इस कोडलैब के बारे में आपके सुझाव, शिकायत या राय हमारे लिए बहुत अहम है. कृपया कुछ समय निकालकर, हमारे सर्वे में हिस्सा लें.