इस दस्तावेज़ में, सदस्यता के लाइफ़साइकल इवेंट मैनेज करने का तरीका बताया गया है. जैसे, रिन्यूअल और समयसीमा खत्म होना. इसमें सदस्यता से जुड़ी अन्य सुविधाओं के बारे में भी बताया गया है. जैसे, प्रमोशन ऑफ़र करना और उपयोगकर्ताओं को अपनी सदस्यताएं मैनेज करने की अनुमति देना.
अगर आपने अपने ऐप्लिकेशन के लिए सदस्यता वाले प्रॉडक्ट कॉन्फ़िगर नहीं किए हैं, तो अपने प्रॉडक्ट बनाएं और उन्हें कॉन्फ़िगर करें लेख पढ़ें.
सदस्यता अवलोकन
सदस्यता एक ऐसा लेन-देन है जो बार-बार होता है. इससे लोगों को कुछ खास फ़ायदे मिलते हैं. एनटाइटलमेंट, फ़ायदों का एक ऐसा सेट होता है जिसे उपयोगकर्ता तय समयावधि के दौरान ऐक्सेस कर सकते हैं. उदाहरण के लिए, सदस्यता लेने पर उपयोगकर्ता को प्रीमियम ऐक्सेस मिल सकता है.
बुनियादी प्लान और ऑफ़र की मदद से, एक ही सदस्यता प्रॉडक्ट के लिए कई कॉन्फ़िगरेशन बनाए जा सकते हैं. उदाहरण के लिए, उन लोगों के लिए शुरुआती ऑफ़र बनाया जा सकता है जिन्होंने कभी आपके ऐप्लिकेशन की सदस्यता नहीं ली है. इसी तरह, उन लोगों के लिए अपग्रेड ऑफ़र बनाया जा सकता है जिन्होंने पहले से ही सदस्यता ली हुई है.
सदस्यता वाले प्रॉडक्ट, बुनियादी प्लान, और ऑफ़र के बारे में ज़्यादा जानकारी के लिए, Play Console के सहायता केंद्र में मौजूद दस्तावेज़ देखें.
Play Billing Library में, सदस्यता के इन टाइप का इस्तेमाल किया जा सकता है:
एक आइटम वाली सदस्यता - इस तरह की सदस्यता में, एक एनटाइटलमेंट के लिए एक आइटम होता है. उदाहरण के लिए, संगीत स्ट्रीम करने वाली किसी सेवा की सदस्यता.
ऐड-ऑन के साथ सदस्यता - इस तरह की सदस्यता में, एक खरीदारी में कई अलग-अलग एनटाइटलमेंट बंडल किए जा सकते हैं. उदाहरण के लिए, संगीत स्ट्रीमिंग सेवा और वीडियो स्ट्रीमिंग सेवा, दोनों की सदस्यता. ऐड-ऑन वाली सदस्यता के बारे में खास जानकारी के लिए, ऐड-ऑन वाली सदस्यताएं लेख पढ़ें.
प्रीपेड प्लान इंटिग्रेशन
प्रीपेड प्लान की समयसीमा खत्म होने पर, ये अपने-आप रिन्यू नहीं होते. सदस्यता के फ़ायदे बिना किसी रुकावट के पाने के लिए, उपयोगकर्ता को उसी सदस्यता के लिए प्रीपेड प्लान को टॉप-अप करना होगा.
टॉप-अप के लिए, बिलिंग फ़्लो को उसी तरह लॉन्च करें जिस तरह मूल खरीदारी के लिए किया जाता है. आपको यह बताने की ज़रूरत नहीं है कि खरीदारी टॉप-अप है.
प्रीपेड प्लान के टॉप-अप के लिए, हमेशा CHARGE_FULL_PRICE रिप्लेसमेंट मोड का इस्तेमाल किया जाता है. आपको इस मोड को अलग से सेट करने की ज़रूरत नहीं होती. उपयोगकर्ता से, पूरी बिलिंग अवधि का शुल्क तुरंत ले लिया जाता है. साथ ही, टॉप-अप में बताई गई अवधि के लिए, उसके एनटाइटलमेंट की अवधि बढ़ा दी जाती है.
टॉप-अप के बाद, Purchase नतीजे वाले ऑब्जेक्ट में मौजूद इन फ़ील्ड को अपडेट किया जाता है, ताकि हाल ही में किए गए टॉप-अप की जानकारी दिख सके:
- ऑर्डर आईडी
- खरीदारी का समय
- सिग्नेचर
- खरीदी टोकन
- स्वीकार करें
नीचे दिए गए Purchase फ़ील्ड में हमेशा वही डेटा होता है जो मूल खरीदारी में मौजूद होता है:
- पैकेज का नाम
- खरीदारी की स्थिति
- प्रॉडक्ट
- अपने-आप रिन्यू होने वाली सदस्यता
पैसे पहले चुकाकर की गई खरीदारी की पुष्टि
अपने-आप रिन्यू होने वाली सदस्यताओं की तरह ही, प्रीपेड प्लान खरीदने के बाद आपको इसकी पुष्टि करनी होगी. शुरुआती खरीदारी और किसी भी टॉप-अप को स्वीकार करना ज़रूरी है. ज़्यादा जानकारी के लिए, खरीदारी प्रोसेस करना लेख पढ़ें.
प्रीपेड प्लान की अवधि कम हो सकती है. इसलिए, यह ज़रूरी है कि खरीदारी की पुष्टि जल्द से जल्द की जाए.
एक हफ़्ते या इससे ज़्यादा अवधि वाले प्रीपेड प्लान के लिए, तीन दिनों के अंदर सूचना देनी होगी.
अगर प्रीपेड प्लान की अवधि एक हफ़्ते से कम है, तो इसकी सूचना प्लान की अवधि के आधे समय में देनी होगी. उदाहरण के लिए, डेवलपर के पास तीन दिन के प्रीपेड प्लान को स्वीकार करने के लिए, डेढ़ दिन का समय होता है.
किस्तों में सदस्यता लेने की सुविधा का इंटिग्रेशन
किस्तों में सदस्यता लेने की सुविधा, सदस्यता का एक ऐसा टाइप है जिसमें उपयोगकर्ता, सदस्यता के लिए एक बार में पूरा शुल्क चुकाने के बजाय, एक तय समयावधि में कई किस्तों में पेमेंट करते हैं.
किस्तों में सदस्यता लेने के लिए, इन बातों का ध्यान रखें:
- देश के हिसाब से उपलब्धता: किस्तों में सदस्यता लेने की सुविधा सिर्फ़ ब्राज़ील, फ़्रांस, इटली, और स्पेन में उपलब्ध है. इस सुविधा की उपलब्धता के बारे में अप-टू-डेट जानकारी के लिए, Console देखें.
- किस्त की कीमत सेट करना: Console पर किस्त वाली सदस्यता की कीमत सेट करते समय, यह कीमत हर महीने चुकाई जाने वाली रकम होती है. यह, सदस्यता की अवधि के साथ मिलकर, खरीदारी वाली स्क्रीन पर सदस्यता के लिए कुल रकम जनरेट करता है.
- वह अवधि जिसमें सदस्यता रद्द नहीं की जा सकती: सदस्यता लेने के बाद, वह अवधि जिसमें सदस्यता रद्द नहीं की जा सकती. इस दौरान, हर महीने पेमेंट करना ज़रूरी होता है. उदाहरण के लिए, अगर बुनियादी प्लान के लिए 15 महीने की प्रतिबद्धता अवधि है, तो उपयोगकर्ता इस अवधि के दौरान हर महीने 15 बार पेमेंट करेगा.
- रिन्यूअल: किस्तों में सदस्यता लेने के मामले में, "रिन्यूअल" का मतलब है कि पैसे चुकाने की अवधि खत्म हो गई है. यह अवधि, शुरुआती अवधि या बाद की अवधि हो सकती है. पहली बार साइन अप करने के बाद, पहली बार रिन्यूअल तब होता है, जब शुरुआती अवधि पूरी हो जाती है. अगले रिन्यूअल, प्रतिबद्धता की हर अवधि पूरी होने के बाद होते हैं. किस्तों में सदस्यता लेने के लिए, रिन्यूअल के टाइप ये हो सकते हैं: "हर महीने अपने-आप रिन्यू हो" या "उसी अवधि के लिए अपने-आप रिन्यू हो". "हर महीने अपने-आप रिन्यू होने वाली सदस्यता" के लिए, कोई और प्रतिबद्धता नहीं होती है. यह प्लान, महीने के हिसाब से ली जाने वाली सदस्यता की तरह काम करता है. इसमें हर महीने के सदस्यता शुल्क को रिन्यूअल माना जाता है.
- बिलिंग अवधि: किस्तों में सदस्यता लेने के मामले में, इसका मतलब है कि बुनियादी प्लान में तय किए गए समय के हिसाब से, बार-बार पेमेंट किया जाता है.
- प्लान में बदलाव करने और कीमत में बदलाव करने के तरीके: कीमत में बदलाव करने और सदस्यता रद्द करने के लिए, खरीदार को पक्का करना होता है कि वह ऐसा करना चाहता है. इसका मतलब है कि अगर कोई उपयोगकर्ता सदस्यता रद्द करना चाहता है या कोई डेवलपर कीमत में बदलाव करना चाहता है, तो ये बदलाव उस अवधि के बाद लागू होंगे जिसमें सदस्यता रद्द नहीं की जा सकती. प्लान बदलने पर, तय की गई कीमत लागू नहीं होती. इसका मतलब है कि प्लान बदलने के लिए, कमिटमेंट पीरियड के खत्म होने का इंतज़ार नहीं करना पड़ता. यह बदलाव, सेट किए गए रिप्लेसमेंट मोड के आधार पर, तुरंत या पेमेंट की अगली तारीख पर लागू हो जाता है.
- एक ही सदस्यता के प्लान में बदलाव: किस्तों में पेमेंट करने वाले बुनियादी प्लान से, उसी सदस्यता के प्रॉडक्ट के लिए किस्तों में पेमेंट न करने वाले बुनियादी प्लान पर स्विच करने की अनुमति नहीं है.
डेवलपर से जुड़ी रीयल-टाइम सूचनाएं (आरटीडीएन): अगर उपयोगकर्ता ने तय अवधि के लिए पेमेंट किया है और वह सदस्यता रद्द करता है, तो उसे तुरंत
SUBSCRIPTION_CANCELLATION_SCHEDULEDआरटीडीएन भेजी जाती है. सदस्यता रद्द करने का अनुरोध अभी पूरा नहीं हुआ है. यह अनुरोध, बिना किसी शुल्क के सदस्यता इस्तेमाल करने की अवधि खत्म होने के बाद ही लागू होगा. इसके बाद, अगर उपयोगकर्ता ने सदस्यता वापस नहीं लाई है, तो कमिटमेंट की अवधि खत्म होने परSUBSCRIPTION_CANCELEDऔरSUBSCRIPTION_EXPIREDआरटीडीएन भेजे जाते हैं.पेमेंट / रेवेन्यू: हर महीने उपयोगकर्ता के पेमेंट करने के बाद, डेवलपर को पेमेंट किया जाता है. हालांकि, इसके लिए वही शर्तें लागू होंगी जो अन्य सभी सदस्यताओं पर लागू होती हैं. जब उपयोगकर्ता किस्तों में सदस्यता लेने के लिए साइन अप करता है, तब डेवलपर को ऐडवांस में पेमेंट नहीं किया जाता.
किस्त का पेमेंट न मिलने पर: अगर कोई उपयोगकर्ता सदस्यता के लिए किस्त का पेमेंट नहीं करता है, तो Google और डेवलपर, दोनों ही उस उपयोगकर्ता से बकाया पेमेंट नहीं मांगेंगे. हालांकि, Google, पेमेंट फिर से करने की सामान्य प्रक्रिया के तहत, ग्रेस पीरियड या खाता होल्ड होने की अवधि के दौरान, समय-समय पर पेमेंट फिर से करने की कोशिश कर सकता है. Google, डेवलपर को बकाया किस्तों का पेमेंट करने के लिए ज़िम्मेदार नहीं होगा.
Play Billing Library की उपलब्धता:
installmentDetailsफ़ील्ड, सिर्फ़ PBL 7 या उसके बाद के वर्शन के लिए उपलब्ध है. PBL 5 और इसके बाद के वर्शन के लिए,queryProductDetails()का इस्तेमाल करके किस्तों में सदस्यता का रिफ़ंड दिया जाता है. हालांकि, सदस्यता में किस्त की पूरी जानकारी शामिल नहीं होगी. जैसे, प्लान के लिए किए गए पेमेंट की संख्या.
उपयोगकर्ताओं को सदस्यता मैनेज करने की अनुमति देने के लिए डीप लिंक का इस्तेमाल करना
आपके ऐप्लिकेशन में सेटिंग या प्राथमिकताओं वाली स्क्रीन पर एक लिंक होना चाहिए. इससे लोग अपनी सदस्यताएं मैनेज कर पाएंगे. इस लिंक को अपने ऐप्लिकेशन के नैचुरल लुक और फ़ील में शामिल किया जा सकता है.
अपने ऐप्लिकेशन में, Google Play सदस्यता केंद्र का डीप लिंक शामिल किया जा सकता है. इससे, उन सदस्यताओं को ऐक्सेस किया जा सकेगा जिनकी समयसीमा खत्म नहीं हुई है. इनकी जानकारी पाने के लिए, सदस्यता संसाधन के subscriptionState फ़ील्ड का इस्तेमाल करें. इसके आधार पर, Play Store के सदस्यता केंद्र में डीप लिंक करने के कई तरीके हैं.
सदस्यता केंद्र का लिंक
उपयोगकर्ताओं को उस पेज पर भेजने के लिए इस यूआरएल का इस्तेमाल करें जहां उनकी सभी सदस्यताएं दिखती हैं. जैसा कि पहले और दूसरे डायग्राम में दिखाया गया है:
https://play.google.com/store/account/subscriptions
यह डीप लिंक, किसी उपयोगकर्ता को Play Store के सदस्यता केंद्र से रद्द की गई सदस्यता को बहाल करने में मदद कर सकता है.
सदस्यता मैनेज करने वाले किसी पेज का लिंक (सुझाया गया)
अगर आपको बिना किसी रुकावट के चालू सदस्यता के मैनेजमेंट पेज से सीधे लिंक करना है, तो खरीदे गए सदस्यता से जुड़े पैकेज का नाम और productId बताएं. किसी मौजूदा सदस्यता के लिए, प्रोग्राम के हिसाब से productId तय करने के लिए, अपने ऐप्लिकेशन के बैकएंड से क्वेरी करें. इसके अलावा, किसी उपयोगकर्ता से जुड़ी सदस्यताओं की सूची पाने के लिए, BillingClient.queryPurchasesAsync() को कॉल करें. हर सदस्यता में, सदस्यता की स्थिति की जानकारी के तौर पर productId शामिल होता है.
सदस्यता की खरीदारी से जुड़े हर SubscriptionPurchaseLineItem ऑब्जेक्ट में, productId वैल्यू होती है. यह वैल्यू, उस सदस्यता से जुड़ी होती है जिसे उपयोगकर्ता ने उस लाइन आइटम में खरीदा है.
लोगों को सदस्यता मैनेज करने की किसी खास स्क्रीन पर ले जाने के लिए, इस यूआरएल का इस्तेमाल करें. साथ ही, "your-sub-product-id" और "your-app-package" को productId और ऐप्लिकेशन पैकेज के नाम से बदलें:
https://play.google.com/store/account/subscriptions?sku=your-sub-product-id&package=your-app-package
इसके बाद, उपयोगकर्ता पेमेंट के तरीकों को मैनेज कर सकता है. साथ ही, सदस्यता रद्द करने, फिर से सदस्यता लेने, और सदस्यता रोकने जैसी सुविधाओं को ऐक्सेस कर सकता है.
उपयोगकर्ताओं को अपनी सदस्यता अपग्रेड, डाउनग्रेड या बदलने की अनुमति दें
मौजूदा सदस्यों को उनकी ज़रूरतों के हिसाब से, सदस्यता प्लान बदलने के लिए अलग-अलग विकल्प दिए जा सकते हैं:
- अगर आपने सदस्यता के कई टियर बेचे हैं, जैसे कि "बुनियादी" और "प्रीमियम" सदस्यता, तो उपयोगकर्ताओं को टियर स्विच करने की अनुमति दी जा सकती है. इसके लिए, उन्हें किसी दूसरी सदस्यता का बुनियादी प्लान या ऑफ़र खरीदना होगा.
- उपयोगकर्ताओं को बिलिंग की मौजूदा अवधि बदलने की अनुमति दी जा सकती है. जैसे, हर महीने वाले प्लान से सालाना प्लान पर स्विच करना.
- आपके पास उपयोगकर्ताओं को, अपने-आप रिन्यू होने वाले और प्रीपेड प्लान के बीच स्विच करने की अनुमति देने का विकल्प भी होता है.
इनमें से किसी भी बदलाव को बढ़ावा देने के लिए, सदस्यता के ऑफ़र दिए जा सकते हैं. इससे ज़रूरी शर्तें पूरी करने वाले लोगों को छूट दी जा सकती है. उदाहरण के लिए, महीने के प्लान से सालाना प्लान पर स्विच करने वाले लोगों के लिए, पहले साल 50% की छूट वाला ऑफ़र बनाया जा सकता है. साथ ही, इस ऑफ़र को सिर्फ़ उन लोगों के लिए उपलब्ध कराया जा सकता है जिन्होंने महीने के प्लान की सदस्यता ली है और इस ऑफ़र को नहीं खरीदा है. ऑफ़र से जुड़ी ज़रूरी शर्तों के बारे में ज़्यादा जानकारी सहायता केंद्र में उपलब्ध है
तीसरी इमेज में, एक ऐप्लिकेशन का उदाहरण दिखाया गया है. इसमें तीन अलग-अलग प्लान दिए गए हैं:
आपका ऐप्लिकेशन, उपयोगकर्ताओं को सदस्यता बदलने के विकल्प देने के लिए, तीसरे फ़िगर जैसी स्क्रीन दिखा सकता है. सभी मामलों में, उपयोगकर्ताओं को यह साफ़ तौर पर पता होना चाहिए कि उनका मौजूदा सदस्यता प्लान क्या है और उनके पास इसे बदलने के कौनसे विकल्प हैं.
जब उपयोगकर्ता अपनी सदस्यता को अपग्रेड, डाउनग्रेड या बदलता है, तब आपको बदलाव का तरीका तय करना होता है. इससे यह तय होता है कि पैसे चुकाकर ली गई मौजूदा बिलिंग अवधि के लिए, सदस्यता की आनुपातिक कीमत कैसे लागू की जाएगी. साथ ही, यह भी तय होता है कि एनटाइटलमेंट में बदलाव कब होगा.
बदले जाने के मोड
यहां दी गई टेबल में, उपलब्ध रिप्लेसमेंट मोड और उनके इस्तेमाल के उदाहरण दिए गए हैं. साथ ही, यह भी बताया गया है कि कितने पेमेंट को 'चुका दिया गया' के तौर पर मार्क किया गया है.
बदलाव का मोड |
ब्यौरा |
इस्तेमाल का उदाहरण |
किस्तों में सदस्यता लेने की सुविधा को बदलने के लिए, किए गए पेमेंट को 'चुका दिया गया' के तौर पर रिकॉर्ड किया गया |
|
सदस्यता वाले आइटम को तुरंत अपग्रेड या डाउनग्रेड कर दिया जाता है. बचा हुआ समय, कीमत के अंतर के हिसाब से अडजस्ट किया जाता है. साथ ही, अगली बिलिंग की तारीख को आगे बढ़ाकर, नई सदस्यता के लिए क्रेडिट कर दिया जाता है. यह डिफ़ॉल्ट व्यवहार है. |
बिना किसी अतिरिक्त शुल्क के, ज़्यादा कीमत वाले टियर पर अपग्रेड करें. |
0 |
|
सदस्यता वाले आइटम को तुरंत अपग्रेड कर दिया जाता है. साथ ही, बिलिंग साइकल में कोई बदलाव नहीं होता. इसके बाद, उपयोगकर्ता से बचे हुए समय के लिए कीमत का अंतर लिया जाता है. ध्यान दें: यह विकल्प सिर्फ़ सदस्यता वाले आइटम को अपग्रेड करने के लिए उपलब्ध है. अपग्रेड करने पर, समय की हर इकाई के लिए कीमत बढ़ जाती है. |
बिलिंग की तारीख बदले बिना, ज़्यादा कीमत वाले टियर पर अपग्रेड करें. |
1 |
|
सदस्यता वाले आइटम को तुरंत अपग्रेड या डाउनग्रेड कर दिया जाता है. साथ ही, उपयोगकर्ता से नए एनटाइटलमेंट के लिए पूरी कीमत तुरंत ले ली जाती है. पिछली सदस्यता की बची हुई वैल्यू को या तो उसी एनटाइटलमेंट के लिए आगे बढ़ाया जाता है या किसी दूसरे एनटाइटलमेंट पर स्विच करने के दौरान, उसे समय के हिसाब से बांटा जाता है. ध्यान दें: अगर नई सदस्यता को मुफ़्त में आज़माने की सुविधा या शुरुआती ऑफ़र मिलता है, तो अपग्रेड या डाउनग्रेड करते समय उपयोगकर्ता से कोई शुल्क नहीं लिया जाता. इसके अलावा, उससे शुरुआती ऑफ़र के लिए तय की गई कीमत ली जाती है. |
बिलिंग की कम अवधि से ज़्यादा अवधि पर अपग्रेड करें. |
1 (ध्यान दें: अगर नई सदस्यता को बिना किसी शुल्क के आज़माने की सुविधा है, तो 0) |
|
सदस्यता को तुरंत अपग्रेड या डाउनग्रेड कर दिया जाता है. साथ ही, सदस्यता रिन्यू होने पर, नया शुल्क लिया जाता है. बिलिंग साइकल में कोई बदलाव नहीं होता. |
बिना किसी शुल्क के सदस्यता इस्तेमाल करने की बची हुई अवधि के दौरान, सदस्यता के किसी ऊंचे टियर पर अपग्रेड करें. |
0 |
|
सदस्यता रिन्यू होने पर ही, सदस्यता वाले आइटम को अपग्रेड या डाउनग्रेड किया जाता है. हालांकि, नई खरीदारी के लिए ये दो आइटम तुरंत जारी किए जाते हैं:
ध्यान दें: किस्तों में पेमेंट करने की सुविधा वाली सदस्यताओं के लिए, प्लान में बदलाव अगले पेमेंट की तारीख से लागू होता है. |
कम कीमत वाले टियर पर डाउनग्रेड करें. |
1 |
|
सदस्यता आइटम को बदलने पर, उसके पेमेंट शेड्यूल में कोई बदलाव नहीं होता. |
जब किसी आइटम में बदलाव नहीं करना हो, तब ऐड-ऑन वाली सदस्यता में सदस्यता आइटम जोड़ना या हटाना. |
लागू नहीं |
अपग्रेड या डाउनग्रेड के ऑफ़र के अलग-अलग अपसेल और विनबैक ऐप्लिकेशन के बारे में ज़्यादा जानने के लिए, ऑफ़र और प्रमोशन से जुड़ी गाइड पढ़ें.
किसी खरीदारी के लिए, रिप्लेसमेंट मोड सेट करना
अपनी प्राथमिकताओं और कारोबार के लॉजिक के आधार पर, अलग-अलग तरह की सदस्यता ट्रांज़िशन के लिए, सदस्यता बदलने के अलग-अलग मोड का इस्तेमाल किया जा सकता है. इस सेक्शन में, सदस्यता में बदलाव होने पर, सदस्यता बदलने का मोड सेट करने का तरीका बताया गया है. साथ ही, इस पर लागू होने वाली सीमाएं भी बताई गई हैं.
दोबारा सदस्यता लेना या एक ही सदस्यता के तहत प्लान बदलना
Google Play Console में, डिफ़ॉल्ट रूप से बदलने का मोड तय किया जा सकता है. इस सेटिंग की मदद से, यह चुना जा सकता है कि अगर मौजूदा सदस्य, उसी सदस्यता के लिए कोई और बुनियादी प्लान या ऑफ़र खरीदते हैं या सदस्यता रद्द करने के बाद फिर से सदस्यता लेते हैं, तो उनसे शुल्क कब लेना है. उपलब्ध विकल्प ये हैं: तुरंत शुल्क लें, जो CHARGE_FULL_PRICE के बराबर है. इसके अलावा, बिलिंग की अगली तारीख पर शुल्क लें, जो WITHOUT_PRORATION के बराबर है. एक ही सदस्यता के बुनियादी प्लान के बीच स्विच करने के लिए, ये ही दो मोड काम के होते हैं.
उदाहरण के लिए, अगर किसी उपयोगकर्ता ने सदस्यता रद्द कर दी है, लेकिन उसकी सदस्यता खत्म नहीं हुई है और आपको उसी प्लान के लिए विनबैक ऑफ़र लागू करना है, तो नई खरीदारी को सामान्य खरीदारी के तौर पर प्रोसेस किया जा सकता है. इसके लिए, आपको SubscriptionUpdateParams में कोई वैल्यू नहीं डालनी होगी. सिस्टम, सदस्यता में कॉन्फ़िगर किए गए डिफ़ॉल्ट रिप्लेसमेंट मोड का इस्तेमाल करता है. साथ ही, पुरानी खरीदारी से नई खरीदारी में प्लान को अपने-आप बदल देता है.
सदस्यताओं के बीच प्लान स्विच करना या डिफ़ॉल्ट रिप्लेसमेंट मोड को बदलना
अगर उपयोगकर्ता सदस्यता वाले प्रॉडक्ट बदल रहा है—कोई दूसरी सदस्यता खरीद रहा है—या अगर आपको किसी भी वजह से, डिफ़ॉल्ट तौर पर सदस्यता बदलने के मोड को बदलना है, तो खरीदारी के फ़्लो के पैरामीटर के तौर पर, रनटाइम पर प्रोरेट की गई दर तय करें.
रनटाइम खरीदारी के फ़्लो कॉन्फ़िगरेशन के हिस्से के तौर पर, SubscriptionProductReplacementParams या SubscriptionUpdateParams में ReplacementMode को सही तरीके से उपलब्ध कराने के लिए, इन पाबंदियों का ध्यान रखें:
- अपग्रेड, डाउनग्रेड या एक ही सदस्यता को प्रीपेड प्लान से प्रीपेड प्लान, अपने-आप रिन्यू होने वाले प्लान या किस्त वाले प्लान पर स्विच करने के दौरान, सिर्फ़
CHARGE_FULL_PRICEमोड का इस्तेमाल किया जा सकता है. अगर आपने कोई दूसरा रिप्लेसमेंट मोड तय किया है, तो खरीदारी नहीं हो पाएगी और उपयोगकर्ता को गड़बड़ी का मैसेज दिखेगा. - एक ही सदस्यता के तहत, प्रीपेड प्लान या अपने-आप रिन्यू होने वाले प्लान से अपने-आप रिन्यू होने वाले प्लान पर स्विच करने के लिए, आनुपातिक शुल्क के मान्य मोड
CHARGE_FULL_PRICEऔरWITHOUT_PRORATIONहैं. अगर आपने कोई दूसरा प्रोरेशन मोड तय किया है, तो खरीदारी नहीं हो पाएगी और उपयोगकर्ता को गड़बड़ी का मैसेज दिखेगा. - एक ही सदस्यता वाले प्रॉडक्ट के लिए, किस्तों में पैसे चुकाने वाले बुनियादी प्लान से बिना किस्तों वाले बुनियादी प्लान पर स्विच करने की अनुमति नहीं है.
SubscriptionProductReplacementParamsमेंKEEP_EXISTINGरिप्लेसमेंट मोड का इस्तेमाल करके, किसी सामान को बदलते समय उसके पेमेंट को पहले जैसा ही रखा जा सकता है. इसके लिए, पुराने प्रॉडक्ट का आईडी और नए प्रॉडक्ट का आईडी एक जैसा होना चाहिए.SubscriptionUpdateParamsमेंKEEP_EXISTINGमोड काम नहीं करता.
बदलाव के उदाहरण और व्यवहार
हर प्रोरेशन मोड के काम करने का तरीका समझने के लिए, यहां दिया गया उदाहरण देखें:
सैमवाइज़ ने Country Gardener ऐप्लिकेशन से ऑनलाइन कॉन्टेंट की सदस्यता ली है. उसने कॉन्टेंट के टियर 1 वर्शन की सदस्यता ली है. इसके लिए, वह हर महीने पैसे चुकाता है. इस वर्शन में सिर्फ़ टेक्स्ट होता है. इस सदस्यता के लिए, उसे हर महीने 2 डॉलर चुकाने पड़ते हैं. यह सदस्यता, महीने की पहली तारीख को रिन्यू होती है.
सैमवाइज़ ने 15 अप्रैल को, टियर 2 की सालाना सदस्यता को अपग्रेड करने का विकल्प चुना. इसमें वीडियो अपडेट शामिल हैं और इसकी कीमत 36 डॉलर प्रति साल है.
सदस्यता अपग्रेड करते समय, डेवलपर को प्रोरेटिंग मोड चुनना होता है. यहां दी गई सूची में बताया गया है कि हर प्रोरेशन मोड, सैमवाइज़ की सदस्यता पर कैसे असर डालता है:
WITH_TIME_PRORATION
सैमवाइज़ की टियर 1 सदस्यता तुरंत खत्म हो जाएगी. ऐसा इसलिए हुआ, क्योंकि उन्होंने पूरे महीने (1 से 30 अप्रैल) के लिए सदस्यता ली थी. हालांकि, उन्होंने सदस्यता की अवधि के बीच में ही अपग्रेड कर लिया था. इसलिए, उन्हें आधे महीने की सदस्यता (1 डॉलर) का शुल्क, नई सदस्यता के लिए देना पड़ा. हालांकि, नई सदस्यता के लिए हर साल 36 डॉलर चुकाने होते हैं. इसलिए, 1 डॉलर के क्रेडिट बैलेंस से सिर्फ़ 10 दिनों (16 से 25 अप्रैल) के लिए सदस्यता ली जा सकती है. इसलिए, 26 अप्रैल को उससे नई सदस्यता के लिए 36 डॉलर लिए जाते हैं. इसके बाद, हर साल 26 अप्रैल को उससे 36 डॉलर लिए जाते हैं.
खरीदारी पूरी होने के तुरंत बाद, आपको अपने ऐप्लिकेशन के PurchasesUpdatedListener को कॉल करना चाहिए. साथ ही, queryPurchasesAsync() कॉल के हिस्से के तौर पर, नई खरीदारी को वापस पाने में सक्षम होना चाहिए. आपके बैकएंड को तुरंत SUBSCRIPTION_PURCHASED डेवलपर से जुड़ी रीयल टाइम सूचना मिलती है.
CHARGE_PRORATED_PRICE
इस मोड का इस्तेमाल किया जा सकता है, क्योंकि समय की हर इकाई के लिए टियर 2 की सदस्यता की कीमत (36 डॉलर/साल = 3 डॉलर/महीना), समय की हर इकाई के लिए टियर 1 की सदस्यता की कीमत (2 डॉलर/महीना) से ज़्यादा है. सैमवाइज़ की टियर 1 सदस्यता तुरंत खत्म हो जाएगी. क्योंकि उन्होंने पूरे महीने के लिए सदस्यता ली थी, लेकिन सिर्फ़ आधे महीने तक इसका इस्तेमाल किया. इसलिए, उन्हें नए प्लान के लिए आधे महीने की सदस्यता (1 डॉलर) का शुल्क देना होगा. हालांकि, नई सदस्यता का शुल्क 36 डॉलर/साल है. इसलिए, बचे हुए 15 दिनों के लिए 1.50 डॉलर का शुल्क लिया जाएगा. इस तरह, नई सदस्यता के लिए उससे 0.50 डॉलर का अंतर लिया जाएगा. सैमवाइज़ से 1 मई को, सदस्यता के नए टियर के लिए 36 डॉलर का शुल्क लिया जाता है. इसके बाद, हर साल 1 मई को 36 डॉलर का शुल्क लिया जाता है.
खरीदारी पूरी होने के तुरंत बाद, आपको अपने ऐप्लिकेशन के PurchasesUpdatedListener को कॉल करना चाहिए. साथ ही, queryPurchasesAsync() कॉल के हिस्से के तौर पर, नई खरीदारी को वापस पाने में सक्षम होना चाहिए. आपके बैकएंड को तुरंत SUBSCRIPTION_PURCHASED डेवलपर से जुड़ी रीयल टाइम सूचना मिलती है.
WITHOUT_PRORATION
सैमवाइज़ की टियर 1 सदस्यता को बिना किसी अतिरिक्त शुल्क के तुरंत टियर 2 में अपग्रेड कर दिया जाता है. इसके बाद, 1 मई को उससे सदस्यता के नए टियर के लिए 36 डॉलर लिए जाते हैं. साथ ही, अगले साल 1 मई को भी उससे 36 डॉलर लिए जाते हैं.
खरीदारी पूरी होने के तुरंत बाद, आपको अपने ऐप्लिकेशन के PurchasesUpdatedListener को कॉल करना चाहिए. साथ ही, queryPurchasesAsync() कॉल के हिस्से के तौर पर, नई खरीदारी को वापस पाने में सक्षम होना चाहिए. आपके बैकएंड को तुरंत SUBSCRIPTION_PURCHASED डेवलपर से जुड़ी रीयल टाइम सूचना मिलती है.
DEFERRED
सैमवाइज़ की टियर 1 सदस्यता 30 अप्रैल को खत्म हो जाएगी. सैमवाइज़ ने 1 मई को टियर 2 की सदस्यता ली. इसके लिए, उससे 36 डॉलर का शुल्क लिया गया.
खरीदारी पूरी होने के तुरंत बाद, आपको अपने ऐप्लिकेशन के PurchasesUpdatedListener को कॉल करना चाहिए. साथ ही, queryPurchasesAsync() कॉल के हिस्से के तौर पर, नई खरीदारी को वापस पाने में सक्षम होना चाहिए. आपके बैकएंड को तुरंत SUBSCRIPTION_PURCHASED डेवलपर से जुड़ी रीयल टाइम सूचना मिलती है. आपको खरीदारी को उसी तरीके से प्रोसेस करना चाहिए जिस तरह से उस समय किसी अन्य नई खरीदारी को प्रोसेस किया जाता है. खास तौर पर, पक्का करें कि आपने नई खरीदारी की पुष्टि की हो. ध्यान दें कि नई सदस्यता का startTime, सदस्यता बदलने के समय दिखता है. ऐसा तब होता है, जब पुरानी सदस्यता खत्म हो जाती है. इस समय, आपको नए सदस्यता प्लान के लिए SUBSCRIPTION_RENEWED RTDN मिलता है. Handle deferred replacement में ReplacementMode.DEFERRED के काम करने के तरीके के बारे में ज़्यादा पढ़ें.
CHARGE_FULL_PRICE
सैमवाइज़ की टियर 1 सदस्यता तुरंत खत्म हो जाएगी. उसकी टियर 2 सदस्यता आज से शुरू हो रही है और उससे 36 डॉलर का शुल्क लिया गया है. क्योंकि उसने पूरे महीने के लिए पेमेंट किया था, लेकिन सिर्फ़ आधे महीने के लिए सदस्यता का इस्तेमाल किया. इसलिए, आधे महीने की सदस्यता (1 डॉलर) को उसकी नई सदस्यता पर लागू किया जाता है. नई सदस्यता की कीमत 36 डॉलर/साल है. इसलिए, उसे सदस्यता की अवधि में एक साल का 1/36वां हिस्सा (~10 दिन) जोड़ दिया जाएगा. इसलिए, सैमवाइज़ को आज से एक साल और 10 दिन बाद 36 डॉलर का शुल्क देना होगा. इसके बाद, उसे हर साल 36 डॉलर चुकाने होंगे.
प्रो-रेटिंग मोड चुनते समय, बदलाव करने के बारे में हमारे सुझाव ज़रूर देखें.
KEEP_EXISTING
सैमवाइज़ ने Country Gardener ऐप्लिकेशन से ऑनलाइन कॉन्टेंट की सदस्यता ली है. उसने बुनियादी कॉन्टेंट के लिए, प्लान 1 की सदस्यता ली है. यह सदस्यता हर महीने रिन्यू होती है. इस सदस्यता के लिए, शुरुआती कीमत के तौर पर तीन महीने तक हर महीने दो डॉलर चुकाने होंगे. इसके बाद, हर महीने चार डॉलर चुकाने होंगे. सैमवाइज़ ने इसे 1 अप्रैल को खरीदा था. Country Gardener ऐप्लिकेशन, प्लान 2 को ऐड-ऑन के तौर पर उपलब्ध कराता है. इसमें खास कॉन्टेंट मिलता है. इसके लिए, हर महीने तीन डॉलर चुकाने होते हैं. सैमवाइज़ ने 15 अप्रैल को Country Gardener ऐप्लिकेशन की अपनी सदस्यता में प्लान 2 जोड़ा. हालांकि, उसने प्लान 1 को चालू रखा. सैमवाइज़ का पेमेंट शेड्यूल यहां दिया गया है:
- प्लान 2 के लिए, 1.50 डॉलर का शुल्क लिया जाएगा. यह शुल्क, 15 अप्रैल को लिया जाएगा.
- अगले दो महीनों के लिए, हर महीने 500 रुपये का शुल्क लिया जाएगा.इसमें प्लान 1 के लिए शुरुआती कीमत और प्लान 2 के लिए सामान्य कीमत, दोनों शामिल हैं.
- इसके बाद, हर महीने 7.00 डॉलर का पेमेंट करना होगा.
ऐप्लिकेशन में सदस्यता में बदलाव ट्रिगर करना
आपका ऐप्लिकेशन, उपयोगकर्ताओं को अपग्रेड या डाउनग्रेड करने का विकल्प दे सकता है. इसके लिए, उसे वही तरीका अपनाना होगा जो खरीदारी का फ़्लो शुरू करने के लिए इस्तेमाल किया जाता है. हालांकि, अपग्रेड या डाउनग्रेड करते समय, आपको मौजूदा सदस्यता, आने वाले समय में (अपग्रेड या डाउनग्रेड की गई) सदस्यता, और इस्तेमाल किए जाने वाले मोड की जानकारी देनी होगी.
बदलाव करने के लिए, SubscriptionProductReplacementParams का इस्तेमाल करें (सुझाया गया)
यहां दिए गए उदाहरण में, SubscriptionProductReplacementParams का इस्तेमाल करके सदस्यता अपडेट करने का तरीका बताया गया है.
BillingFlowParams.ProductDetailsParamsऑब्जेक्ट में अबsetSubscriptionProductReplacementParams()तरीका उपलब्ध है. इससे प्रॉडक्ट लेवल पर, प्रॉडक्ट बदलने की जानकारी दी जा सकती है.SubscriptionProductReplacementParamsमें दो सेटर तरीके होते हैं:setOldProductId:यह वह पुराना प्रॉडक्ट है जिसे मौजूदाProductDetails.में मौजूद प्रॉडक्ट से बदला जाना हैsetReplacementMode:यह आइटम लेवल पर बदलने का मोड है. ये मोड,SubscriptionUpdateParamsकी तरह ही होते हैं. हालांकि, वैल्यू मैपिंग को अपडेट कर दिया गया है.
खरीदारी के लेवल पर अपडेट करने वाले मौजूदा पैरामीटर
BillingFlowParams.setSubscriptionUpdateParams()कोsetOldPurchaseToken()के साथ बनाया जाना चाहिए.setSubscriptionProductReplacementParams()को कॉल करने के बाद,ProductDetailsParamsपरSubscriptionUpdateParams.setSubscriptionReplacementMode()का कोई असर नहीं होगा.
यहां दिए गए कोड के उदाहरण में बताया गया है कि सदस्यता प्लान को (old_product_1, old_product_2) से (product_1, product_2, product_3) में कैसे बदला जाता है. इस उदाहरण में, product_1, old_product_1 की जगह लेता है, product_2, old_product_2 की जगह लेता है, और product_3 को सदस्यता में तुरंत जोड़ दिया जाता है.
Kotlin
val billingClient: BillingClient = ... val replacementModeForBasePlan: Int = ... val replacementModeForAddon: Int = ... val purchaseTokenOfExistingSubscription: String = "your_old_purchase_token" // ProductDetails instances obtained from queryProductDetailsAsync(); val productDetailsParams1 = ProductDetailsParams.newBuilder() .setProductDetails(productDetails1_obj) // Required: Set the ProductDetails object .setSubscriptionProductReplacementParams( SubscriptionProductReplacementParams.newBuilder() .setOldProductId("old_product_id_1") .setReplacementMode(replacementModeForBasePlan) .build() ) .build() val productDetailsParams2 = ProductDetailsParams.newBuilder() .setProductDetails(productDetails2_obj) // Required: Set the ProductDetails object .setSubscriptionProductReplacementParams( SubscriptionProductReplacementParams.newBuilder() .setOldProductId("old_product_id_2") .setReplacementMode(replacementModeForAddon) .build() ) .build() // Example for a third item without replacement params val productDetailsParams3 = ProductDetailsParams.newBuilder() .setProductDetails(productDetails3_obj) // Required: Set the ProductDetails object .build() val newProductDetailsList = listOf( productDetailsParams1, productDetailsParams2, productDetailsParams3 ) val billingFlowParams = BillingFlowParams.newBuilder() .setSubscriptionUpdateParams( SubscriptionUpdateParams.newBuilder() .setOldPurchaseToken(purchaseTokenOfExistingSubscription) .build() ) .setProductDetailsParamsList(newProductDetailsList) .build() // To launch the billing flow: // billingClient.launchBillingFlow(activity, billingFlowParams)
Java
BillingClient billingClient = …; int replacementModeForBasePlan =…; int replacementModeForAddon =…; // ProductDetails obtained from queryProductDetailsAsync(). ProductDetailsParams productDetails1 = ProductDetailsParams.newBuilder() .setSubscriptionProductReplacementParams( SubscriptionProductReplacementParams.newBuilder() .setOldProductId("old_product_id_1") .setReplacementMode(replacementModeForBasePlan)) .build(); ProductDetailsParams productDetails2 = ProductDetailsParams.newBuilder() .setSubscriptionProductReplacementParams( SubscriptionProductReplacementParams.newBuilder() .setOldProductId("old_product_id_2") .setReplacementMode(replacementModeForAddon)) .build(); ProductDetailsParams productDetails3 = ...; ArrayListnewProductDetailsList = new ArrayList<>(); newProductDetailsList.add(productDetails1); newProductDetailsList.add(productDetails2); newProductDetailsList.add(productDetails3); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setSubscriptionUpdateParams( SubscriptionUpdateParams.newBuilder() .setOldPurchaseToken(purchaseTokenOfExistingSubscription) .build()) .setProductDetailsParamsList(productDetailsList) .build(); billingClient.launchBillingFlow(billingFlowParams);
सदस्यता बदलने के लिए, SubscriptionUpdateParams सेट करें (समर्थन नहीं)
यहां दिए गए उदाहरण में, SubscriptionUpdateParams का इस्तेमाल करके सदस्यता अपडेट करने का तरीका बताया गया है.
Kotlin
val offerToken = productDetails .getSubscriptionOfferDetails(selectedOfferIndex) .getOfferToken() val billingParams = BillingFlowParams.newBuilder().setProductDetailsParamsList( listOf( BillingFlowParams.ProductDetailsParams.newBuilder() .setProductDetails(productDetails) .setOfferToken(offerToken) .build() ) ).setSubscriptionUpdateParams( BillingFlowParams.SubscriptionUpdateParams.newBuilder() .setOldPurchaseToken("old_purchase_token") .setSubscriptionReplacementMode( BillingFlowParams.ReplacementMode.CHARGE_FULL_PRICE ) .build() ).build() billingClient.launchBillingFlow( activity, billingParams ) // ...
Java
String offerToken = productDetails .getSubscriptionOfferDetails(selectedOfferIndex) .getOfferToken(); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList( ImmuableList.of( ProductDetailsParams.newBuilder() // fetched via queryProductDetailsAsync .setProductDetails(productDetails) // offerToken can be found in // ProductDetails=>SubscriptionOfferDetails .setOfferToken(offerToken) .build())) .setSubscriptionUpdateParams( SubscriptionUpdateParams.newBuilder() // purchaseToken can be found in Purchase#getPurchaseToken .setOldPurchaseToken("old_purchase_token") .setSubscriptionReplacementMode(ReplacementMode.CHARGE_FULL_PRICE) .build()) .build(); BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams); // ...
बैटरी बदलने के सुझाव
यहां दी गई टेबल में, समय के हिसाब से तय की गई कीमत के अलग-अलग उदाहरण दिए गए हैं. साथ ही, हर उदाहरण के लिए हमारा सुझाव भी दिया गया है:
| स्थिति | बैटरी बदलने के लिए सुझाया गया मोड | नतीजा |
|---|---|---|
| ज़्यादा कीमत वाले टियर पर अपग्रेड करना | CHARGE_PRORATED_PRICE |
उपयोगकर्ता को तुरंत ऐक्सेस मिल जाता है. हालांकि, बिलिंग की अवधि वही रहती है. |
| कम कीमत वाले टियर पर डाउनग्रेड करना | DEFERRED |
उपयोगकर्ता ने पहले ही ज़्यादा कीमत वाले टियर के लिए पेमेंट कर दिया है. इसलिए, उसे बिलिंग की अगली तारीख तक ऐक्सेस मिलता रहेगा. |
| मुफ़्त में आज़माने की सुविधा के दौरान अपग्रेड करना और इसे जारी रखना | WITHOUT_PRORATION |
उपयोगकर्ता, बिना किसी अतिरिक्त शुल्क के, आज़माने की अवधि के बचे हुए समय के लिए, बेहतर टियर पर अपग्रेड करता है. |
| मुफ़्त में आज़माने की अवधि के दौरान अपग्रेड करने पर, मुफ़्त में आज़माने की सुविधा का ऐक्सेस खत्म हो जाता है | CHARGE_PRORATED_PRICE |
उपयोगकर्ता को नए टियर का ऐक्सेस तुरंत मिल जाता है. साथ ही, बिना शुल्क आज़माने की अवधि की बची हुई वैल्यू को भी ट्रांसफ़र कर दिया जाता है. बची हुई वैल्यू का हिसाब, बुनियादी प्लान की कीमत के आधार पर लगाया जाता है. |
| ऐड-ऑन के साथ सदस्यता में, सदस्यता के कुछ आइटम को जोड़ते या हटाते समय, सदस्यता के कुछ आइटम के पेमेंट शेड्यूल में कोई बदलाव न करना. | KEEP_EXISTING |
उपयोगकर्ता, बिना बदलाव वाले आइटम के लिए पुरानी कीमत चुकाता रहता है. नए आइटम तुरंत जोड़ दिए जाते हैं. बदले जाने वाले आइटम का मोड तय करके, अन्य पुराने आइटम बदले जा सकते हैं या उन्हें हटाया जा सकता है. |
सदस्यता बदलने से जुड़ी खरीदारी को मैनेज करना
प्लान में बदलाव करने का मतलब है कि सभी शर्तों और मकसद के लिए, नई खरीदारी की गई है. बिलिंग की प्रोसेस पूरी होने के बाद, इन बदलावों को प्रोसेस किया जाना चाहिए और इस बात की पुष्टि की जानी चाहिए. नई खरीदारी को सही तरीके से प्रोसेस करने के साथ-साथ, आपको उस खरीदारी को हटाना होगा जिसे बदला जा रहा है.
ऐप्लिकेशन में, इसका व्यवहार किसी नई खरीदारी की तरह ही होता है. आपके ऐप्लिकेशन को PurchasesUpdatedListener में नई खरीदारी का नतीजा मिलता है. साथ ही, नई खरीदारी queryPurchasesAsync में उपलब्ध होती है.
जब कोई खरीदारी, मौजूदा खरीदारी की जगह ले लेती है, तब Google Play Developer API, सदस्यता संसाधन में linkedPurchaseToken दिखाता है. पक्का करें कि linkedPurchaseToken में दिया गया टोकन अमान्य कर दिया गया हो, ताकि आपकी सेवाओं को ऐक्सेस करने के लिए पुराने टोकन का इस्तेमाल न किया जा सके. अपग्रेड और डाउनग्रेड की खरीदारी मैनेज करने के बारे में जानकारी पाने के लिए, अपग्रेड, डाउनग्रेड, और फिर से साइन अप करना लेख पढ़ें.
नया परचेज़ टोकन मिलने पर, पुष्टि करने की वही प्रोसेस अपनाएं जो नए परचेज़ टोकन की पुष्टि करने के लिए अपनाई जाती है. Google Play Billing Library से BillingClient.acknowledgePurchase() या Google Play Developer API से Purchases.subscriptions:acknowledge का इस्तेमाल करके, इन खरीदारी की पुष्टि करना न भूलें.
बदले गए डिवाइस को डिलीवर करने में लगने वाले समय को मैनेज करना
बदलाव को कुछ समय के लिए रोकने वाले मोड की मदद से, किसी उपयोगकर्ता को नए प्लान पर स्विच करने से पहले, पुराने प्लान के बचे हुए फ़ायदे इस्तेमाल करने की अनुमति दी जा सकती है.
नई खरीदारी के लिए ReplacementMode.DEFERRED का इस्तेमाल करने पर, queryPurchasesAsync() खरीदारी के बाद एक नया परचेज़ टोकन दिखाता है. यह टोकन, पुराने प्रॉडक्ट से तब तक जुड़ा रहता है, जब तक कि अगले रिन्यूअल की तारीख पर, सदस्यता को तुरंत बदलने की सुविधा लागू नहीं हो जाती. इसके बाद, नया प्रॉडक्ट वापस कर दिया जाता है.
पहले, इस तरह का उपयोगकर्ता अनुभव, बंद किए गए ProrationMode.DEFERRED की मदद से हासिल किया जा सकता था. हालांकि, Play Billing Library 6 के साथ ProrationMode.DEFERRED को बंद कर दिया गया है. नीचे दी गई टेबल से जानें कि व्यवहार में कहां अंतर है:
समय |
ProrationMode.DEFERRED (अब सेवा में नहीं है) |
ReplacementMode.DEFERRED |
खरीदारी का फ़्लो पूरा होने के तुरंत बाद (ऐप्लिकेशन) |
अगले रिन्यूअल की तारीख तक, आपको पुराने प्लान के फ़ायदे मिलते रहेंगे. यह पक्का करने के लिए कि ऐप्लिकेशन सही एनटाइटलमेंट दे रहा है, नया परचेज़ टोकन नहीं दिख रहा है. इसलिए, इसे अभी प्रोसेस नहीं किया जा सकता. |
नया परचेज़ टोकन दिखता है. इसलिए, इस समय इसे प्रोसेस किया जाना चाहिए. साथ ही, यह भी ध्यान में रखा जाना चाहिए कि टोकन को कब बदला जाना है. |
खरीदारी का फ़्लो पूरा होने के तुरंत बाद (बैकएंड) |
खरीदारी के फ़्लो के बाद, SUBSCRIPTION_PURCHASED आरटीडीएन नहीं भेजा जाता है. बैकएंड को अब तक नई खरीदारी के बारे में पता नहीं चला है. |
SUBSCRIPTION_PURCHASED आरटीडीएन, पुराने product_id के साथ भेजा जाता है. यह आरटीडीएन, नए परचेज़ टोकन के लिए खरीदारी की प्रोसेस पूरी होने के तुरंत बाद भेजा जाता है. नए परचेज़ टोकन के साथ purchases.subscriptionsv2.get तरीके को कॉल करने पर, 'startTime' वाला एक परचेज़ दिखता है. इससे दो लाइन आइटम के साथ खरीदारी का समय पता चलता है:
पुराने परचेज़ टोकन के लिए, SUBSCRIPTION_EXPIRED इवेंट भेजा गया. old खरीदारी टोकन के साथ purchases.subscriptionsv2.get तरीके को कॉल करने पर, यह 'समयसीमा खत्म हो गई' के तौर पर दिखता है. ऐसा इसलिए होता है, क्योंकि पुराने प्लान का एनटाइटलमेंट, बचे हुए समय के लिए नई खरीदारी में ट्रांसफ़र कर दिया जाता है. |
बदले जाने पर - खरीदारी के फ़्लो (ऐप्लिकेशन) के बाद पहला रिन्यूअल |
अब नया परचेज़ टोकन दिख रहा है. इसलिए, इसे प्रोसेस किया जाना चाहिए. |
खरीदारी का फ़्लो पूरा होने पर, नई खरीदारी को पहले ही प्रोसेस कर दिया जाना चाहिए. इसलिए, ऐप्लिकेशन को यह पक्का करने के अलावा कोई खास कार्रवाई नहीं करनी चाहिए कि सही एनटाइटलमेंट दिया गया है. |
डिवाइस बदलने पर - खरीदारी के फ़्लो के बाद पहला रिन्यूअल (बैकएंड) |
जब पहला SUBSCRIPTION_RENEWED RTDN भेजा जाता है, तब नई खरीदारी को प्रोसेस किया जा सकता है और इसकी पुष्टि की जा सकती है. सदस्यता संसाधन में मौजूद |
नई खरीदारी को प्रोसेस किया गया और इसकी पुष्टि तब की गई, जब नए परचेज़ टोकन के लिए SUBSCRIPTION_PURCHASED RTDN भेजा गया. इसे 'startTime' के तौर पर रिकॉर्ड किया गया. ReplacementMode.DEFERRED के साथ, पहले रिन्यूअल के लिए वही तरीका अपनाया जाता है जो किसी अन्य रिन्यूअल के लिए अपनाया जाता है. साथ ही, जब यह इवेंट होता है, तब आपको रिप्लेसमेंट के लिए खास लॉजिक को मैनेज करने की ज़रूरत नहीं होती. जब नए परचेज़ टोकन के साथ purchases.subscriptionsv2.get तरीके को कॉल करने पर, दो लाइन आइटम वाली खरीदारी दिखती है:
|
अब से, डेप्रिकेट किए गए ProrationMode.DEFERRED के बजाय ReplacementMode.DEFERRED का इस्तेमाल किया जाना चाहिए. ऐसा इसलिए, क्योंकि यह एनटाइटलमेंट में होने वाले बदलावों के बारे में एक जैसा व्यवहार दिखाता है. हालांकि, यह खरीदारी को मैनेज करने का एक ऐसा तरीका उपलब्ध कराता है जो अन्य नई खरीदारी के व्यवहार के साथ ज़्यादा मेल खाता है.
ग्राहक मैनेजमेंट
डेवलपर से जुड़ी रीयल-टाइम सूचनाओं का इस्तेमाल करके, यह पता लगाया जा सकता है कि किसी उपयोगकर्ता ने सदस्यता रद्द करने का फ़ैसला कब लिया. जब कोई उपयोगकर्ता सदस्यता रद्द करता है, लेकिन उसकी सदस्यता खत्म होने से पहले, उसे पुश नोटिफ़िकेशन या इन-ऐप्लिकेशन मैसेज भेजे जा सकते हैं. इनमें उसे फिर से सदस्यता लेने के लिए कहा जा सकता है.
किसी उपयोगकर्ता के सदस्यता रद्द करने के बाद, उसे वापस लाने की कोशिश की जा सकती है. इसके लिए, आपके पास दो विकल्प हैं: अपने ऐप्लिकेशन में या Play Store पर. यहां दी गई टेबल में, सदस्यता से जुड़ी अलग-अलग स्थितियों के बारे में बताया गया है. साथ ही, इसमें उन स्थितियों में की जाने वाली कार्रवाइयों और ऐप्लिकेशन से जुड़ी ज़रूरी शर्तों के बारे में भी बताया गया है.
| सदस्यता खत्म होने से पहले | सदस्यता खत्म होने के बाद | |||
| इन-ऐप्लिकेशन | Play Store में | इन-ऐप्लिकेशन | Play Store में | |
| विनबैक सुविधा | इन-ऐप्लिकेशन सदस्यता | वापस लाएं | इन-ऐप्लिकेशन सदस्यता | फिर से सदस्यता लें |
| उपयोगकर्ता चेकआउट प्रोसेस पूरी करता है | हां | नहीं | हां | हां |
| उपयोगकर्ता की सदस्यता, उसी एसकेयू से जुड़ी रहती है | उपयोगकर्ता, एक ही या अलग-अलग एसकेयू के लिए साइन अप कर सकता है | हां | उपयोगकर्ता, एक ही या अलग-अलग एसकेयू के लिए साइन अप कर सकता है | हां |
| यह कुकी, खरीदारी के लिए नया टोकन बनाती है | हां | नहीं | हां | हां |
| डिफ़ॉल्ट रूप से चालू होती है | नहीं | हां, सभी डेवलपर के लिए सहायता ज़रूरी है | नहीं |
ऐसे ऐप्लिकेशन जिनमें Billing Library 2.0 या इसके बाद का वर्शन नहीं है: नहीं Billing Library 2.0 या इसके बाद के वर्शन वाले ऐप्लिकेशन: हां. डेवलपर, Console में जाकर ऑप्ट-आउट कर सकते हैं. |
| उपयोगकर्ता से शुल्क कब लिया जाता है |
अगर एक ही एसकेयू का इस्तेमाल किया जा रहा है, तो मौजूदा बिलिंग अवधि खत्म होने पर. अलग-अलग एसकेयू का इस्तेमाल करने पर: यह प्रोरेशन मोड पर निर्भर करता है. |
मौजूदा बिलिंग अवधि खत्म होने पर | तुरंत | तुरंत |
| लागू करना ज़रूरी है | अपने ऐप्लिकेशन में फिर से साइन अप करने के लिए यूज़र इंटरफ़ेस (यूआई) उपलब्ध कराएं |
सदस्यता की स्थिति में हुए बदलाव का पता लगाना Play Store पर डीप-लिंक |
अपने ऐप्लिकेशन में, फिर से साइन अप करने के लिए यूज़र इंटरफ़ेस (यूआई) उपलब्ध कराएं | ऐप्लिकेशन के बाहर जाकर की जाने वाली खरीदारी मैनेज करना |
सदस्यता खत्म होने से पहले - ऐप्लिकेशन में
जिन सदस्यताओं को रद्द कर दिया गया है, लेकिन उनकी समयसीमा अभी खत्म नहीं हुई है उनके लिए, सदस्यों को अपने ऐप्लिकेशन में सदस्यता बहाल करने की अनुमति दी जा सकती है. इसके लिए, आपको इन-ऐप्लिकेशन खरीदारी का वही तरीका अपनाना होगा जो नए सदस्यों के लिए इस्तेमाल किया जाता है. पक्का करें कि आपके यूज़र इंटरफ़ेस (यूआई) में यह दिखे कि उपयोगकर्ता के पास पहले से कोई सदस्यता है. उदाहरण के लिए, आपको फिर से चालू करें बटन के साथ, उपयोगकर्ता की सदस्यता के खत्म होने की मौजूदा तारीख और बार-बार ली जाने वाली कीमत दिखानी हो सकती है.
ज़्यादातर मामलों में, आपको उपयोगकर्ता को वही कीमत और एसकेयू ऑफ़र करना होगा जिसकी सदस्यता उसने पहले से ली हुई है. जैसे:
- उसी एसकेयू का इस्तेमाल करके, सदस्यता खरीदने की नई प्रोसेस शुरू करें.
- नई सदस्यता, पुरानी सदस्यता की जगह ले लेती है. साथ ही, यह सदस्यता खत्म होने की उसी तारीख को रिन्यू होती है. पुरानी सदस्यता को तुरंत 'समयसीमा खत्म हो गई' के तौर पर मार्क कर दिया जाता है.
- उदाहरण के लिए, अकिलिस ने Example Music App की सदस्यता ली है और यह 1 अगस्त को खत्म होने वाली है. इसके बाद, 10 जुलाई को वह एक महीने की सदस्यता को उसी कीमत पर फिर से रिन्यू करता है. नई सदस्यता के लिए, बचे हुए क्रेडिट के हिसाब से शुल्क लिया जाता है. यह तुरंत चालू हो जाती है और इसका रिन्यूअल 1 अगस्त को होता है.
अगर आपको अलग कीमत वाला ऑफ़र देना है, जैसे कि बिना शुल्क आज़माने की नई सुविधा या सदस्यता वापस पाने के लिए छूट, तो उपयोगकर्ता को कोई दूसरा एसकेयू ऑफ़र करें:
- बदलाव मोड
WITHOUT_PRORATIONका इस्तेमाल करके, अलग-अलग एसकेयू के साथ अपग्रेड या डाउनग्रेड करें. - नई सदस्यता, पुरानी सदस्यता की जगह ले लेती है. साथ ही, यह सदस्यता खत्म होने की उसी तारीख को रिन्यू होती है. उपयोगकर्ता से, नई सदस्यता के एसकेयू की कीमत ली जाती है. इसमें शुरुआती कीमत भी शामिल है. यह कीमत, सदस्यता खत्म होने की मूल तारीख पर ली जाती है. अगर पुरानी सदस्यता को किसी ऐसे खाते के आईडी का इस्तेमाल करके बनाया गया था जिसे छिपाया गया है, तो अपग्रेड और डाउनग्रेड के लिए
BillingFlowParamsको वही आईडी पास किया जाना चाहिए. - उदाहरण के लिए, अकिलिस ने Example Music App की सदस्यता ली है और यह 1 अगस्त को खत्म होने वाली है. इसके बाद, 10 जुलाई को वह सालाना सदस्यता को शुरुआती कीमत पर फिर से खरीदता है. नई सदस्यता तुरंत चालू हो जाती है. साथ ही, उपयोगकर्ता से 1 अगस्त को शुरुआती कीमत ली जाती है.
- अगर आपको विनबैक एसकेयू में मुफ़्त में आज़माने की सुविधा या शुरुआती कीमत शामिल करनी है, तो पक्का करें कि उपयोगकर्ता इसके लिए ज़रूरी शर्तें पूरी करता हो. इसके लिए, Google Play Console में हर ऐप्लिकेशन के लिए एक बार मुफ़्त में आज़माने की सुविधा दें बॉक्स से सही का निशान हटाएं. इससे उपयोगकर्ता को हर ऐप्लिकेशन के लिए एक बार मुफ़्त में आज़माने की सुविधा मिलती है.
खरीदारी का टोकन मिलने पर, खरीदारी को उसी तरह प्रोसेस करें जिस तरह नई सदस्यता के लिए किया जाता है. इसके अलावा, Google Play Developer API, सदस्यता संसाधन में linkedPurchaseToken दिखाता है. पक्का करें कि आपने linkedPurchaseToken में दिए गए टोकन को अमान्य कर दिया हो, ताकि पुराने टोकन का इस्तेमाल करके आपकी सेवाओं का ऐक्सेस न पाया जा सके.
सदस्यता खत्म होने से पहले - Play Store में
सदस्यता रद्द होने के बाद भी चालू रहने पर, उपयोगकर्ता Google Play सदस्यता केंद्र में जाकर सदस्यता को बहाल कर सकते हैं. इसके लिए, उन्हें फिर से सदस्यता लें (पहले बहाल करें) पर क्लिक करना होगा. इससे सदस्यता और खरीदारी का टोकन वही रहता है.
सदस्यताएं वापस पाने के बारे में ज़्यादा जानने के लिए, सदस्यताएं वापस पाना लेख पढ़ें.
सदस्यता खत्म होने के बाद - इन-ऐप्लिकेशन
सदस्यता की अवधि खत्म होने के बाद, सदस्यों को फिर से सदस्यता लेने की अनुमति दी जा सकती है. इसके लिए, आपको वही तरीका अपनाना होगा जो नए सदस्यों के लिए इस्तेमाल किया जाता है. यहां दी गई बातों का ध्यान रखें:
- उपयोगकर्ताओं को छूट देने के लिए, आपको सदस्यता के लिए खास कीमत वाला प्रॉडक्ट आईडी ऑफ़र करना पड़ सकता है. इसे विनबैक एसकेयू भी कहा जाता है. आपके पास अपने ऐप्लिकेशन में ऑफ़र देने का विकल्प होता है. इसके अलावा, ऐप्लिकेशन के बाहर भी लोगों को ऑफ़र के बारे में सूचना दी जा सकती है. जैसे, ईमेल में.
- सदस्यता वापस पाने के लिए, Google Play Billing Library का इस्तेमाल करके, अपने Android ऐप्लिकेशन में खरीदारी की प्रोसेस शुरू करें. यह नई सदस्यता लेने की प्रोसेस की तरह ही है. हालांकि, इसमें यह तय किया जा सकता है कि उपयोगकर्ता के लिए कौनसी एसकेयू उपलब्ध है.
- अगर आपको विनबैक एसकेयू में मुफ़्त में आज़माने की सुविधा या शुरुआती कीमत शामिल करनी है, तो पक्का करें कि उपयोगकर्ता इसके लिए ज़रूरी शर्तें पूरी करता हो. इसके लिए, Google Play Console में जाकर, हर ऐप्लिकेशन के लिए एक बार मुफ़्त में आज़माने की सुविधा दें बॉक्स से सही का निशान हटाएं. इससे उपयोगकर्ता को हर ऐप्लिकेशन के लिए, एक बार मुफ़्त में आज़माने की सुविधा मिलती है.
- अगर कोई उपयोगकर्ता उसी एसकेयू की सदस्यता फिर से लेता है, तो वह मुफ़्त में आज़माने की सुविधा या शुरुआती कीमत वाले ऑफ़र का फ़ायदा नहीं ले पाएगा. पक्का करें कि आपके यूज़र इंटरफ़ेस (यूआई) में यह जानकारी दिख रही हो.
खरीदारी का टोकन मिलने पर, खरीदारी को उसी तरह प्रोसेस करें जिस तरह नई सदस्यता के लिए किया जाता है. आपको सदस्यता संसाधन में linkedPurchaseToken नहीं मिलेगा.
सदस्यता खत्म होने के बाद - Play Store में
अगर यह सुविधा चालू है, तो उपयोगकर्ता सदस्यता की समयसीमा खत्म होने के बाद, एक साल तक उसी एसकेयू की सदस्यता फिर से ले सकते हैं. इसके लिए, उन्हें Google Play के सदस्यता केंद्र में जाकर, फिर से सदस्यता लें पर क्लिक करना होगा. इससे सदस्यता और खरीदारी का नया टोकन जनरेट होता है.
फिर से सदस्यता लेना, ऐप्लिकेशन से बाहर की गई खरीदारी माना जाता है. इसलिए, ऐप्लिकेशन से बाहर की गई खरीदारी को हैंडल करने के सबसे सही तरीके ज़रूर अपनाएं.
अपनी सदस्यता को प्रमोट करना
चुनिंदा उपयोगकर्ताओं को मौजूदा सदस्यता के लिए, मुफ़्त में आज़माने की अवधि बढ़ाने का विकल्प देने के लिए, प्रोमो कोड बनाए जा सकते हैं. ज़्यादा जानने के लिए, प्रोमो कोड देखें.
मुफ़्त में आज़माने की सुविधा के लिए, Google Play यह पुष्टि करता है कि उपयोगकर्ता के पास पेमेंट का मान्य तरीका है. यह पुष्टि, मुफ़्त में आज़माने की सुविधा शुरू करने से पहले की जाती है. कुछ लोगों को, पुष्टि की इस प्रक्रिया के दौरान पेमेंट के तरीके पर कुछ समय के लिए रोक लगी हुई या शुल्क लिया गया दिख सकता है. यह शुल्क या होल्ड अस्थायी होता है. बाद में, इसे वापस कर दिया जाता है या इसका रिफ़ंड दे दिया जाता है.
मुफ़्त में आज़माने की अवधि खत्म होने के बाद, उपयोगकर्ता के पेमेंट के तरीके से सदस्यता का पूरा शुल्क ले लिया जाता है.
अगर कोई उपयोगकर्ता मुफ़्त में आज़माने की अवधि के दौरान सदस्यता रद्द करता है, तो भी मुफ़्त में आज़माने की अवधि खत्म होने तक उसकी सदस्यता चालू रहती है. इसके लिए, उपयोगकर्ता से कोई शुल्क नहीं लिया जाता.
रद्द करना या निरस्त करना
किसी सदस्यता को रद्द या वापस लेना के लिए, Google Play Developer API का इस्तेमाल किया जा सकता है. यह सुविधा Google Play Console में भी उपलब्ध है.
रद्द करें: उपयोगकर्ता, Google Play पर सदस्यता रद्द कर सकते हैं. आपके पास अपने ऐप्लिकेशन या वेबसाइट पर, उपयोगकर्ताओं को सदस्यता रद्द करने का विकल्प देने का भी विकल्प होता है. आपका ऐप्लिकेशन, इन रद्द किए गए टिकट को रद्द किए गए टिकट सेक्शन में बताए गए तरीके से मैनेज करे.
निरस्त करना: सदस्यता निरस्त करने पर, उपयोगकर्ता के पास सदस्यता का ऐक्सेस तुरंत खत्म हो जाता है. इसका इस्तेमाल तब किया जा सकता है, जब तकनीकी समस्या की वजह से उपयोगकर्ता आपके प्रॉडक्ट को ऐक्सेस न कर पा रहा हो और उसे प्रॉडक्ट का इस्तेमाल जारी नहीं रखना हो. आपका ऐप्लिकेशन, इन रद्द किए गए लेन-देन को रद्द किए गए लेन-देन में बताए गए तरीके से हैंडल करे.
यहां दी गई टेबल में, रद्द करने और वापस लेने के बीच के अंतर को दिखाया गया है.
| रिन्यूअल बंद कर देता है | ऐक्सेस हटाएं | |
| रद्द करें | हां | नहीं |
| सहमति रद्द करें | हां | हां |
किसी सदस्य के लिए बिलिंग को कुछ समय के लिए रोकना
अपने-आप रिन्यू होने वाली सदस्यता के लिए, Google Play Developer API से Purchases.subscriptions:defer का इस्तेमाल करके, बिलिंग की अगली तारीख को पहले किया जा सकता है. बढ़ाई गई इस अवधि के दौरान, उपयोगकर्ता को आपके कॉन्टेंट की सदस्यता मिलती है और उसके पास कॉन्टेंट का पूरा ऐक्सेस होता है. हालांकि, उससे कोई शुल्क नहीं लिया जाता. सदस्यता रिन्यू करने की तारीख को नई तारीख के तौर पर अपडेट कर दिया जाएगा.
प्रीपेड प्लान के लिए, बिलिंग रोकने वाले एपीआई का इस्तेमाल करके, सदस्यता खत्म होने की तारीख को आगे बढ़ाया जा सकता है.
डिफ़र्ड बिलिंग की सुविधा का इस्तेमाल करके, ये काम किए जा सकते हैं:
- उपयोगकर्ताओं को खास ऑफ़र के तौर पर बिना किसी शुल्क के ऐक्सेस दें. जैसे, कोई फ़िल्म खरीदने पर एक हफ़्ते के लिए बिना किसी शुल्क के ऐक्सेस देना.
- सद्भावना के तौर पर, ग्राहकों को बिना किसी शुल्क के ऐक्सेस दें.
बिलिंग को हर एपीआई कॉल के लिए, कम से कम एक दिन और ज़्यादा से ज़्यादा एक साल तक के लिए टाला जा सकता है. बिलिंग को और आगे बढ़ाने के लिए, बिलिंग की नई तारीख से पहले एपीआई को फिर से कॉल किया जा सकता है.
उदाहरण के लिए, डार्सी ने Fishing Quarterly ऐप्लिकेशन पर ऑनलाइन कॉन्टेंट की सदस्यता ली है. आम तौर पर, उसे हर महीने की पहली तारीख को 1.25 पाउंड का बिल भेजा जाता है. मार्च में, उन्होंने ऐप्लिकेशन पब्लिशर के लिए एक ऑनलाइन सर्वे में हिस्सा लिया था. पब्लिशर ने उसे छह हफ़्तों तक बिना किसी शुल्क के सदस्यता देने का फ़ैसला किया है. इसके लिए, उसने पेमेंट की अगली तारीख को 15 मई तक के लिए टाल दिया है. यह तारीख, बिलिंग की पिछली तारीख (अप्रैल) के छह हफ़्ते बाद की है
- डार्सी से अप्रैल या मई की शुरुआत में कोई शुल्क नहीं लिया जाता. साथ ही, उसके पास अब भी कॉन्टेंट का ऐक्सेस है. उसे 15 मई को, सदस्यता के लिए सामान्य शुल्क 1.25 पाउंड चुकाने होंगे. अब उसके खाते को 15 जून को रिन्यू किया जाएगा.
बिलिंग की तारीख बदलने पर, उपयोगकर्ता को ईमेल या ऐप्लिकेशन में सूचना दी जा सकती है. इससे उन्हें पता चल जाएगा कि बिलिंग की तारीख बदल गई है.
पेमेंट अस्वीकार किए जाने की समस्या हल करना
अगर सदस्यता रिन्यू करने के लिए पेमेंट करने में समस्याएं आती हैं, तो Google सदस्यता रद्द करने से पहले, कुछ समय तक उसे रिन्यू करने की कोशिश करेगा. खाता वापस पाने की इस अवधि में, ग्रेस पीरियड और खाते पर रोक लगाने की अवधि शामिल हो सकती है. इस दौरान, Google उपयोगकर्ता को ईमेल और सूचनाएं भेजता है. इनमें, उसे पेमेंट का तरीका अपडेट करने के लिए कहा जाता है.
पेमेंट अस्वीकार होने पर, सदस्यता के लिए ग्रेस पीरियड शुरू हो जाता है. हालांकि, ऐसा तब होता है, जब ग्रेस पीरियड कॉन्फ़िगर किया गया हो. ग्रेस पीरियड के दौरान, आपको यह पक्का करना होगा कि उपयोगकर्ता के पास सदस्यता के एनटाइटलमेंट का ऐक्सेस बना रहे.
ग्रेस पीरियड खत्म होने के बाद, सदस्यता पर खाते पर रोक की अवधि शुरू हो जाती है. खाते पर रोक की अवधि में, आपको यह पक्का करना होगा कि उपयोगकर्ता के पास सदस्यता के तहत मिलने वाले अधिकारों का ऐक्सेस न हो.
Google Play Console में जाकर, अपने-आप रिन्यू होने वाले हर बुनियादी प्लान के लिए, ग्रेस पीरियड और खाते पर रोक लगने की अवधि सेट की जा सकती है. अवधि को डिफ़ॉल्ट वैल्यू से कम बताने पर, पेमेंट अस्वीकार होने की वजह से सदस्यता न ले पाने के मामलों में कमी आ सकती है.
पेमेंट अस्वीकार होने पर, सदस्यता वापस पाने की संभावना को ज़्यादा से ज़्यादा बढ़ाने के लिए, अपने उपयोगकर्ता को पेमेंट से जुड़ी समस्या के बारे में बताएं और उसे ठीक करने के लिए कहें.
ग्रेस पीरियड और खाता होल्ड करना सेक्शन में बताए गए तरीके से, इस समस्या को खुद ठीक किया जा सकता है. इसके अलावा, ऐप्लिकेशन में मैसेज भेजने वाले एपीआई को लागू किया जा सकता है. इससे Google, आपके ऐप्लिकेशन के उपयोगकर्ताओं को एक मैसेज दिखाएगा.
इन-ऐप्लिकेशन मैसेजिंग
अगर आपने InAppMessageCategoryId.TRANSACTIONAL के साथ ऐप्लिकेशन में मैसेज भेजने की सुविधा चालू की है, तो Google Play, उपयोगकर्ताओं को ग्रेस पीरियड और खाते को होल्ड करने के दौरान, हर दिन एक बार मैसेज दिखाएगा. साथ ही, उन्हें ऐप्लिकेशन छोड़े बिना पेमेंट ठीक करने का विकल्प देगा.
हमारा सुझाव है कि जब भी उपयोगकर्ता ऐप्लिकेशन खोले, तब इस एपीआई को कॉल करें. इससे यह तय किया जा सकेगा कि मैसेज दिखाना है या नहीं.
अगर उपयोगकर्ता ने अपनी सदस्यता को सफलतापूर्वक वापस पा लिया है, तो आपको खरीदारी के टोकन के साथ SUBSCRIPTION_STATUS_UPDATED का जवाब कोड मिलेगा. इसके बाद, आपको इस खरीदारी टोकन का इस्तेमाल करके, Google Play Developer API को कॉल करना चाहिए. साथ ही, अपने ऐप्लिकेशन में सदस्यता की स्थिति को रीफ़्रेश करना चाहिए.
इन-ऐप्लिकेशन मैसेज की सुविधा इंटिग्रेट करना
उपयोगकर्ता को इन-ऐप्लिकेशन मैसेज दिखाने के लिए, BillingClient.showInAppMessages() का इस्तेमाल करें.
यहां ऐप्लिकेशन में मैसेज भेजने की सुविधा को ट्रिगर करने का एक उदाहरण दिया गया है:
Kotlin
val inAppMessageParams = InAppMessageParams.newBuilder() .addInAppMessageCategoryToShow(InAppMessageCategoryId.TRANSACTIONAL) .build() billingClient.showInAppMessages(activity, inAppMessageParams, object : InAppMessageResponseListener() { override fun onInAppMessageResponse(inAppMessageResult: InAppMessageResult) { if (inAppMessageResult.responseCode == InAppMessageResponseCode.NO_ACTION_NEEDED) { // The flow has finished and there is no action needed from developers. } else if (inAppMessageResult.responseCode == InAppMessageResponseCode.SUBSCRIPTION_STATUS_UPDATED) { // The subscription status changed. For example, a subscription // has been recovered from a suspend state. Developers should // expect the purchase token to be returned with this response // code and use the purchase token with the Google Play // Developer API. } } })
Java
InAppMessageParams inAppMessageParams = InAppMessageParams.newBuilder() .addInAppMessageCategoryToShow(InAppMessageCategoryId.TRANSACTIONAL) .build(); billingClient.showInAppMessages(activity, inAppMessageParams, new InAppMessageResponseListener() { @Override public void onInAppMessageResponse(InAppMessageResult inAppMessageResult) { if (inAppMessageResult.responseCode == InAppMessageResponseCode.NO_ACTION_NEEDED) { // The flow has finished and there is no action needed from developers. } else if (inAppMessageResult.responseCode == InAppMessageResponseCode.SUBSCRIPTION_STATUS_UPDATED) { // The subscription status changed. For example, a subscription // has been recovered from a suspend state. Developers should // expect the purchase token to be returned with this response // code and use the purchase token with the Google Play // Developer API. } } });
सदस्यता के ऐसे लेन-देन मैनेज करना जिन्हें मंज़ूरी नहीं मिली है
लंबित लेन-देन, पहली बार खरीदारी, टॉप-अप, अपग्रेड या डाउनग्रेड करने पर हो सकते हैं. सदस्यता खरीदने की प्रोसेस, SUBSCRIPTION_STATE_ACTIVE स्थिति से शुरू होती है. इसके बाद, यह SUBSCRIPTION_STATE_PENDING स्थिति में बदल जाती है. अगर लेन-देन की समयसीमा खत्म हो गई है या उपयोगकर्ता ने इसे रद्द कर दिया है, तो यह SUBSCRIPTION_STATE_PENDING_PURCHASE_EXPIRED पर चला जाता है. लेन-देन पूरा होने के बाद ही, उपयोगकर्ता के एनटाइटलमेंट को अपडेट करना ज़रूरी है.
जिन लेन-देन को मंज़ूरी मिलना बाकी है उनके लिए, सदस्यता की स्थिति में बदलाव करना आसान है. जब उपयोगकर्ता कोई ऐसा लेन-देन शुरू करता है जो पूरा नहीं हुआ है, तब आपके ऐप्लिकेशन को PENDING स्थिति के साथ Purchase मिलता है. लेन-देन पूरा होने पर, आपके ऐप्लिकेशन को Purchase फिर से मिलता है. इसमें स्थिति को PURCHASED के तौर पर अपडेट किया जाता है. SUBSCRIPTION_PURCHASED टाइप वाला SubscriptionNotification मैसेज, आपके आरटीडीएन क्लाइंट को भेजा जाता है. खरीदारी की पुष्टि करने के लिए, सामान्य प्रोसेस का पालन करें. साथ ही, उपयोगकर्ता को कॉन्टेंट का ऐक्सेस दें और खरीदारी की पुष्टि करें. अगर लेन-देन की समयसीमा खत्म हो जाती है या उसे रद्द कर दिया जाता है, तो आपके आरटीडीएन क्लाइंट को टाइप SUBSCRIPTION_PENDING_PURCHASE_CANCELED वाला SubscriptionNotification मैसेज भेजा जाता है. ऐसे मामलों में, उपयोगकर्ता को कभी भी कॉन्टेंट का ऐक्सेस नहीं मिलना चाहिए.
जिन लेन-देन की मंज़ूरी बाकी है उनके साथ टॉप-अप, अपग्रेड या डाउनग्रेड करने पर, पुरानी और नई, दोनों तरह की सदस्यताओं की स्थिति में बदलाव होता है. जब उपयोगकर्ता, टॉप-अप, अपग्रेड या डाउनग्रेड करने के लिए कोई ऐसा लेन-देन शुरू करता है जो अभी पूरा नहीं हुआ है, तो आपके ऐप्लिकेशन को पुरानी सदस्यता के लिए Purchase मिलता है. इसमें PendingPurchaseUpdate ऑब्जेक्ट होता है. इस समय, उपयोगकर्ता के पास पुरानी सदस्यता का मालिकाना हक होता है और उसे नई सदस्यता नहीं मिलती है. PendingPurchaseUpdate ऑब्जेक्ट पर getProducts() और getPurchaseToken() को कॉल करने पर, नई सदस्यता के प्रॉडक्ट आईडी और खरीदारी का टोकन मिलता है. लेन-देन पूरा होने पर, आपके ऐप्लिकेशन को Purchase मिलता है. इसमें नई सदस्यता के लिए सेट किया गया टॉप-लेवल परचेज़ टोकन और PURCHASED के तौर पर सेट की गई स्थिति होती है. आपके आरटीडीएन क्लाइंट को SubscriptionNotification टाइप वाला SUBSCRIPTION_PURCHASED मैसेज भेजा जाता है. सिर्फ़ इस समय, आपको पुराने परचेज़ टोकन को नए परचेज़ टोकन से बदलना चाहिए. साथ ही, उपयोगकर्ता के पास कॉन्टेंट का ऐक्सेस अपडेट करना चाहिए. अगर लेन-देन की समयसीमा खत्म हो जाती है या उसे रद्द कर दिया जाता है, तो आपके आरटीडीएन क्लाइंट को टाइप SUBSCRIPTION_PENDING_PURCHASE_CANCELED वाला SubscriptionNotification मैसेज भेजा जाता है. ऐसे मामलों में, उपयोगकर्ता के पास पुरानी सदस्यता का कॉन्टेंट ऐक्सेस करने का विकल्प होना चाहिए.