Google Play Billing की मदद से सदस्यता प्लान बदलने की सुविधा लागू करना

1. परिचय

इस कोडलैब में, सदस्यता प्लान में बदलावों को मैनेज करने के लिए, Google Play Billing Library (PBL) का इस्तेमाल करने का तरीका बताया गया है. आपको यह पता चलेगा कि सदस्यता प्लान में बदलाव करने के अलग-अलग तरीकों से, कीमत और उपयोगकर्ता के अधिकारों पर क्या असर पड़ता है. साथ ही, आपको बैकएंड पर डेवलपर से जुड़ी रीयल-टाइम सूचनाओं (आरटीडीएन) को प्रोसेस करने का तरीका भी पता चलेगा.

दर्शक

यह कोडलैब, Android ऐप्लिकेशन डेवलपर के लिए बनाया गया है. इसमें सदस्यता मैनेज करने की बेहतर सुविधाएं लागू करने के बारे में बताया गया है. इन दिशा-निर्देशों की मदद से, उपयोगकर्ताओं को सदस्यता अपग्रेड करने, डाउनग्रेड करने या अलग-अलग सदस्यता प्लान के बीच ट्रांज़िशन करने का बेहतर अनुभव दिया जा सकता है.

आपको यह जानकारी मिलेगी...

  • Play Console में सदस्यताएं बनाने का तरीका.
  • अपने ऐप्लिकेशन को अपग्रेड और डाउनग्रेड करने से जुड़ी नीतियों के हिसाब से, सही ReplacementMode (जैसे, WITH_TIME_PRORATION बनाम DEFERRED) चुनने का तरीका.
  • प्लान बदलने के लिए, Google Play से खरीदारी की प्रोसेस को ट्रिगर करने के लिए, launchBillingFlow में BillingFlowParams को कॉन्फ़िगर करने का तरीका.
  • अपने बैकएंड पर, पुराने ऐक्सेस को सुरक्षित तरीके से रद्द करने और नया ऐक्सेस देने के लिए, डेवलपर से जुड़ी रीयल-टाइम सूचनाओं (आरटीडीएन) और purchases.subscriptionsv2 एपीआई का इस्तेमाल कैसे करें

आपको इन चीज़ों की ज़रूरत होगी

2. सैंपल ऐप्लिकेशन बनाना

इस कोडलैब में, एक सैंपल Android ऐप्लिकेशन का इस्तेमाल किया गया है. इसमें बताया गया है कि PBL में सदस्यता बदलने की सुविधा कैसे लागू की जाती है. सैंपल ऐप्लिकेशन को पूरी तरह से काम करने वाले Android ऐप्लिकेशन के तौर पर डिज़ाइन किया गया है. इसमें पूरा सोर्स कोड होता है, जो इन पहलुओं को दिखाता है:

  • ऐप्लिकेशन को पीबीएल के साथ इंटिग्रेट करना
  • सदस्यता बदलने की सुविधा लागू करना

अगर आपको सदस्यता बदलने और पीबीएल के बारे में पहले से पता है, तो सैंपल ऐप्लिकेशन डाउनलोड करें और इसे आज़माएँ.

नीचे दिए गए डेमो वीडियो में दिखाया गया है कि सैंपल ऐप्लिकेशन को डिप्लॉय और चलाने के बाद, वह कैसा दिखेगा और कैसे काम करेगा.

ज़रूरी शर्तें

संपल ऐप्लिकेशन बनाने और उसे डिप्लॉय करने से पहले, ये काम करें:

  • Google Play Console डेवलपर खाता बनाएं. अगर आपके पास पहले से ही डेवलपर खाता है, तो इस चरण को छोड़ दें.
  • Play Console में एक नया ऐप्लिकेशन बनाएं. इसमें कमाई करने की सुविधाएं चालू होनी चाहिए. इसके अलावा, Play Console में मौजूद किसी ऐप्लिकेशन का इस्तेमाल किया जा सकता है. अगर आपके ऐप्लिकेशन के लिए कमाई करने की सुविधाएं चालू नहीं हैं, तो उन्हें सेट अप करने के लिए यह तरीका अपनाएं.
  • Android Studio इंस्टॉल करें.

बनाएं

कोड लैब में दिए गए निर्देशों का पालन करने के लिए, सैंपल ऐप्लिकेशन बनाने का तरीका:

  1. GitHub से सैंपल ऐप्लिकेशन डाउनलोड करें.
  2. Play Developer Console में अपने ऐप्लिकेशन का ऐप्लिकेशन आईडी दिखाने के लिए, सैंपल ऐप्लिकेशन के build.gradle में मौजूद applicationId को अपडेट करें.
  3. नमूना ऐप्लिकेशन बनाएं.
    ध्यान दें: इससे, स्थानीय तौर पर जांच करने के लिए ऐप्लिकेशन बन जाता है. हालांकि, ऐप्लिकेशन चलाने पर प्रॉडक्ट और उनकी कीमतें नहीं दिखती हैं. ऐसा इसलिए, क्योंकि Play कंसोल में ज़रूरी सदस्यताओं को अब तक नहीं बनाया गया है. अगले सेक्शन में, Developer Console में सदस्यताएं बनाने के बारे में बताया जाएगा.

3. Play Console में सदस्यताएं बनाना

सदस्यता लेने के लिए बनाया गया Google Play का सिस्टम आपको, सदस्यताओं को बनाने, मैनेज करने, और उन्हें बेचने के तरीकों में बदलाव करने की सुविधा देता है. Play Console में, एक सदस्यता को कई बुनियादी प्लान के साथ कॉन्फ़िगर किया जा सकता है. इनमें से हर प्लान में कई ऑफ़र शामिल किए जा सकते हैं. सदस्यता से जुड़े हर ऑफ़र के लिए, अलग-अलग शुल्क और शर्तें तय की जा सकती हैं. इस कोडलैब के लिए, आपको तीन तरह की सदस्यताएं बनानी होंगी: Premium Plan, Basic Plan, और Lite Plan. इससे अलग-अलग कीमत पर सदस्यता ऑफ़र करने का तरीका समझने में मदद मिलेगी. इनमें से हर सदस्यता में, हर महीने रिन्यू होने वाला एक बुनियादी प्लान होगा.

नई सदस्यता बनाएं

नई सदस्यता बनाने के लिए

  1. Play Console खोलें और सदस्यताएं पेज (Google Play का इस्तेमाल करके कमाई करें > प्रॉडक्ट > सदस्यताएं) पर जाएं
  2. सदस्यता बनाएं पर क्लिक करें.
  3. सदस्यता की जानकारी डालें:
    • ProductID : कोई यूनीक प्रॉडक्ट आईडी डालें. premium_plan डालें.
    • नाम : सदस्यता के लिए कोई छोटा नाम डालें. उदाहरण: Premium Plan.
  4. बनाएं पर क्लिक करें.

बुनियादी प्लान बनाना

  1. Play Console खोलें और सदस्यताएं पेज (Google Play का इस्तेमाल करके कमाई करें > प्रॉडक्ट > सदस्यताएं) पर जाएं
  2. आपको जिस सदस्यता के लिए बुनियादी प्लान बनाना है उसके बगल में बने राइट ऐरो पर क्लिक करके, सदस्यता के बारे में जानकारी देखें.
  3. बुनियादी प्लान जोड़ें पर क्लिक करें.
  4. बुनियादी प्लान का आईडी डालें. उदाहरण monthly-auto-renewing.
  5. टाइप के तौर पर अपने-आप रिन्यू होने वाला चुनें.
  6. अपने-आप रिन्यू होने वाले बुनियादी प्लान के लिए, यह जानकारी सेट करें:
    • बिलिंग अवधि: हर महीने.
    • ग्रेस पीरियड: सात दिन.
    • बिलिंग प्लान और ऑफ़र से जुड़े बदलाव: बिलिंग की तारीख पर शुल्क लें.
    • फिर से सदस्यता लें: अनुमति दें.
  7. बुनियादी प्लान की कीमत सेट करने के लिए, कीमत और उपलब्धता सेक्शन में जाकर, कीमतें सेट करें पर क्लिक करें.
  8. सभी देशों और इलाकों को चुनें. इसके बाद, कीमत सेट करें पर क्लिक करें.
  9. इस बुनियादी प्लान के लिए कीमत 10 डॉलर के तौर पर सेट करें. इसके बाद, अपडेट करें पर क्लिक करें.
  10. बुनियादी प्लान की कीमत सेट करने के बाद, सबसे नीचे दाईं ओर मौजूद सेव करें और फिर चालू करें पर क्लिक करें.

सैंपल ऐप्लिकेशन के लिए सदस्यताएं बनाना

इस कोडलैब के लिए, यहां दिए गए कॉन्फ़िगरेशन के साथ दो और सदस्यताएं बनाएं:

  • बुनियादी प्लान
    • प्रॉडक्ट आईडी: basic_plan
    • नाम: बुनियादी प्लान
    • बुनियादी प्लान का आईडी: monthly-auto-renewing
    • कीमत: 500 रुपये
  • Lite Plan
    • प्रॉडक्ट आईडी: 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 अप्रैल को बुनियादी प्लान (4.99 डॉलर प्रति महीना) से प्रीमियम प्लान (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 डॉलर चुकाने हैं. बुनियादी प्लान की बची हुई अवधि को, Lite प्लान की अवधि में बदल दिया जाता है. इससे, रिन्यूअल की अगली तारीख काफ़ी आगे बढ़ जाती है. उपयोगकर्ता से, नई बिलिंग की तारीख पर रिन्यूअल के लिए 2.99 डॉलर का शुल्क लिया जाएगा.

नतीजा

इस सेक्शन में, आपने सीखा कि WITH_TIME_PRORATION, कीमत में अंतर के आधार पर, अगली रिन्यूअल की तारीख को बदलकर, बिना किसी शुल्क के उपयोगकर्ता के एनटाइटलमेंट में कैसे बदलाव करता है. यह उपयोगकर्ताओं को अपग्रेड या डाउनग्रेड करने की एक असरदार डिफ़ॉल्ट रणनीति है.

6. CHARGE_PRORATED_PRICE

इस मोड में, सदस्यता वाले आइटम को तुरंत अपग्रेड कर दिया जाता है. हालांकि, बिलिंग साइकल में कोई बदलाव नहीं होता. इसके बाद, उपयोगकर्ता से बचे हुए समय के लिए कीमत का अंतर लिया जाता है.

ध्यान दें: यह विकल्प सिर्फ़ सदस्यता वाले ऐसे आइटम को अपग्रेड करने के लिए उपलब्ध है जिसमें समय के हिसाब से कीमत बढ़ जाती है.

उदाहरण के तौर पर

मान लें कि किसी व्यक्ति ने Basic प्लान (हर महीने 4.99 डॉलर) लिया है. उसने 20 अप्रैल को 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 दिनों की वैल्यू) को प्रीमियम प्लान की वैल्यू में बदल दिया जाता है. इस उदाहरण में, Basic प्लान के 10 दिन, 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_token premium_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 RTDN भेजता है.RTDN के पेलोड का सैंपल
    {
      "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 API को कॉल करें. एपीआई के जवाब में 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 Replacements प्रोसेस करना

सदस्यता को तुरंत बदलने के मोड के उलट, ReplacementMode.DEFERRED सदस्यता बदलने और एनटाइटलमेंट अपडेट करने की प्रोसेस को मौजूदा बिलिंग साइकल के खत्म होने तक रोक देता है. बदलाव को कुछ समय के लिए रोकने की सुविधा को मैनेज करने के लिए, खास लॉजिक की ज़रूरत होती है. इससे यह पक्का किया जा सकता है कि उपयोगकर्ताओं को सही समय पर सही एनटाइटलमेंट मिले.

उदाहरण

  • उपयोगकर्ता के पास Basic प्लान की सदस्यता है. यह प्लान हर महीने के लिए है. इसका प्रॉडक्ट आईडी basic_plan और purchase_token basic_purchase_token_123 है. यह सदस्यता 15 अप्रैल को रिन्यू होगी.
  • 1 अप्रैल को, उपयोगकर्ता ReplacementMode.DEFERRED का इस्तेमाल करके Premium प्लान पर स्विच करने का फ़ैसला करता है.
  • Google, प्रीमियम प्लान (product_id premium_plan और purchase_token premium_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. सदस्यता बदलने की सुविधा का प्लेग्राउंड

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

सेटअप

बदलाव करने के लिए प्लेग्राउंड सुविधा का इस्तेमाल करने के लिए, पक्का करें कि:

  • आपकी build.gradle फ़ाइल में मौजूद packageId, Google Play Console में कॉन्फ़िगर किए गए ऐप्लिकेशन से मेल खाता हो.
  • आपका टेस्ट यूज़र खाता, Google Play Console में लाइसेंस टेस्टर के तौर पर रजिस्टर होना चाहिए. लाइसेंस टेस्टिंग के बारे में ज़्यादा जानने के लिए, ऐप्लिकेशन में बिलिंग सिस्टम को लागू करने की जांच करना लेख पढ़ें.

सदस्यता बदलने की सुविधा का प्लेग्राउंड

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

प्लेग्राउंड का इस्तेमाल करके, रिप्लेसमेंट का सिम्युलेशन करने के लिए, यह तरीका अपनाएं:

  1. Playground टैब पर जाएं.
  2. अगर आपकी सदस्यता चालू है, तो: उसे हाइलाइट किया जाएगा. यह वह सदस्यता है जिसे बदला जाएगा.

Playground का होम पेज

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

बदलाव करने का मोड चुनें

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

सदस्यता बदलने के लिए बिलिंग कार्ट

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

Play Store की सदस्यता मैनेज करना

13. अगले चरण

रेफ़रंस दस्तावेज़

14. बधाई हो

बधाई हो! आपने अलग-अलग प्रोरैटिंग मोड के साथ सदस्यता बदलने की सुविधा को लागू कर दिया है. साथ ही, प्लान ट्रांज़िशन के लिए बैकएंड हैंडलिंग को कॉन्फ़िगर कर दिया है.

आपको क्या सीखने को मिला

  • SubscriptionProductReplacementParams को खास रिप्लेसमेंट मोड के साथ कॉन्फ़िगर करने का तरीका.
  • अपग्रेड तुरंत लागू होने और डाउनग्रेड बाद में लागू होने के बीच अंतर.
  • आरटीडीएन का इस्तेमाल करके, linkedPurchaseToken की मदद से सदस्यता के पुराने टोकन बंद करने का तरीका.

सर्वे

इस कोडलैब के बारे में आपके सुझाव, शिकायत या राय हमारे लिए बहुत अहम है. कृपया कुछ समय निकालकर, हमारे सर्वे में हिस्सा लें.