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

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

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

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

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

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

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

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

दूसरी इमेज. ऐसी सदस्यता की टाइमलाइन जो ग्रेस पीरियड में चली जाती है और उसके खत्म होने से पहले ही फिर से चालू हो जाती है.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

सदस्यता वापस लाने पर, नया ऑर्डर जनरेट नहीं होता. अगर आपको किसी ऐसी सदस्यता के लिए 0.00 डॉलर का ऑर्डर दिखता है जिसे उपयोगकर्ता ने पहले रद्द कर दिया था, तो हो सकता है कि उपयोगकर्ता ने सदस्यता खत्म होने से पहले, आपके ऐप्लिकेशन से फिर से साइन अप किया हो. ज़्यादा जानकारी के लिए, अपग्रेड करना, डाउनग्रेड करना, और फिर से सदस्यता लेना लेख पढ़ें.

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

अगर 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 को कॉल करें.

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

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

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

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

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

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

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

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

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

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

नियम का पालन करने में आपकी मदद करने के लिए, Google 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 की जगह लेता है.