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

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

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

जब किसी उपयोगकर्ता की सदस्यता की स्थिति बदलती है, तो आपके बैकएंड सर्वर को 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 का इस्तेमाल करके आइडेंटिफ़ायर सेट किए गए हों.

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
      }
    }
  ],
}

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

बिना किस्तों के अपने-आप रिन्यू होने वाली सदस्यताओं के लिए, सदस्यता रिन्यू होने पर 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
      }
    }
  ]
}

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

ग्रेस पीरियड

अगर सदस्यता रिन्यू करने के लिए पेमेंट करने में कोई समस्या आती है, तो 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 दिनों से घटाकर 7 दिन कर दिया है, तो जिन उपयोगकर्ताओं की छूट की अवधि 8 से 14 दिन के बीच है उन्हें सदस्यता के फ़ायदे तुरंत नहीं मिलेंगे.
  • सदस्यता चालू रहती है. साथ ही, आपको साइलेंट ग्रेस पीरियड खत्म होने तक, ग्रेस पीरियड का आरटीडीएन नहीं मिलेगा

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

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

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

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

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

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

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

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

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

आरटीडीएन से आपको तब सूचना मिलती है, जब उपयोगकर्ता खाते पर रोक लगने की अवधि में प्रवेश करता है. इससे आपको उन्हें यह बताने का मौका मिलता है कि सदस्यता का ऐक्सेस क्यों निलंबित किया गया है. इसके लिए, In-App Messaging API का इस्तेमाल करना सबसे आसान तरीका है. जब आपका उपयोगकर्ता ऐप्लिकेशन खोलता है, तब इस एपीआई को कॉल करने पर, उपयोगकर्ता को कुछ समय के लिए दिखने वाले स्नैकबार में एक मैसेज दिखेगा. इसमें उसे बताया जाएगा कि उसका पेमेंट अस्वीकार कर दिया गया है. इस मैसेज में, उपयोगकर्ता के लिए एक डीप लिंक भी शामिल होता है. इसकी मदद से, उपयोगकर्ता 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 का इस्तेमाल करके सदस्यता रद्द करना या खरीदारी के लिए शुल्क वापस किया जाना. इस स्थिति में, उपयोगकर्ता के एनटाइटलमेंट को तुरंत रद्द करें. ऐसा होने पर, SubscriptionNotification टाइप वाला SUBSCRIPTION_REVOKED मैसेज भेजा जाता है. यह सूचना मिलने पर, Google Play Developer API से मिले सदस्यता संसाधन में, subscriptionState फ़ील्ड की वैल्यू SUBSCRIPTION_STATE_EXPIRED पर सेट होती है.

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

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

सदस्यताएं रिन्यू करने की तारीख आगे बढ़ाना

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

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

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

{
  "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 को कॉन्फ़िगर किया था, तो आपके पास उन्हें भेजने का विकल्प होता है.

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

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

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

इसके अलावा, 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 का मतलब है कि सदस्यता की कीमत में बढ़ोतरी हुई है. ऐसा इसलिए हुआ है, क्योंकि ऑफ़र का एक फ़ेज़ खत्म हो गया है और दूसरा फ़ेज़ शुरू हो गया है. उदाहरण के लिए, बिना शुल्क आज़माने की अवधि खत्म होने के बाद, सदस्यता की कीमत में बदलाव होना.

हालांकि, 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 की जगह लेता है.