सदस्यता का लाइफ़साइकल

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

अपने-आप रिन्यू होने वाली सदस्यताओं का लाइफ़साइकल मैनेज करना

जब किसी उपयोगकर्ता की सदस्यता की स्थिति बदलती है, तो आपके बैकएंड सर्वर को SubscriptionNotification मैसेज मिलता है.

subs-auto-renew-state
पहली इमेज. अपने-आप रिन्यू होने वाली सदस्यता की खरीदारी के लिए, लाइफ़साइकल की स्थितियां और ट्रांज़िशन इवेंट.

अपने बैकएंड में स्थिति को अपडेट करने के लिए, सूचना में शामिल परचेज़ टोकन के साथ purchases.subscriptionsv2.get एपीआई को कॉल करें. यह एंडपॉइंट, खरीदारी के टोकन के हिसाब से सदस्यता की मौजूदा स्थिति दिखाता है. इसे सदस्यता मैनेज करने के लिए, भरोसेमंद सोर्स माना जाता है.

खरीदारी का टोकन, सदस्यता के लिए साइन अप करने से लेकर सदस्यता खत्म होने के 60 दिनों तक मान्य होता है. इस तारीख के बाद, Google Play Developer API को कॉल करने के लिए, खरीदारी टोकन का इस्तेमाल नहीं किया जा सकेगा.

अपने-आप रिन्यू होने वाली नई सदस्यताओं की खरीदारी

जब कोई उपयोगकर्ता सदस्यता खरीदता है, तो आपके आरटीडीएन क्लाइंट को SUBSCRIPTION_PURCHASED टाइप वाला SubscriptionNotification मैसेज भेजा जाता है. आपको यह सूचना मिलती है या आपने PurchasesUpdatedListener के ज़रिए ऐप्लिकेशन में नई खरीदारी रजिस्टर की है. इसके अलावा, आपके पास ऐप्लिकेशन के onResume() तरीके में खरीदारी को मैन्युअल तरीके से फ़ेच करने का विकल्प भी है. इन सभी मामलों में, आपको नई खरीदारी को अपने सुरक्षित बैकएंड में प्रोसेस करना चाहिए. ऐसा करने के लिए, इन चरणों का अनुसरण करें:

  1. सदस्यता संसाधन पाने के लिए, purchases.subscriptionsv2.get एंडपॉइंट से क्वेरी करें. इसमें सदस्यता की मौजूदा स्थिति की जानकारी होती है.
  2. पक्का करें कि subscriptionState फ़ील्ड की वैल्यू SUBSCRIPTION_STATE_ACTIVE हो.
  3. खरीदारी की पुष्टि करें.
  4. उपयोगकर्ता को कॉन्टेंट का ऐक्सेस दें. खरीदारी से जुड़े उपयोगकर्ता खाते की पहचान, सदस्यता संसाधन के ExternalAccountIdentifiers ऑब्जेक्ट से की जा सकती है. ऐसा तब किया जा सकता है, जब खरीदारी के समय setObfuscatedAccountId और setObfuscatedProfileId का इस्तेमाल करके आइडेंटिफ़ायर सेट किए गए हों.

offerPhase में मौजूद SubscriptionPurchaseLineItem फ़ील्ड से, सदस्यता के मौजूदा फ़ेज़ के बारे में जानकारी मिलती है. जैसे, बिना किसी शुल्क के आज़माने की सुविधा या शुरुआती कीमत.

Play Billing Library में, सदस्यता की पुष्टि करने का तरीका भी शामिल है, acknowledgePurchase(), और पुष्टि की स्थिति की जांच करने का तरीका भी शामिल है, isAcknowledged(). हालांकि, हमारा सुझाव है कि बेहतर सुरक्षा के लिए, खरीदारी की प्रोसेस को अपने बैकएंड में मैनेज करें.

नई खरीदारी के लिए सदस्यता संसाधन, इस उदाहरण की तरह दिखता है:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_PENDING", // need to acknowledge new purchases
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      },
      "offerPhase": {
        "freeTrial": {}
      }
    }
  ],
}

सदस्यता के रिन्यूअल

बिना किस्तों के अपने-आप रिन्यू होने वाली सदस्यताओं के लिए, सदस्यता रिन्यू होने पर SUBSCRIPTION_RENEWED सूचना भेजी जाती है. किस्तों में सदस्यता लेने पर, बिलिंग की तारीख को सदस्यता के लिए शुल्क लिए जाने पर, SUBSCRIPTION_RENEWED सूचना भेजी जाती है. पक्का करें कि उपयोगकर्ता के पास अब भी सदस्यता के फ़ायदे पाने का अधिकार हो. इसके बाद, Google Play Developer API से मिले सदस्यता संसाधन में दिए गए नए expiryTime का इस्तेमाल करके, सदस्यता की स्थिति अपडेट करें. सदस्यता संसाधन, यहां दिए गए उदाहरण की तरह दिखता है:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      },
      "offerPhase": {
        "basePrice": {}
      }
    }
  ]
}

आपको सदस्यता के रिन्यूअल की पुष्टि करने की ज़रूरत नहीं है.

ग्रेस पीरियड

अगर सदस्यता रिन्यू करने के लिए पेमेंट करने में कोई समस्या आती है, तो Google उपयोगकर्ता को इसकी सूचना देता है. साथ ही, सदस्यता खत्म होने से पहले, कुछ समय तक सदस्यता को रिन्यू करने की कोशिश करता है. खाता वापस पाने की इस अवधि में, ग्रेस पीरियड और खाते पर रोक लगने की अवधि शामिल हो सकती है. ग्रेस पीरियड के दौरान, उपयोगकर्ता के पास सदस्यता के तहत मिलने वाले अधिकारों का ऐक्सेस होना चाहिए.

queryPurchasesAsync() तरीके से, ग्रेस पीरियड में की गई खरीदारी के लिए भी नतीजे मिलते रहेंगे. अगर आपका ऐप्लिकेशन, यह जांच करने के लिए सिर्फ़ queryPurchasesAsync पर निर्भर करता है कि किसी उपयोगकर्ता के पास सदस्यता का अधिकार है या नहीं, तो आपके ऐप्लिकेशन को ग्रेस पीरियड को अपने-आप मैनेज करना चाहिए. ऐसा इसलिए, क्योंकि इन सदस्यताओं को Play Billing Library के ज़रिए चालू के तौर पर दिखाया जाता है.

सदस्यता की स्थिति को अपने बैकएंड के साथ सिंक करने से, आपको पेमेंट अस्वीकार होने के बारे में ज़्यादा जानकारी मिलती है. साथ ही, इससे आपको अनचाहे चर्न को कम करने में मदद मिलती है. SubscriptionNotification मैसेज सुनो. जब उपयोगकर्ता ग्रेस पीरियड में प्रवेश करे, तब सूचना पाने के लिए SUBSCRIPTION_IN_GRACE_PERIOD टाइप का इस्तेमाल करो. ग्रेस पीरियड के दौरान, सदस्यता संसाधन में autoRenewEnabled = true शामिल होता है. Google Play, expiryTime की वैल्यू को ग्रेस पीरियड खत्म होने तक डाइनैमिक तरीके से बढ़ाता है. ऐसा इसलिए, क्योंकि एनटाइटलमेंट तब तक बना रहना चाहिए, जब तक उपयोगकर्ता सदस्यता रद्द नहीं कर देता या ग्रेस पीरियड की ज़्यादा से ज़्यादा अवधि खत्म नहीं हो जाती. इस अवधि के दौरान, subscriptionState फ़ील्ड की वैल्यू SUBSCRIPTION_STATE_IN_GRACE_PERIOD है. सदस्यता संसाधन कुछ ऐसा दिखता है:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_IN_GRACE_PERIOD",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_future,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

Play, ग्रेस पीरियड में मौजूद उपयोगकर्ताओं को सूचना देता है कि उनका पेमेंट अस्वीकार कर दिया गया है. साथ ही, उन्हें Play Store में पेमेंट के तरीके से जुड़ी समस्याएं ठीक करने के लिए कहता है. जब कोई उपयोगकर्ता ग्रेस पीरियड में होता है, तब आपको उसे पेमेंट का तरीका ठीक करने के लिए भी बढ़ावा देना चाहिए. ऐसा तब करें, जब पेमेंट में गड़बड़ी अनजाने में हुई हो. इसके लिए, इन-ऐप्लिकेशन मैसेजिंग एपीआई का इस्तेमाल करना सबसे आसान तरीका है. अगर उपयोगकर्ता के ऐप्लिकेशन खोलने पर इस एपीआई को कॉल किया जाता है, तो उसे कुछ समय के लिए दिखने वाले स्नैकबार में Play का एक मैसेज दिखता है. इसमें उपयोगकर्ता को बताया जाता है कि उसका पेमेंट अस्वीकार कर दिया गया है. इस मैसेज में, उपयोगकर्ता के लिए एक डीप लिंक भी शामिल होता है. इसकी मदद से, उपयोगकर्ता Google Play पर पेमेंट के तरीके से जुड़ी समस्या को हल कर सकता है.

जैसे ही उपयोगकर्ता पेमेंट के तरीके से जुड़ी समस्या को ठीक कर लेता है, सदस्यता रिन्यू हो जाती है. रिन्यूअल की तारीख वही होती है जो पहले थी. रिन्यूअल सेक्शन में बताए गए तरीके से, रिन्यूअल को मैनेज किया जा सकता है.

अगर उपयोगकर्ता ग्रेस पीरियड के दौरान पेमेंट के तरीके को ठीक नहीं करता है, तो सदस्यता के लिए खाते पर रोक लगा दी जाती है. साथ ही, उपयोगकर्ता को सदस्यता के फ़ायदे नहीं मिलते.

ग्रेस पीरियड के दौरान ऐक्सेस करना और खाता वापस पाना

दूसरी इमेज में, ग्रेस पीरियड में जाने वाली सदस्यता की टाइमलाइन दिखाई गई है. इसमें यह भी दिखाया गया है कि जब उपयोगकर्ता पेमेंट के तरीके से जुड़ी समस्या को ठीक कर लेता है, तब सदस्यता फिर से चालू हो जाती है. ग्रेस पीरियड खत्म होने के बाद, उपयोगकर्ता को सदस्यता के फ़ायदे नहीं मिलने चाहिए और उसके खाते पर रोक लग जानी चाहिए.

दूसरी इमेज. ऐसी सदस्यता के लिए टाइमलाइन जो मोहलत की अवधि में चली जाती है और इस अवधि के खत्म होने से पहले ठीक हो जाती है.

इन बातों का ध्यान रखना ज़रूरी है:

  • ग्रेस पीरियड के दौरान, उपयोगकर्ता के पास सदस्यता के फ़ायदों का ऐक्सेस बना रहना चाहिए.
  • ग्रेस पीरियड के दौरान सदस्यता फिर से चालू होने पर, रिन्यूअल की तारीख रीसेट नहीं होती.
  • ग्रेस पीरियड बदलने पर, फ़िलहाल ग्रेस पीरियड में मौजूद उपयोगकर्ताओं पर कोई असर नहीं पड़ेगा. बदलाव के बाद, ग्रेस पीरियड में जाने वाली सदस्यताएं नए ग्रेस पीरियड के हिसाब से दिखेंगी. उदाहरण के लिए, अगर आपने ग्रेस पीरियड को 7 दिनों से बदलकर 14 दिन कर दिया है, तो बदलाव के बाद ग्रेस पीरियड में शामिल होने वाले उपयोगकर्ताओं को 14 दिनों का नया ग्रेस पीरियड मिलेगा.
  • सदस्यता चालू रहती है. साथ ही, आपको साइलेंट ग्रेस पीरियड खत्म होने तक, ग्रेस पीरियड का आरटीडीएन नहीं मिलेगा

साइलेंट ग्रेस पीरियड

ग्रेस पीरियड को शून्य दिन पर सेट किया जा सकता है. हालांकि, Play कम से कम एक दिन तक इंतज़ार करेगा, ताकि पेमेंट फिर से करने के लिए डेवलपर को ज़रूरी समय मिल सके. इस ग्रेस पीरियड के दौरान, पेमेंट प्रोसेस करने के लिए सुरक्षा मिलती है. इस 24 घंटे की अवधि के दौरान, सदस्यता ACTIVE स्थिति में रहती है.

सदस्यता की स्थिति में होने वाले बदलावों के बारे में अप-टू-डेट रहने का सबसे अच्छा तरीका यह है कि आप डेवलपर से जुड़ी रीयल-टाइम सूचनाओं (आरटीडीएन) को सुनें और उन पर प्रतिक्रिया दें. सदस्यता की स्थिति के बारे में ज़्यादा सटीक जानकारी पाने के लिए, मैसेज की समयसीमा खत्म होने के समय के बजाय, आरटीडीएन के समय पर purchases.subscriptionsv2.get() तरीके को कॉल करें.

बिना किसी शुल्क के 24 घंटे की अवधि के बाद, सदस्यता की स्थिति के आधार पर आपको इनमें से कोई एक सूचना मिलेगी:

  • SUBSCRIPTION_ON_HOLD (अगर चालू है)
  • SUBSCRIPTION_CANCELED (अगर रद्द किया गया है)
  • SUBSCRIPTION_EXPIRED (अगर समयसीमा खत्म हो गई है)
  • SUBSCRIPTION_RENEWED (अगर सदस्यता रिन्यू हो जाती है)

सदस्यता का मौजूदा स्टेटस पाने के लिए, 24 घंटे के साइलेंट ग्रेस पीरियड के बाद, किसी भी समय subscriptionV2.get() तरीके को कॉल किया जा सकता है.

खाते पर रोक लगी है

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

खाते पर रोक लगने के दौरान, आपको ज़रूरत के मुताबिक सदस्यताएं रद्द करने, उन्हें वापस लाने या फिर से खरीदने की प्रोसेस जारी रखनी चाहिए. ऐसा इसलिए, क्योंकि सदस्यता पर रोक लगने के दौरान उपयोगकर्ता इन बदलावों को कर सकता है.

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

अगर आपके उपयोगकर्ता, सदस्यता वाले कॉन्टेंट को आपके ऐप्लिकेशन के बाहर ऐक्सेस कर सकते हैं, तो उन्हें पता चल सकता है कि अलग-अलग प्लैटफ़ॉर्म पर उनका ऐक्सेस खत्म हो गया है. ऐसा हो सकता है कि आपको उपयोगकर्ता को पुश नोटिफ़िकेशन या ईमेल भेजकर यह बताना हो कि पेमेंट अस्वीकार होने की वजह से, उसकी सदस्यता अब चालू नहीं है.

खाते पर रोक लगने के दौरान, queryPurchasesAsync() तरीके से सदस्यता वापस नहीं की जाती. इसलिए, अगर आपका ऐप्लिकेशन मौजूदा खरीदारी दिखाने के लिए इस तरीके पर निर्भर करता है, तो आपको डिफ़ॉल्ट रूप से खाते पर रोक लगने की सुविधा देनी चाहिए.

डेवलपर से जुड़ी रीयल-टाइम सूचनाओं की मदद से, जब किसी सदस्यता पर खाते पर रोक लग जाती है, तब आपको SUBSCRIPTION_ON_HOLD टाइप वाला SubscriptionNotification मैसेज मिलता है. नई सदस्यता की जानकारी पाने के लिए, अपने सुरक्षित बैकएंड सर्वर से purchases.subscriptionsv2.get तरीके को कॉल करें. खाते पर रोक लगने के दौरान, सदस्यता संसाधन के expiryTime फ़ील्ड को पिछले टाइमस्टैंप पर सेट किया जाता है. साथ ही, subscriptionState फ़ील्ड को SUBSCRIPTION_STATE_ON_HOLD पर सेट किया जाता है:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ON_HOLD",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_past,
      ...
    }
  ],
}

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

जब उपयोगकर्ता पेमेंट का तरीका ठीक कर लेता है, तब सदस्यता की स्थिति 'चालू है' पर वापस आ जाती है. इसके बाद, आपको सदस्यता वाले कॉन्टेंट का ऐक्सेस वापस देना होगा. इस मामले में, खरीदारी का टोकन वही रहता है जो खाता होल्ड होने से पहले था. ऐसा इसलिए, क्योंकि उसी खरीदारी को वापस लाया जा रहा है. साथ ही, आपको SUBSCRIPTION_RECOVERED टाइप वाला आरटीडीएन मिलता है.

किस्तों में पेमेंट करने की सुविधा वाली सदस्यताओं के लिए, पेमेंट अस्वीकार हो सकता है और किसी भी पेमेंट के लिए रिकवरी हो सकती है.

खाता वापस पाने के बाद, Play Billing Library queryPurchasesAsync() तरीके से सदस्यता को फिर से चालू कर देती है. अगर आपने यह तरीका इस्तेमाल करके यह पता लगाया है कि किसी उपयोगकर्ता के पास सदस्यता का एनटाइटलमेंट है या नहीं, तो आपका ऐप्लिकेशन, खाते पर रोक लगने के बाद सदस्यता को अपने-आप वापस चालू कर देगा.

SubscriptionNotification मैसेज के लिए सुनो. इस मैसेज का टाइप SUBSCRIPTION_RECOVERED है. इससे आपको सूचना मिलेगी कि सदस्यता वापस पा ली गई है और उपयोगकर्ता को फिर से ऐक्सेस मिल जाना चाहिए. अगर आपको यह सूचना मिलने के बाद किसी सदस्यता के बारे में क्वेरी करनी है, तो expiryTime फ़ील्ड में आने वाले समय का टाइमस्टैंप सेट किया जाता है. साथ ही, subscriptionState फ़ील्ड को फिर से SUBSCRIPTION_STATE_ACTIVE पर सेट किया जाता है:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      ...
    }
  ],
}

अगर उपयोगकर्ता, खाते पर रोक लगने की अवधि खत्म होने से पहले पेमेंट का तरीका ठीक नहीं करता है, तो आपको SUBSCRIPTION_CANCELED टाइप वाला आरटीडीएन मिलेगा. रद्द करने की प्रोसेस को मैनेज करने के निर्देशों के लिए, रद्द किए गए ऑर्डर लेख पढ़ें. इस तरह से रद्द की गई सदस्यता के लिए क्वेरी करने पर, expiryTime फ़ील्ड को पिछले टाइमस्टैंप पर सेट किया जाता है:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_past,
      ...
    }
  ],
}

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

उपयोगकर्ता को ऐक्सेस वापस पाने के लिए, उसी सदस्यता प्लान को फिर से खरीदना होगा. इसके अलावा, वह कोई ऐसा प्लान भी खरीद सकता है जिसे आपने खाते के निलंबित होने की अवधि के दौरान, ऐप्लिकेशन के ज़रिए उपलब्ध कराया हो. हालांकि, यह प्लान उपयोगकर्ता को उसी कीमत पर मिलेगा जिस कीमत पर उसने मूल प्लान खरीदा था. ऐसे में, एक नया परचेज़ टोकन जारी किया जाता है. साथ ही, नई वैल्यू को SUBSCRIPTION_PURCHASED इवेंट के हिस्से के तौर पर दिखाया जाता है. यह इवेंट, नए इंस्टेंस को दिखाता है.

खाते पर रोक लगने के बाद उसे ऐक्सेस करना और वापस पाना

तीसरी इमेज में, खाते पर रोक लगाकर रखने की सुविधा वाली सदस्यता की टाइमलाइन दिखाई गई है. इसमें यह भी दिखाया गया है कि जब उपयोगकर्ता पेमेंट के तरीके से जुड़ी समस्या को ठीक कर लेता है, तब सदस्यता फिर से शुरू हो जाती है.

तीसरी इमेज. खाते पर रोक लगने और उसके खत्म होने से पहले सदस्यता बहाल होने की समयावधि.

पिछले उदाहरण की तरह ही, चौथी इमेज में किसी सदस्यता की टाइमलाइन दिखाई गई है. इसमें बताया गया है कि सदस्यता के नवीनीकरण के लिए ग्रेस पीरियड में जाने के बाद, खाते पर रोक लग जाती है. इसके बाद, खाते पर रोक लगने के दौरान ही सदस्यता वापस चालू हो जाती है.

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

इन बातों का ध्यान रखना ज़रूरी है:

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

समय सीमा खत्म होना

सदस्यता की अवधि खत्म होने के बाद, उपयोगकर्ता के पास सदस्यता का ऐक्सेस नहीं होना चाहिए. ऐसे में, SUBSCRIPTION_EXPIRED टाइप वाला SubscriptionNotification मैसेज भेजा जाता है. यह सूचना मिलने पर, Google Play Developer API से क्वेरी करें, ताकि आपको सदस्यता संसाधन का नया वर्शन मिल सके. इस बात की पुष्टि करने के बाद कि subscriptionState SUBSCRIPTION_STATE_EXPIRED है, एनटाइटलमेंट हटा दें. साथ ही, अपने बैकएंड में खरीदारी की स्थिति को अमान्य के तौर पर रजिस्टर करें. सदस्यता संसाधन, यहां दिए गए उदाहरण की तरह दिखता है:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time_in_past,
      ...
    }
  ],
}

रद्द की गई सदस्यताएं

कोई उपयोगकर्ता, Play के सदस्यता केंद्र में जाकर अपनी सदस्यता रद्द कर सकता है. इसके अलावा, अगर खाता होल्ड होने के बाद भी वह ठीक नहीं होता है, तो उसकी सदस्यता अपने-आप रद्द हो जाएगी. डेवलपर, purchases.subscriptionsv2.cancel की मदद से भी सदस्यता रद्द कर सकते हैं. सदस्यता रद्द होने पर, उपयोगकर्ता को मौजूदा बिलिंग साइकल के खत्म होने तक कॉन्टेंट का ऐक्सेस मिलता है. बिलिंग साइकल खत्म होने पर, ऐक्सेस रद्द कर दिया जाना चाहिए.

किस्तों में पेमेंट करने की सुविधा के बिना, अपने-आप रिन्यू होने वाली सदस्यता रद्द करने पर, SUBSCRIPTION_CANCELED सूचना ट्रिगर होती है. यह सूचना मिलने पर, Google Play Developer API से मिले सदस्यता संसाधन में, subscriptionState फ़ील्ड की वैल्यू SUBSCRIPTION_STATE_CANCELED पर सेट होती है. साथ ही, expiryTime फ़ील्ड में वह तारीख होती है जब उपयोगकर्ता को सदस्यता का ऐक्सेस नहीं मिलेगा. अगर वह तारीख बीत चुकी है, तो उपयोगकर्ता को तुरंत सदस्यता के फ़ायदों का ऐक्सेस नहीं मिलना चाहिए. ऐसा तब हो सकता है, जब कोई उपयोगकर्ता पेमेंट अस्वीकार होने की वजह से खाता होल्ड होने के दौरान सदस्यता रद्द कर देता है.

रद्द की गई खरीदारी के लिए सदस्यता संसाधन, यहां दिए गए उदाहरण की तरह दिखता है:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time,
      ...
    }
  ],
}

किस्तों में सदस्यता लेने पर, अगर उपयोगकर्ता सदस्यता रद्द करता है और उसे तय अवधि के लिए पेमेंट करना बाकी है, तो उसे SUBSCRIPTION_CANCELLATION_SCHEDULED सूचना भेजी जाती है. सदस्यता रद्द करने का अनुरोध अभी प्रोसेस नहीं हुआ है. यह मौजूदा कमिटमेंट पीरियड के खत्म होने के बाद लागू होगा. यह सूचना मिलने पर, Google Play Developer API से मिले सदस्यता संसाधन में, subscriptionState फ़ील्ड को SUBSCRIPTION_STATE_ACTIVE पर सेट किया जाता है. ऐसा इसलिए होता है, क्योंकि किस्त वाली सदस्यता, बिना किसी शुल्क के आज़माने की अवधि के खत्म होने तक चालू रहती है. हालांकि, pendingCancellation ऑब्जेक्ट मौजूद है. SUBSCRIPTION_CANCELED सूचना भेजी जाती है. इसके बाद, बिना किसी शुल्क के सदस्यता लेने की अवधि खत्म होने पर SUBSCRIPTION_EXPIRED सूचना भेजी जाती है.

किस्तों में सदस्यता खरीदने के लिए, सदस्यता संसाधन का ऐसा उदाहरण दिया गया है जिसे रद्द किया जाना है:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_plan01",
      "expiryTime": expiration_time,
      "autoRenewingPlan": {
        "autoRenewEnabled": true,
        "recurringPrice": {
          "currencyCode": "USD",
          "units": "1",
          "nanos": 990000000
        },
        "installmentDetails": {
          "initialCommittedPaymentsCount": 6,
          "remainingCommittedPaymentsCount": 5,
          "pendingCancellation": {}
      ...
        }
      }
    }
  ],
}

सदस्यता संसाधन में मौजूद canceledStateContext फ़ील्ड को देखकर, यह पता लगाया जा सकता है कि सदस्यता क्यों रद्द की गई. उदाहरण के लिए, यह पता लगाया जा सकता है कि सदस्यता उपयोगकर्ता, सिस्टम या आपने रद्द की है. अगर सदस्यता को उपयोगकर्ता ने रद्द किया है, तो userInitiatedCancellation फ़ील्ड में जाकर यह देखा जा सकता है कि उपयोगकर्ता ने सदस्यता क्यों रद्द की. इससे कम्यूनिकेशन की रणनीतियां बनाने में मदद मिल सकती है.

जब किसी सदस्यता को रद्द कर दिया जाता है, लेकिन उसकी समयसीमा खत्म नहीं होती है, तो उसे queryPurchasesAsync() से वापस कर दिया जाता है. ऐसा हो सकता है कि आपको अपने ऐप्लिकेशन में एक मैसेज दिखाना हो. इसमें उपयोगकर्ता को यह जानकारी दी गई हो कि उसकी सदस्यता रद्द कर दी गई है और सदस्यता खत्म होने की तारीख भी बताई गई हो.

सहमति रद्द करने के आंकड़े

सदस्यता रद्द करने की कई वजहें हो सकती हैं. जैसे, बैकएंड से purchases.subscriptionsv2.revoke का इस्तेमाल करके सदस्यता रद्द करना या खरीदारी के लिए शुल्क वापस किया जाना. ऐसे में, उपयोगकर्ता के एनटाइटलमेंट को तुरंत रद्द करें. ऐसा होने पर, टाइप SUBSCRIPTION_REVOKED वाला SubscriptionNotification मैसेज भेजा जाता है. यह सूचना मिलने पर, Google Play Developer API से मिले सदस्यता संसाधन में, subscriptionState फ़ील्ड की वैल्यू SUBSCRIPTION_STATE_EXPIRED पर सेट होती है.

रद्द की गई खरीदारी के लिए सदस्यता संसाधन, यहां दिए गए उदाहरण की तरह दिखता है:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": expiration_time,
      ...
    }
  ]
}

स्थगित की गई सदस्यताएं

किसी उपयोगकर्ता के एनटाइटलमेंट की समयसीमा बढ़ाने की कई वजहें हो सकती हैं. उदाहरण के लिए, आपको किसी खास प्रमोशन के तौर पर उपयोगकर्ताओं को बिना किसी शुल्क के ऐक्सेस देना हो सकता है. जैसे, फ़िल्म खरीदने पर एक हफ़्ते के लिए बिना किसी शुल्क के ऐक्सेस देना या सद्भावना के तौर पर खरीदारों को बिना किसी शुल्क के ऐक्सेस देना.

सदस्यताओं (ऐड-ऑन वाली सदस्यताएं भी शामिल हैं) के लिए बिलिंग की तारीख को कुछ समय के लिए टाला जा सकता है. इसके लिए, purchases.subscriptionsv2.defer एपीआई का इस्तेमाल करें. ऐड-ऑन वाली सदस्यता को कुछ समय के लिए रोकने पर, सदस्यता में शामिल सभी आइटम को एक ही अवधि के लिए रोक दिया जाता है.

किसी सदस्यता को कुछ समय के लिए रोकने पर, SubscriptionNotification टाइप वाला SUBSCRIPTION_DEFERRED मैसेज भेजा जाता है. बढ़ाई गई इस अवधि के दौरान, उपयोगकर्ता के पास आपके कॉन्टेंट का पूरा ऐक्सेस बना रहता है. हालांकि, उससे कोई शुल्क नहीं लिया जाता. सदस्यता रिन्यू करने की तारीख को नई तारीख के तौर पर अपडेट कर दिया जाएगा.

प्रीपेड प्लान के लिए, बिलिंग रोकने वाले एपीआई का इस्तेमाल करके, सदस्यता खत्म होने की तारीख को आगे बढ़ाया जा सकता है.

स्थगित की गई सदस्यता के लिए सदस्यता संसाधन, यहां दिए गए उदाहरण की तरह दिखता है:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": timestamp_in_future,
      ...
    }
  ],
}

रोकी गई सदस्यताएं

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

सदस्यता बार-बार ली जाती है हर हफ़्ते हर महीने तीन महीने छह महीने सालाना
पॉज़ करने की उपलब्ध अवधि* एक हफ़्ता
दो हफ़्ते
तीन हफ़्ते
चार हफ़्ते
एक महीना
दो महीने
तीन महीने
एक महीना
दो महीने
तीन महीने
एक महीना
दो महीने
तीन महीने
लागू नहीं
*इसमें किसी भी समय बदलाव किया जा सकता है.

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

पांचवीं इमेज. जब कोई व्यक्ति अपनी सदस्यता को रोकता है और फिर से शुरू करता है.
छठी इमेज. जब कोई उपयोगकर्ता अपनी सदस्यता को कुछ समय के लिए रोकता है और फिर खाते पर रोक लगाता है.

उपयोगकर्ता, सदस्यता को रोकने की अवधि के दौरान, मैन्युअल तरीके से कभी भी सदस्यता फिर से शुरू कर सकता है. जैसा कि इमेज 6 में दिखाया गया है. जब कोई उपयोगकर्ता मैन्युअल तरीके से सदस्यता फिर से शुरू करता है, तो बिलिंग की तारीख बदलकर, मैन्युअल तरीके से सदस्यता फिर से शुरू करने की तारीख हो जाती है.

जब किसी उपयोगकर्ता की सदस्यता रोकी जाती है, तो Play Billing Library, queryPurchasesAsync() तरीके से सदस्यता वापस नहीं देती है. ऐसा तब तक होता है, जब तक QueryPurchasesParams में includeSuspendedSubscriptions पैरामीटर को सही पर सेट नहीं किया जाता. सदस्यता फिर से शुरू होने पर, queryPurchasesAsync() तरीका इसे फिर से दिखाता है.

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

जब कोई उपयोगकर्ता अपनी सदस्यता रोकने की प्रोसेस शुरू करता है, तब SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED टाइप वाला SubscriptionNotification मैसेज भेजा जाता है. इस दौरान, उपयोगकर्ता के पास सदस्यता का ऐक्सेस होना चाहिए. यह ऐक्सेस, रिन्यूअल की अगली तारीख तक रहेगा. साथ ही, सदस्यता संसाधन में autoRenewEnabled = true होना चाहिए. फ़िलहाल, subscriptionState फ़ील्ड की वैल्यू SUBSCRIPTION_STATE_ACTIVE है.

जब पॉज़ करने की सुविधा चालू होती है, तब SUBSCRIPTION_PAUSED टाइप वाला SubscriptionNotification मैसेज भेजा जाता है. ऐसा होने पर, उपयोगकर्ता को अपनी सदस्यता का ऐक्सेस नहीं मिलना चाहिए. साथ ही, सदस्यता संसाधन में autoRenewEnabled = true होना चाहिए और subscriptionState फ़ील्ड को SUBSCRIPTION_STATE_PAUSED पर सेट किया जाना चाहिए. PausedStateContext ऑब्जेक्ट देखकर, यह पता लगाया जा सकता है कि सदस्यता कब रिन्यू होगी.

अगर सदस्यता को रोकने की अवधि खत्म होने पर, सदस्यता अपने-आप फिर से शुरू हो जाती है या उपयोगकर्ता ने सदस्यता को मैन्युअल तरीके से फिर से शुरू करने का विकल्प चुना है, तो SubscriptionNotification टाइप वाला SubscriptionNotification मैसेज भेजा जाता है.SUBSCRIPTION_RECOVERED

अगर सदस्यता को कुछ समय के लिए रोकने के बाद फिर से शुरू करते समय पेमेंट नहीं हो पाता है, तो SUBSCRIPTION_ON_HOLD टाइप वाला SubscriptionNotification मैसेज भेजा जाता है.

इन दोनों स्थितियों को खाते पर रोक के बारे में दी गई जानकारी के मुताबिक मैनेज किया जाना चाहिए.

फिर से सदस्यता लें

अपने-आप रिन्यू होने वाले सदस्यता के बुनियादी प्लान के लिए, Google Play Store पर फिर से सदस्यता लें बटन दिख सकता है. इस बटन की मदद से, लोग सदस्यता का ऐक्सेस वापस पा सकते हैं. यह कई वजहों से नहीं दिख सकता. उदाहरण के लिए, जब सदस्यता की समयसीमा बहुत पहले खत्म हो गई हो.

ऐसे खाते का इस्तेमाल करें जिसके पास लाइसेंस टेस्टर की भूमिका न हो.
सातवीं इमेज. Google Play Store ऐप्लिकेशन के खाता > सदस्यताएं सेक्शन में, रद्द की गई सदस्यता को दिखाया गया है. साथ ही, फिर से सदस्यता लें बटन को दिखाया गया है.

बटन पर हमेशा फिर से सदस्यता लें का लेबल लगा होता है. हालांकि, यह बटन किस तरह काम करेगा, यह सदस्यता की स्थिति पर निर्भर करता है.

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

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

सदस्यता खत्म होने से पहले वापस लाना

अगर आपका ऐप्लिकेशन, यह पता लगाने के लिए सिर्फ़ queryPurchasesAsync() तरीके का इस्तेमाल करता है कि किसी व्यक्ति के पास सदस्यता का ऐक्सेस है या नहीं, तो आपके ऐप्लिकेशन को सदस्यताएं अपने-आप वापस लानी चाहिए. ऐसा इसलिए, क्योंकि queryPurchasesAsync() तरीका, रद्द की गई सदस्यताओं के खत्म होने की तारीखों से पहले उन्हें वापस लाता रहता है. सदस्यता को वापस लाने पर, वह उसी तरह रिन्यू होती है जैसे उसे रद्द नहीं किया गया था.

अगर आपका ऐप्लिकेशन, सदस्यता की स्थिति को बैकएंड के साथ सिंक करता है, तो आपको SubscriptionNotification टाइप वाला SUBSCRIPTION_RESTARTED मैसेज सुनना चाहिए. यह आरटीडीएन मिलने के बाद, आपका ऐप्लिकेशन सूचना का जवाब दे सकता है. साथ ही, यह रिकॉर्ड कर सकता है कि सदस्यता को अब रिन्यू करने के लिए सेट कर दिया गया है. इसके अलावा, यह आपके ऐप्लिकेशन में सदस्यता वापस पाने से जुड़े मैसेज दिखाना बंद कर सकता है. सदस्यता का संसाधन, इस उदाहरण की तरह दिखता है:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date
      ...
    }
  ],
}

सदस्यता की समयसीमा खत्म होने के बाद फिर से सदस्यता लेना

अगर Google Play Console या API का इस्तेमाल करके, अपने-आप रिन्यू होने वाले बुनियादी प्लान को इस तरह कॉन्फ़िगर किया गया है कि उपयोगकर्ता फिर से सदस्यता ले सकें, तो वे Google Play Store में जाकर, समयसीमा खत्म हो चुकी सदस्यता को फिर से खरीद सकते हैं.

ये नई खरीदारी हैं. Google Play, खरीदारी का नया टोकन जारी करता है. साथ ही, आपका बैकएंड SUBSCRIPTION_PURCHASED टाइप वाला आरटीडीएन पाता है. इस तरह की ऐप्लिकेशन के बाहर जाकर की जाने वाली खरीदारी के लिए, खरीदारी की स्थिति में linkedPurchaseToken शामिल नहीं होता. ऐसा इसलिए, क्योंकि मूल सदस्यता पूरी तरह से खत्म हो गई है.

दोबारा खरीदी गई सदस्यताओं के लिए, उपयोगकर्ता को सही तरीके से जोड़ने और बिना पुष्टि वाली खरीदारी के लिए अपने-आप रिफ़ंड होने से रोकने के लिए, आपको अपने बैकएंड सर्वर पर दोबारा खरीदारी की पुष्टि करनी होगी:

  1. आरटीडीएन से मिले नए परचेज़ टोकन के साथ, purchases.subscriptionsv2.get को कॉल करें. ऐप्लिकेशन के बाहर की जाने वाली इस तरह की खरीदारी के जवाब में, outOfAppPurchaseContext फ़ील्ड शामिल होता है. यह फ़ील्ड, सिर्फ़ उन खरीदारी के लिए मौजूद होता है जिनकी पुष्टि नहीं की गई है. इस फ़ील्ड में यह जानकारी मिलती है:

    • expiredExternalAccountIdentifiers: यह एक ExternalAccountIdentifiers ऑब्जेक्ट है. इसमें obfuscatedAccountId और obfuscatedProfileId फ़ील्ड शामिल होते हैं. ये फ़ील्ड, पहले खत्म हो चुकी सदस्यता के लिए कॉन्फ़िगर किए गए थे. हालांकि, ऐसा तब होता है, जब इन्हें सेट किया गया हो.
    • expiredPurchaseToken: यह पिछली सदस्यता का परचेज़ टोकन है जिसकी समयसीमा खत्म हो चुकी है.

    इनमें से किसी एक आइडेंटिफ़ायर का इस्तेमाल करके, नई खरीदारी को अपने बैकएंड में मौजूद सही उपयोगकर्ता खाते से खोजें और लिंक करें.

  2. खरीदारी की पुष्टि करने के लिए, purchases.subscriptions.acknowledge को कॉल करें.

    • अगर आपने ऐप्लिकेशन में मौजूद बिलिंग फ़्लो के दौरान, setObfuscatedAccountId और setObfuscatedProfileId का इस्तेमाल करके obfuscatedAccountId और obfuscatedProfileId को कॉन्फ़िगर किया था, तो आपके पास उपयोगकर्ता की obfuscatedAccountId और obfuscatedProfileId भेजने का विकल्प होता है.

सर्वर साइड वाले इस तरीके से, खरीदारी की तारीख से तीन दिनों के अंदर खरीदारी की पुष्टि की जा सकती है. भले ही, उपयोगकर्ता आपका ऐप्लिकेशन न खोले.

अपग्रेड, डाउनग्रेड, और फिर से सदस्यता लेना

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

इसके अलावा, Google Play Developer API से मिले सदस्यता संसाधन में linkedPurchaseToken फ़ील्ड होता है. इससे पता चलता है कि उपयोगकर्ता ने किस पुरानी खरीदारी से अपग्रेड, डाउनग्रेड या फिर से सदस्यता ली है. उस फ़ील्ड में मौजूद परचेज़ टोकन का इस्तेमाल करके, पुरानी सदस्यता की जानकारी देखी जा सकती है. साथ ही, मौजूदा उपयोगकर्ता खाते की पहचान की जा सकती है, ताकि नई खरीदारी को उसी खाते से जोड़ा जा सके.

अपने ऐप्लिकेशन में किसी उपयोगकर्ता को अपग्रेड, डाउनग्रेड या फिर से सदस्यता लेने के विकल्प देने से पहले, आपको उसकी मौजूदा सदस्यता की पुष्टि करनी होगी. अगर मौजूदा सदस्यता की पुष्टि होना बाकी है, तो प्लान में बदलाव करने या फिर से सदस्यता लेने की सुविधा काम नहीं करेगी.

अगर उपयोगकर्ता अपग्रेड, डाउनग्रेड या फिर से सदस्यता खरीदने में सफल होता है, तो यह एक नई खरीदारी है. आपको इसकी पुष्टि करनी होगी. इसके लिए, Google Play Developer API का इस्तेमाल करना सबसे सही तरीका है. सदस्यता संसाधन, यहां दिए गए उदाहरण की तरह दिखता है:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  ...
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "linkedPurchaseToken": old_purchase_token,
  ...
  "lineItems": [
    {
      "productId": "sub_variant_plan01",
      "expiryTime": next_renewal_date,
      "autoRenewingPlan": {
        "autoRenewEnabled": true
      }
    }
  ],
}

कीमत में बदलाव

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

किराये में बदलाव होने पर और किराये में बदलाव की स्थिति से जुड़े किसी भी अपडेट के लिए, आपको SUBSCRIPTION_PRICE_CHANGE_UPDATED आरटीडीएन मिलेगा. purchases.subscriptionsv2.get एंडपॉइंट से क्वेरी करके, सदस्यता संसाधन पाया जा सकता है. इसमें सदस्यता में शामिल हर आइटम के लिए, कीमत में हुए बदलाव की जानकारी होगी.

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

ऑप्ट-इन करने पर कीमत में बदलाव की पुष्टि करने वाले उपयोगकर्ता को मैनेज करना

जब कोई उपयोगकर्ता, सदस्यता के लिए बढ़ी हुई कीमत को स्वीकार करता है, तब आपको SubscriptionNotification मैसेज मिलता है. इसका टाइप SUBSCRIPTION_PRICE_CHANGE_UPDATED होता है.

कीमत में बदलाव लागू होने के बाद, रिन्यूअल मैनेज करना

कीमत में गिरावट होने पर या सदस्यता की कीमत में बढ़ोतरी के साथ रिन्यू होने पर, आपको SubscriptionNotification मैसेज मिलेगा. इसका टाइप SUBSCRIPTION_RENEWED होगा. इस सूचना को किसी अन्य नवीनीकरण की तरह ही समझें.

उन मामलों को मैनेज करना जिनमें ऑप्ट-इन का विकल्प देने के साथ कीमत बढ़ाने की सुविधा स्वीकार नहीं की जाती

अगर किसी व्यक्ति ने बढ़ी हुई कीमत पर सदस्यता रिन्यू करने से पहले, ऑप्ट-इन करने के विकल्प के साथ की गई कीमत में बढ़ोतरी को स्वीकार नहीं किया है, तो उसकी सदस्यता अपने-आप रद्द हो जाएगी. साथ ही, आपको SUBSCRIPTION_CANCELED टाइप वाला SubscriptionNotification मैसेज मिलेगा. इस इवेंट को रद्द किए गए इवेंट में बताए गए तरीके से हैंडल करें.

उपयोगकर्ता, कीमत बढ़ने पर सदस्यता छोड़ने के लिए भी इसी तरीके से अपनी सदस्यताएं रद्द कर सकते हैं.

दक्षिण कोरिया (केआर) में लागू हुए नए नियमों के मुताबिक, केआर में रहने वाले सदस्यता उपयोगकर्ताओं को, मुफ़्त में आज़माने की अवधि या शुरुआती अवधि खत्म होने के बाद, कीमत में होने वाली किसी भी बढ़ोतरी के लिए सहमति देनी होगी.

नियमों का पालन करने में आपकी मदद करने के लिए, Play, कोरिया में रहने वाले उपयोगकर्ताओं को सहमति देने की ज़रूरत के बारे में सूचना देगा. साथ ही, उपयोगकर्ताओं से मिली सहमति की जानकारी को भी सेव करेगा. जिन लोगों ने बढ़ी हुई कीमत लागू होने से पहले सहमति नहीं दी है उनकी सदस्यताएं अपने-आप रद्द हो जाती हैं. Play से भेजी गई सूचनाओं के अलावा, अपने उपयोगकर्ताओं को कीमत में बढ़ोतरी की कस्टम सूचनाएं भी भेजी जा सकती हैं. साथ ही, सूचनाओं में मैनेजमेंट पेज का लिंक भी दिया जा सकता है.

सहमति की अवधि शुरू होने पर या उपयोगकर्ता के सहमति देने पर, आपको SubscriptionNotification मैसेज मिलेगा. इसका टाइप SUBSCRIPTION_PRICE_STEP_UP_CONSENT_UPDATED होगा.

कीमत में बढ़ोतरी और कीमत में बदलाव के बीच अंतर

price step-up का मतलब है कि सदस्यता की कीमत में बढ़ोतरी हुई है. ऐसा इसलिए हुआ है, क्योंकि ऑफ़र का एक फ़ेज़ खत्म हो गया है और दूसरे फ़ेज़ में ट्रांज़िशन हुआ है. उदाहरण के लिए, बिना शुल्क आज़माने की अवधि खत्म होने के बाद, सदस्यता की कीमत में बदलाव होना. सदस्यता की मौजूदा स्थिति का पता लगाने के लिए, सदस्यता संसाधन में मौजूद offerPhase फ़ील्ड का इस्तेमाल किया जा सकता है.

हालांकि, price change का मतलब है कि आपने (डेवलपर) सदस्यता के बुनियादी प्लान की कीमत में बदलाव किया है. उदाहरण के लिए, बढ़ी हुई कीमत के लिए मंज़ूरी देना या कीमत बढ़ने पर सदस्यता छोड़ना.

प्रीपेड प्लान के लाइफ़साइकल को मैनेज करना

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

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

आठवीं इमेज. सदस्यता की खरीदारी के लिए, लाइफ़साइकल की स्थितियां और ट्रांज़िशन इवेंट.

जब भी कोई प्रीपेड प्लान की सदस्यता खरीदी जाती है, तब आपके आरटीडीएन क्लाइंट को SubscriptionNotification मैसेज भेजा जाता है. इस मैसेज का टाइप SUBSCRIPTION_PURCHASED होता है. इसमें हर टॉप-अप शामिल होता है. प्रीपेड प्लान की सदस्यता की मौजूदा स्थिति जानने के लिए, purchases.subscriptionsv2.get तरीके को कॉल करें.

टॉप-अप की खरीदारी के लिए, नया परचेज़ टोकन जारी किया जाता है. साथ ही, आपको linkedPurchaseToken फ़ील्ड में पिछला परचेज़ टोकन मिलता है. यह टोकन, सदस्यता की नई खरीदारी की स्थिति का हिस्सा होता है. खरीदारी का टोकन, सदस्यता के लिए साइन अप करने से लेकर सदस्यता खत्म होने के 60 दिनों तक मान्य होता है. इस तारीख के बाद, Google Play Developer API को कॉल करने के लिए, खरीदारी वाले टोकन का इस्तेमाल नहीं किया जा सकेगा.

प्रीपेड प्लान खरीदने के लिए सदस्यता का संसाधन, यहां दिए गए उदाहरण जैसा दिखता है:

{
  "kind": "androidpublisher#subscriptionPurchaseV2",
  "startTime": "2022-04-22T18:39:58.270Z",
  "regionCode": "US",
  "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
  "latestOrderId": "GPA.3333-4137-0319-36762",
  "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
  "lineItems": [
    {
      "productId": "prepaid_plan01",
      "expiryTime": expiry_date,
      "prepaidPlan": {
        "allowExtendAfterTime": timestamp_after_which_topups_are_allowed
      }
    }
  ]
}

expiryTime फ़ील्ड में, यह देखा जा सकता है कि एनटाइटलमेंट कब खत्म होगा. टॉप-अप खरीदने पर, एनटाइटलमेंट का समय बढ़ जाता है. इसका मतलब है कि अगर उपयोगकर्ता, सदस्यता के मूल अधिकार के खत्म होने से पहले टॉप अप करता है, तो नई समयावधि को पिछली समयसीमा खत्म होने की तारीख में जोड़ दिया जाता है.

आपको अपने ऐप्लिकेशन में एक मैसेज दिखाना पड़ सकता है. इसमें उपयोगकर्ता को यह जानकारी दी जाती है कि टॉप-अप करके, प्रीपेड सदस्यताएं बढ़ाई जा सकती हैं. यह जानने के लिए कि कोई उपयोगकर्ता कब टॉप-अप कर पाएगा, सदस्यता संसाधन में मौजूद allowExtendAfterTime फ़ील्ड देखें.

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

प्रीपेड प्लान के लिए 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 की जगह इस्तेमाल किया जाता है.