সাবস্ক্রিপশন কেনার পরে, অটোমেটিক রিনিউ হওয়া, পেমেন্ট প্রসেস না হওয়া এবং ডেভেলপার ম্যানেজমেন্ট অ্যাকশন সহ বিভিন্ন কারণের উপর নির্ভর করে, সেটির লাইফসাইকেল জুড়ে বিভিন্ন স্ট্যাটাস হতে পারে।
অটোমেটিক রিনিউ হওয়া সাবস্ক্রিপশনের লাইফসাইকেল ম্যানেজ করা
কোনও ব্যবহারকারীর সাবস্ক্রিপশনের স্ট্যাটাস পরিবর্তন হলে, আপনার ব্যাকএন্ড সার্ভার একটি
SubscriptionNotification মেসেজ পায়।
আপনার ব্যাকএন্ডে স্ট্যাটাস আপডেট করতে, বিজ্ঞপ্তিতে অন্তর্ভুক্ত থাকা পার্চেজ টোকেন সহ
purchases.subscriptionsv2.get
API কল করুন। এই এন্ডপয়েন্ট কোনও পার্চেজ টোকেন দেওয়া হলে
লেটেস্ট সাবস্ক্রিপশন স্ট্যাটাস প্রদান করে এবং সাবস্ক্রিপশন ম্যানেজমেন্টের জন্য
সঠিক সোর্স হিসেবে বিবেচিত হয়।
সাবস্ক্রিপশনে সাইন-আপ করার তারিখ থেকে সাবস্ক্রিপশনের মেয়াদ শেষ হওয়ার ৬০ দিন পর্যন্ত কেনাকাটার টোকেন বৈধ থাকে। এই তারিখের পরে, Google Play Developer API কল করার জন্য কেনাকাটার টোকেন আর বৈধ থাকবে না।
নতুন অটোমেটিক রিনিউ হওয়া সাবস্ক্রিপশন কেনা
কোনও ব্যবহারকারী সাবস্ক্রিপশন কিনলে, আপনার RTDN ক্লায়েন্টে SubscriptionNotification মেসেজ পাঠানো হয়, যার
টাইপ SUBSCRIPTION_PURCHASED হয়। আপনি এই বিজ্ঞপ্তি পান বা না পান, আপনার অ্যাপের onResume() পদ্ধতির মাধ্যমে
PurchasesUpdatedListener
অথবা ম্যানুয়ালি কেনাকাটা ফেচ করার মাধ্যমে অ্যাপ-মধ্যস্থ নতুন কেনাকাটা রেজিস্টার করুন, আপনার সুরক্ষিত
ব্যাকএন্ডে আপনাকে নতুন কেনাকাটা প্রসেস করতে হবে। এটি করতে, এইসব ধাপ অনুসরণ করুন:
- লেটেস্ট সাবস্ক্রিপশন স্ট্যাটাস আছে এমন সাবস্ক্রিপশন
রিসোর্স
পেতে
purchases.subscriptionsv2.getএন্ডপয়েন্টে কোয়েরি করুন। -
subscriptionStateফিল্ডের ভ্যালুSUBSCRIPTION_STATE_ACTIVEকিনা তা নিশ্চিত করুন। - কেনাকাটা যাচাই করুন।
- ব্যবহারকারীকে কন্টেন্ট অ্যাক্সেস করার সুবিধা দিন। সাবস্ক্রিপশন রিসোর্স থেকে পাওয়া
ExternalAccountIdentifiersঅবজেক্টের মাধ্যমে কেনাকাটার সাথে যুক্ত ব্যবহারকারীর অ্যাকাউন্ট শনাক্ত করা যেতে পারে, যদি কেনাকাটার সময়setObfuscatedAccountIdওsetObfuscatedProfileIdব্যবহার করে শনাক্তকারী সেট করা হয়ে থাকে।
SubscriptionPurchaseLineItem-এর মধ্যে থাকা offerPhase ফিল্ডে সাবস্ক্রিপশনের বর্তমান ফেজ সম্পর্কে বিবরণ
দেওয়া থাকে, যেমন ফ্রি ট্রায়াল বা প্রারম্ভিক
মূল্য।
এছাড়াও, 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 লাইব্রেরির মাধ্যমে অ্যাক্টিভ হিসেবে দেখানো হয়।
আপনার ব্যাকএন্ডের সাথে সাবস্ক্রিপশনের স্ট্যাটাস সিঙ্ক করলে, পেমেন্ট প্রত্যাখ্যানের ব্যাপারে আপনি আরও সচেতন হতে পারবেন
এবং অনিচ্ছাকৃত
চর্ন কমানোর চেষ্টা করার সময় আরও বেশি প্রাসঙ্গিক তথ্য পাবেন। ব্যবহারকারী
গ্রেস পিরিয়ডে প্রবেশ করলে বিজ্ঞপ্তি পেতে, SUBSCRIPTION_IN_GRACE_PERIOD ধরনের
SubscriptionNotification মেসেজ
শুনুন। ব্যবহারকারী অতিরিক্ত সময়সীমার মধ্যে থাকাকালীন, সাবস্ক্রিপশন
রিসোর্সে
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-এ পেমেন্ট পদ্ধতি সংক্রান্ত সমস্যা সমাধান করার জন্য তাদের প্রম্পট করে। কোনও ব্যবহারকারী গ্রেস পিরিয়ডে প্রবেশ করলে, আপনাকেও সেই ব্যবহারকারীকে তার পেমেন্ট পদ্ধতি ঠিক করার জন্য উৎসাহিত করতে হবে, যদি পেমেন্ট না হওয়ার ঘটনাটি অনিচ্ছাকৃত হয়। এটি করার একটি সহজ উপায় হল ইন-অ্যাপ মেসেজিং API ব্যবহার করা। ব্যবহারকারী আপনার অ্যাপ খোলার সময় আপনি এই API কল করলে, তাকে একটি অস্থায়ী স্ন্যাকবার সহ Play মেসেজ দেখানো হয়, যেখানে ব্যবহারকারীকে জানানো হয় যে তার পেমেন্ট প্রত্যাখ্যান করা হয়েছে। এছাড়াও, এই মেসেজে Google Play-তে ব্যবহারকারীর পেমেন্ট পদ্ধতি সংক্রান্ত সমস্যা সমাধানের জন্য ডিপ লিঙ্ক দেওয়া আছে।
ব্যবহারকারী পেমেন্ট পদ্ধতি সংক্রান্ত সমস্যা সমাধান করার সাথে সাথেই, সাবস্ক্রিপশনটি তার মূল রিনিউয়াল তারিখ অনুযায়ী রিনিউ হয়ে যায় এবং আপনি রিনিউয়াল বিভাগে বর্ণিত পদ্ধতি অনুযায়ী রিনিউয়াল প্রসেস ম্যানেজ করতে পারবেন।
অতিরিক্ত সময়কালের মধ্যে ব্যবহারকারী পেমেন্ট পদ্ধতি সংক্রান্ত সমস্যা সমাধান না করলে, সাবস্ক্রিপশন অ্যাকাউন্ট হোল্ডে চলে যায় এবং তিনি এনটাইটেলমেন্ট হারান।
অতিরিক্ত সময়কালের অ্যাক্সেস ও রিকভারি
ছবি ২-এ একটি সাবস্ক্রিপশনের টাইমলাইন দেখানো হয়েছে যেটি গ্রেস পিরিয়ডে প্রবেশ করে এবং ব্যবহারকারী পেমেন্ট পদ্ধতি সংক্রান্ত সমস্যা সমাধান করলে রিস্টোর হয়ে যায়। অতিরিক্ত সময়সীমা শেষ হয়ে গেলে, ব্যবহারকারী সাবস্ক্রিপশনের সুবিধা আর পাবেন না এবং অ্যাকাউন্ট হোল্ডে চলে যাবে।
নিম্নলিখিত বিষয়গুলি মনে রাখা গুরুত্বপূর্ণ:
- অতিরিক্ত সময়সীমা চলাকালীন, ব্যবহারকারীর সাবস্ক্রিপশনের সুবিধা অ্যাক্সেস করার সুবিধা বজায় রাখা উচিত।
- গ্রেস পিরিয়ড চলাকালীন সাবস্ক্রিপশন রিস্টোর করা হলে, রিনিউয়ালের তারিখ রিসেট হয় না।
- আপনি গ্রেস পিরিয়ড পরিবর্তন করলে, বর্তমানে গ্রেস পিরিয়ডে থাকা ব্যবহারকারীরা প্রভাবিত হবেন না। পরিবর্তনের পরে অতিরিক্ত সময়সীমা শুরু হওয়া সাবস্ক্রিপশন রিনিউয়ালে নতুন অতিরিক্ত সময়সীমা দেখা যাবে। যেমন, আপনি যদি অতিরিক্ত সময়সীমা ৭ দিন থেকে ১৪ দিনে পরিবর্তন করেন, তাহলে পরিবর্তনের পরে অতিরিক্ত সময়সীমা শুরু হওয়া ব্যবহারকারীরা নতুন ১৪ দিনের অতিরিক্ত সময়সীমা পাবেন।
- সাবস্ক্রিপশন অ্যাক্টিভ থাকে এবং সাইলেন্ট গ্রেস পিরিয়ড শেষ না হওয়া পর্যন্ত আপনি গ্রেস পিরিয়ড RTDN পাবেন না
সাইলেন্ট অতিরিক্ত সময়কাল
আপনি ০ দিনের গ্রেস পিরিয়ড সেট করতে পারেন, কিন্তু পেমেন্ট আবার চেষ্টা করার জন্য পর্যাপ্ত সময় নিশ্চিত করতে Play কমপক্ষে ১ দিন অপেক্ষা করবে।
এই নীরব অতিরিক্ত সময়কাল পেমেন্ট প্রসেসিংয়ের জন্য একটি
নিরাপত্তা জাল অফার করে। এই ২৪‑ঘণ্টা সময়সীমার মধ্যে,
সাবস্ক্রিপশনটি
ACTIVE অবস্থায় থাকে।
সাবস্ক্রিপশন স্ট্যাটাসে হওয়া পরিবর্তন সম্পর্কে সিঙ্ক করে থাকার সবচেয়ে ভালো উপায় হল
রিয়েল-টাইম ডেভেলপার বিজ্ঞপ্তি (RTDN) শোনা ও সেটির ভিত্তিতে অ্যাকশন নেওয়া। সাবস্ক্রিপশনের আরও সঠিক
স্ট্যাটাস পেতে, মেয়াদ শেষ হওয়ার সময়ের পরিবর্তে RTDN সময়ে
purchases.subscriptionsv2.get()
মেথড কল করুন।
২৪ ঘণ্টার সাইলেন্ট গ্রেস পিরিয়ড শেষ হওয়ার পরে সাবস্ক্রিপশনের স্ট্যাটাসের উপর নির্ভর করে, আপনি নিম্নলিখিত বিজ্ঞপ্তিগুলির মধ্যে একটি পাবেন:
SUBSCRIPTION_ON_HOLD(চালু করা থাকলে)SUBSCRIPTION_CANCELED(বাতিল করা হলে)SUBSCRIPTION_EXPIRED(মেয়াদ শেষ হয়ে গেলে)SUBSCRIPTION_RENEWED(সফলভাবে রিনিউ করা হলে)
এছাড়াও, সাবস্ক্রিপশনের লেটেস্ট স্ট্যাটাস পেতে, ২৪‑ঘণ্টার নীরব অতিরিক্ত সময়সীমা শেষ হওয়ার পরে যেকোনও সময় subscriptionV2.get() মেথড কল করতে পারেন।
অ্যাকাউন্ট হোল্ডে রাখা আছে
সাবস্ক্রিপশন রিনিউ করার সময় পেমেন্ট সংক্রান্ত সমস্যা হলে, অতিরিক্ত সময়সীমা শেষ হওয়ার পরে অ্যাকাউন্ট হোল্ডে রাখার সময়সীমা শুরু হয়। সাবস্ক্রিপশন অ্যাকাউন্ট হোল্ডে গেলে, আপনাকে সাবস্ক্রিপশন এনটাইটেলমেন্টে অ্যাক্সেস ব্লক করতে হবে।
অ্যাকাউন্ট হোল্ডে থাকাকালীন, প্রয়োজন অনুযায়ী আপনাকে বাতিল করা, রিস্টোর করা বা সাবস্ক্রিপশন আবার কেনা সংক্রান্ত কাজ চালিয়ে যেতে হবে, কারণ সাবস্ক্রিপশন হোল্ডে থাকাকালীন ব্যবহারকারী এইসব পরিবর্তন করতে পারেন।
ব্যবহারকারী অ্যাকাউন্ট হোল্ড পিরিয়ডে প্রবেশ করলে RTDN আপনাকে বিজ্ঞপ্তি পাঠায়, যাতে আপনি সাবস্ক্রিপশনে তার অ্যাক্সেস কেন সাসপেন্ড করা হয়েছে তা যত তাড়াতাড়ি সম্ভব তাকে জানাতে পারেন। এটি করার একটি সহজ উপায় হল ইন-অ্যাপ মেসেজিং API ব্যবহার করা। আপনার ব্যবহারকারী অ্যাপ খুললে এই API কল করলে, ব্যবহারকারীকে একটি অস্থায়ী স্নাকবার মেসেজ দেখানো হবে যেখানে তাকে জানানো হবে যে তার পেমেন্ট প্রত্যাখ্যান করা হয়েছে। এছাড়াও, এই মেসেজে Google Play-তে ব্যবহারকারীর পেমেন্ট পদ্ধতি সংক্রান্ত সমস্যার সমাধান করার জন্য একটি ডিপ লিঙ্ক থাকে।
আপনার ব্যবহারকারীরা যদি আপনার অ্যাপের বাইরে সাবস্ক্রিপশন কন্টেন্ট অ্যাক্সেস করতে পারেন, তাহলে তারা বিভিন্ন সারফেসে অ্যাক্সেস হারিয়েছেন বলে বুঝতে পারেন। আপনি হয়ত ব্যবহারকারীকে পুশ বিজ্ঞপ্তি বা ইমেল পাঠিয়ে জানাতে পারেন যে পেমেন্ট প্রসেস করা না যাওয়ার কারণে তার সাবস্ক্রিপশন আর অ্যাক্টিভ নেই।
অ্যাকাউন্ট হোল্ডে থাকাকালীন
queryPurchasesAsync()
পদ্ধতির মাধ্যমে সাবস্ক্রিপশন ফিরিয়ে দেওয়া হয় না, তাই আপনার অ্যাপ যদি আগে করা
কেনাকাটা দেখানোর জন্য এই পদ্ধতির উপর নির্ভর করে, তাহলে আপনাকে ডিফল্ট হিসেবে অ্যাকাউন্ট হোল্ড করার সুবিধা দিতে হবে।
রিয়েল-টাইম ডেভেলপার
বিজ্ঞপ্তির মাধ্যমে, সাবস্ক্রিপশন অ্যাকাউন্ট হোল্ডে গেলে আপনি SUBSCRIPTION_ON_HOLD ধরন সহ একটি
SubscriptionNotification মেসেজ
পাবেন। নতুন সাবস্ক্রিপশন
সম্পর্কিত তথ্য পেতে আপনার সুরক্ষিত ব্যাকএন্ড সার্ভার থেকে
purchases.subscriptionsv2.get
মেথডকে কল করুন। অ্যাকাউন্ট হোল্ডে থাকাকালীন, সাবস্ক্রিপশন
রিসোর্সের
expiryTime ফিল্ডটি একটি পুরনো টাইমস্ট্যাম্পে সেট করা থাকে এবং subscriptionState ফিল্ডটি
SUBSCRIPTION_STATE_ON_HOLD-এ সেট করা থাকে:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ON_HOLD",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": timestamp_in_past,
...
}
],
}
অ্যাক্সেস ফিরিয়ে আনতে, ব্যবহারকারীকে পেমেন্ট পদ্ধতি সংক্রান্ত সমস্যা সমাধান করতে হবে। পেমেন্ট বাতিল হওয়ার কারণে অ্যাকাউন্টে হোল্ড প্রয়োগ করা হলে Play ব্যবহারকারীদের তা জানায় এবং আপনাকেও তাদের পেমেন্ট পদ্ধতি ঠিক করার জন্য উৎসাহিত করতে হবে।
ব্যবহারকারী পেমেন্ট পদ্ধতি সংক্রান্ত সমস্যা সমাধান করার পরে, সাবস্ক্রিপশন অ্যাক্টিভ
স্ট্যাটাসে ফিরে আসে এবং আপনাকে অবশ্যই সাবস্ক্রাইব করা কন্টেন্টে অ্যাক্সেস ফিরিয়ে দিতে হবে। এই ক্ষেত্রে,
অ্যাকাউন্ট হোল্ড শুরু হওয়ার আগে যে পারচেজ টোকেন ছিল, সেটিই আছে কারণ
একই কেনাকাটা রিস্টোর করা হচ্ছে এবং আপনি RTDN-এর সাথে type
SUBSCRIPTION_RECOVERED পাচ্ছেন।
ইনস্টলমেন্ট সাবস্ক্রিপশনের ক্ষেত্রে, পেমেন্ট বাতিল হওয়া ও রিকভার করার ঘটনা যেকোনও স্বতন্ত্র পেমেন্ট প্রচেষ্টার জন্য ঘটতে পারে।
ডেটা ফিরিয়ে আনার পরে, Play Billing Library queryPurchasesAsync() পদ্ধতির মাধ্যমে
সাবস্ক্রিপশন আবার ফিরিয়ে দেয়। কোনও ব্যবহারকারী সাবস্ক্রিপশনের উপযুক্ত কিনা তা নির্ধারণ করতে আপনি এই পদ্ধতি ব্যবহার করলে, অ্যাকাউন্ট হোল্ড থেকে সাবস্ক্রিপশন ফিরিয়ে আনার বিষয়টি আপনার অ্যাপকে অটোমেটিক
হ্যান্ডেল করতে হবে।
সাবস্ক্রিপশন
রিস্টোর করা হলে এবং ব্যবহারকারী আবার অ্যাক্সেস ফিরে পেলে
SubscriptionNotification মেসেজ
SUBSCRIPTION_RECOVERED টাইপের মাধ্যমে বিজ্ঞপ্তি পেতে শুনুন। এই বিজ্ঞপ্তি পাওয়ার পরে আপনি সাবস্ক্রিপশন সম্পর্কে কোয়েরি করলে, expiryTime ফিল্ডটি ভবিষ্যতের
টাইমস্ট্যাম্পে সেট করা হয় এবং subscriptionState ফিল্ডটি আবার
SUBSCRIPTION_STATE_ACTIVE-এ সেট করা হয়:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": next_renewal_date,
...
}
],
}
অ্যাকাউন্ট হোল্ডে রাখার
মেয়াদ শেষ হওয়ার আগে ব্যবহারকারী পেমেন্ট পদ্ধতি সংক্রান্ত সমস্যা সমাধান না করলে, আপনি SUBSCRIPTION_CANCELED ধরনের RTDN পাবেন। বাতিলকরণ ম্যানেজ করা সংক্রান্ত
নির্দেশাবলীর জন্য, বাতিলকরণ দেখুন। আপনি এই পদ্ধতিতে বাতিল করা
সাবস্ক্রিপশনের জন্য কোয়েরি করলে, রিটার্ন করা
expiryTime ফিল্ডটি অতীতের টাইমস্ট্যাম্পে সেট করা থাকে:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": timestamp_in_past,
...
}
],
}
অ্যাকাউন্ট হোল্ডে থাকাকালীন বাতিল করার ব্যাপারে আপনাকে বিজ্ঞপ্তি পাঠানোর সাথে সাথেই, আপনি
SUBSCRIPTION_EXPIRED টাইপের RTDN পাবেন কারণ ব্যবহারকারী
পেড এনটাইটেলমেন্টের বাইরে চলে গেছেন এবং বাতিল করার ফলে সাবস্ক্রিপশন বন্ধ হয়ে গেছে।
আপনি সাধারণত যেভাবে এই মেয়াদ শেষ হওয়া সংক্রান্ত বিষয় সামলান, সেইভাবেই সামলাতে পারবেন।
ব্যবহারকারী একই সাবস্ক্রিপশন প্ল্যান বা আপনার অ্যাপে অ্যাকাউন্ট হোল্ডে থাকাকালীন অফার করা অন্য কোনও প্ল্যান
তার আসল কেনাকাটা থেকে আবার কিনে অ্যাক্সেস ফিরে পেতে পারেন। সেই ক্ষেত্রে, একটি নতুন পারচেজ টোকেন ইস্যু করা হয় এবং
নতুন ভ্যালু একটি SUBSCRIPTION_PURCHASED ইভেন্টের অংশ হিসেবে রিটার্ন করা হয় যা
এই নতুন ইনস্ট্যান্সকে রিপ্রেজেন্ট করে।
অ্যাকাউন্ট হোল্ড অ্যাক্সেস ও ফিরিয়ে আনা
ছবি ৩-এ একটি সাবস্ক্রিপশনের টাইমলাইন দেখানো হয়েছে যেটি অ্যাকাউন্ট হোল্ডে চলে যায় এবং ব্যবহারকারী পেমেন্ট পদ্ধতি সংক্রান্ত সমস্যা সমাধান করলে সেটি আবার চালু হয়ে যায়।
আগের উদাহরণের মতো, ছবি ৪-এ একটি সাবস্ক্রিপশনের টাইমলাইন দেখানো হয়েছে যেটি অ্যাকাউন্ট হোল্ডে যাওয়ার আগে প্রথমে গ্রেস পিরিয়ডে যায় এবং তারপর হোল্ডে থাকাকালীন রিস্টোর করা হয়।
নিম্নলিখিত বিষয়গুলি মনে রাখা গুরুত্বপূর্ণ:
- সাবস্ক্রিপশন অ্যাকাউন্ট হোল্ডে যাওয়ার আগে, Google Play পেমেন্ট পদ্ধতি থেকে চার্জ কাটার জন্য অতিরিক্ত প্রচেষ্টা করে। এটি ৪৮ ঘণ্টা পর্যন্ত চলতে পারে। এই সময়সীমার মধ্যে ব্যবহারকারী সাবস্ক্রিপশনের সুবিধাগুলি পাবেন। এই রিট্রাই করার সময়সীমা শেষ হয়ে গেলে, সাবস্ক্রিপশন অ্যাকাউন্ট হোল্ডে চলে যায় এবং ব্যবহারকারী সাবস্ক্রিপশনের সুবিধা অ্যাক্সেস করতে পারেন না।
- সাবস্ক্রিপশন পজ করা অবস্থা থেকে আবার চালু করা হলে এবং পেমেন্ট পদ্ধতি কাজ না করলে, সাবস্ক্রিপশন সরাসরি অ্যাকাউন্ট হোল্ডে চলে যায়।
- অ্যাকাউন্ট হোল্ড থেকে সাবস্ক্রিপশন রিস্টোর করা হলে, রিনিউ করার তারিখ রিসেট হয়ে যায়।
মেয়াদ শেষ হওয়া
সাবস্ক্রিপশনের মেয়াদ শেষ হয়ে গেলে, ব্যবহারকারীর সাবস্ক্রিপশনে অ্যাক্সেস আর থাকা উচিত নয়। A
SubscriptionNotification মেসেজ, যার ধরন SUBSCRIPTION_EXPIRED, সেটি
সেই ক্ষেত্রে পাঠানো হয়। আপনি এই বিজ্ঞপ্তি পেলে, লেটেস্ট সাবস্ক্রিপশন
রিসোর্স পেতে 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
ব্যবহার করে সাবস্ক্রিপশন প্রত্যাহার করা
বা কেনাকাটার জন্য চার্জ ব্যাক করা অন্তর্ভুক্ত। এই পরিস্থিতিতে, ব্যবহারকারীর
এনটাইটেলমেন্ট অবিলম্বে প্রত্যাহার করুন। এটি ঘটলে, type
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 API ব্যবহার করতে পারবেন। অ্যাড-অন সহ সাবস্ক্রিপশন পোস্টপোন করলে, সাবস্ক্রিপশনের সব আইটেম একই সময়সীমার জন্য পোস্টপোন করা হয়।
আপনি সাবস্ক্রিপশন ডেফার করলে, SUBSCRIPTION_DEFERRED টাইপের একটি SubscriptionNotification
মেসেজ পাঠানো হয়। ডেফার করার সময়সীমার মধ্যে,
ব্যবহারকারী আপনার কন্টেন্ট সাবস্ক্রাইব করে সম্পূর্ণ অ্যাক্সেস পান, কিন্তু তাকে চার্জ করা হয় না। নতুন তারিখটি দেখানোর জন্য
সাবস্ক্রিপশন রিনিউ করার তারিখ আপডেট করা হয়।
প্রিপেড প্ল্যানের ক্ষেত্রে, মেয়াদ শেষ হওয়ার সময় পিছিয়ে দেওয়ার জন্য আপনি ডিফার বিলিং API ব্যবহার করতে পারবেন।
ডেফার করা সাবস্ক্রিপশনের সাবস্ক্রিপশন রিসোর্সটি নিচে দেওয়া উদাহরণটির মতো দেখতে হয়:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": timestamp_in_future,
...
}
],
}
পজ করা সাবস্ক্রিপশন
ব্যবহারকারীদের সাবস্ক্রিপশন পজ করার সুবিধা দিয়ে আপনি স্বেচ্ছায় সাবস্ক্রিপশন বন্ধ করা কমাতে পারেন। আপনি পজ করার ফিচার চালু করলে, ব্যবহারকারীরা তাদের সাবস্ক্রিপশন এক সপ্তাহ থেকে তিন মাস পর্যন্ত সময়ের জন্য পজ করতে পারবেন। এটি রেকারিং মেয়াদের উপর নির্ভর করে। এর ফলে সাবস্ক্রিপশন সাময়িকভাবে সাসপেন্ড করা হয়।
| সাবস্ক্রিপশন রেকারিং | সাপ্তাহিক | মাসিক | তিন মাসের | ছয়-মাস | বার্ষিক |
|---|---|---|---|---|---|
| পজ করার জন্য উপলভ্য সময়সীমা* | ১ সপ্তাহ ২ সপ্তাহ ৩ সপ্তাহ ৪ সপ্তাহ |
১ মাস ২ মাস ৩ মাস |
১ মাস ২ মাস ৩ মাস |
১ মাস ২ মাস ৩ মাস |
১ মাস ২ মাস ৩ মাস |
বর্তমান বিলিংয়ের মেয়াদ শেষ হওয়ার পরেই সাবস্ক্রিপশন পজ করার সুবিধা কার্যকর হয়। সাবস্ক্রিপশন পজ করা থাকলে, ব্যবহারকারী সাবস্ক্রিপশন অ্যাক্সেস করতে পারেন না এবং তাকে রিনিউয়াল ফি দিতে হয় না। পজ করার মেয়াদ শেষ হয়ে গেলে, সাবস্ক্রিপশন আবার চালু হয়ে যায় এবং Google সাবস্ক্রিপশন রিনিউ করার চেষ্টা করে। আবার চালু করা হয়ে গেলে, সাবস্ক্রিপশন আবার অ্যাক্টিভ হয়ে যায়। পেমেন্ট সংক্রান্ত সমস্যার কারণে আবার চালু করা না গেলে, ব্যবহারকারী অ্যাকাউন্ট হোল্ডে থাকার অবস্থায় প্রবেশ করেন, যা ছবি ৫ ও ৬-এ দেখানো হয়েছে:
এছাড়াও, কোনও ব্যবহারকারী ফিগার ৬-এ দেখানো মতো পজ করার সময়সীমার মধ্যে যেকোনও সময় ম্যানুয়ালি সাবস্ক্রিপশন আবার চালু করার বিকল্প বেছে নিতে পারেন। কোনও ব্যবহারকারী ম্যানুয়ালি আবার চালু করলে, বিলিং তারিখ পরিবর্তন করে ম্যানুয়ালি আবার চালু করার তারিখ করা হয়।
কোনও ব্যবহারকারীর সাবস্ক্রিপশন পজ করা হলে, Play Billing Library queryPurchasesAsync() পদ্ধতির মাধ্যমে সাবস্ক্রিপশন
রিটার্ন করে না, যতক্ষণ না
QueryPurchasesParams-এ includeSuspendedSubscriptions প্যারামিটার true হিসেবে সেট করা হয়। সাবস্ক্রিপশন আবার চালু করা হলে, queryPurchasesAsync() পদ্ধতি সেটি আবার ফিরিয়ে আনে।
ব্যবহারকারী কখন সাবস্ক্রিপশন পজ করছেন তা জানতে RTDN-এর জন্য অপেক্ষা করুন। এছাড়াও, এই বিজ্ঞপ্তিগুলি আপনাকে অ্যাপে ব্যবহারকারীদের জানাতে দেয় যে তারা সাবস্ক্রিপশন পজ করেছেন এবং এটির অ্যাক্সেস আর নেই। এছাড়াও, আপনাকে এমন একটি পদ্ধতি প্রদান করতে হবে যার মাধ্যমে ব্যবহারকারী যেকোনও সময় Google Play-তে একটি ডিপ লিঙ্ক ব্যবহার করে ম্যানুয়ালি তার সাবস্ক্রিপশন আবার চালু করতে পারবেন।
আপনার ব্যবহারকারী তার সাবস্ক্রিপশন পজ করার
প্রক্রিয়া শুরু করলে, SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED ধরনের একটি SubscriptionNotification মেসেজ
পাঠানো হয়। এই সময়, ব্যবহারকারীর কাছে পরবর্তী রিনিউয়ালের তারিখ পর্যন্ত
তার সাবস্ক্রিপশনের অ্যাক্সেস থাকা উচিত এবং সাবস্ক্রিপশন
রিসোর্স
autoRenewEnabled = true কন্টেন্ট থাকে। এই মুহূর্তে subscriptionState ফিল্ডের ভ্যালু
SUBSCRIPTION_STATE_ACTIVE.
পজ কার্যকর হলে, SUBSCRIPTION_PAUSED টাইপের একটি SubscriptionNotification মেসেজ পাঠানো হয়।
এটি ঘটলে, ব্যবহারকারীর সাবস্ক্রিপশনে অ্যাক্সেস
বন্ধ হয়ে যাবে এবং সাবস্ক্রিপশন রিসোর্সে autoRenewEnabled = true থাকবে,
এবং subscriptionState ফিল্ড SUBSCRIPTION_STATE_PAUSED হিসেবে সেট করা থাকবে। সাবস্ক্রিপশন আবার কবে রিনিউ হওয়ার কথা তা আপনি
PausedStateContext
অবজেক্ট চেক করে
দেখতে পারবেন।
সাবস্ক্রিপশন পজ করার মেয়াদ শেষ হয়ে গেলে সেটি অটোমেটিক চালু হয়ে গেলে
অথবা ব্যবহারকারী নিজে সেটি ম্যানুয়ালি চালু করলে, SubscriptionNotification SUBSCRIPTION_RECOVERED ধরনের মেসেজ পাঠানো হয়।
পজ করার পরে সাবস্ক্রিপশন আবার চালু করার চেষ্টা করার সময় পেমেন্ট না হলে, SUBSCRIPTION_ON_HOLD টাইপের SubscriptionNotification মেসেজ পাঠানো হয়।
অ্যাকাউন্ট হোল্ডে রাখা নিবন্ধে যেভাবে বর্ণনা করা হয়েছে, সেইভাবে দুটি পরিস্থিতিই সামলাতে হবে।
আবার সাবস্ক্রাইব করুন
অটোমেটিক রিনিউ হওয়া বেস প্ল্যানের জন্য, Google Play Store একটি আবার সাবস্ক্রাইব করুন বোতাম দেখাতে পারে। এই বোতামটি ব্যবহারকারীদের সাবস্ক্রিপশনে আবার অ্যাক্সেস পেতে সাহায্য করে। এটি বিভিন্ন কারণে দেখা নাও যেতে পারে, যেমন সাবস্ক্রিপশনের মেয়াদ অনেক আগেই শেষ হয়ে গেলে।
বোতামটি সবসময় আবার সাবস্ক্রাইব করুন হিসেবে লেবেল করা থাকলেও, এর কার্যকারিতা সাবস্ক্রিপশনের স্ট্যাটাসের উপর নির্ভর করে।
সাবস্ক্রিপশন বাতিল করা হলেও মেয়াদ শেষ না হওয়া পর্যন্ত ব্যবহারকারী সাবস্ক্রাইব করে থাকেন এবং সাবস্ক্রিপশনের সুবিধা পেতে থাকেন। ব্যবহারকারী আবার সাবস্ক্রাইব করুন বিকল্পে ট্যাপ করলে, বাতিল করার প্রক্রিয়াটি কার্যকরভাবে বাতিল হয়ে যায় এবং সাবস্ক্রিপশন রিনিউ হতে থাকে। Play ডেভেলপার ডকুমেন্টেশন ও API-তে এই অ্যাকশনকে রিস্টোর বলা হয়।
অটোমেটিক রিনিউ হওয়া সাবস্ক্রিপশনের মেয়াদ শেষ হয়ে গেলে, আপনি ব্যবহারকারীদের একই সাবস্ক্রিপশন বেস প্ল্যান কেনার অনুমতি দিতে পারেন। এই অ্যাকশনটি Play ডেভেলপার ডকুমেন্টেশন ও API-তে আবার সাবস্ক্রাইব করা হিসেবে পরিচিত। আপনি Play Console-এ প্রতিটি বেস প্ল্যানের জন্য এই বিকল্প কনফিগার করতে পারবেন অথবা API ব্যবহার করতে পারবেন।
মেয়াদ শেষ হওয়ার আগে রিস্টোর করা
আপনার অ্যাপ যদি কোনও ব্যবহারকারী সাবস্ক্রিপশন পাওয়ার উপযুক্ত কিনা তা নির্ধারণ করার জন্য শুধুমাত্র
queryPurchasesAsync()
পদ্ধতির উপর নির্ভর করে, তাহলে আপনার অ্যাপকে
অটোমেটিক রিস্টোরেশন ম্যানেজ করতে হবে কারণ queryPurchasesAsync()
পদ্ধতি বাতিল করা কেনাকাটার মেয়াদ শেষ হওয়ার আগে সেগুলি রিটার্ন করা চালিয়ে যায়। রিস্টোর করা সাবস্ক্রিপশন
বাতিল করা হয়নি ধরে নিয়ে রিনিউ হতে থাকে।
আপনার অ্যাপ যদি ব্যাকএন্ডের সাথে সাবস্ক্রিপশনের স্ট্যাটাস সিঙ্ক করে, তাহলে আপনাকে SubscriptionNotification
SUBSCRIPTION_RESTARTED
টাইপের মেসেজ শুনতে হবে। আপনি এই RTDN পাওয়ার পরে,
আপনার অ্যাপ বিজ্ঞপ্তির উত্তর দিতে, সাবস্ক্রিপশন এখন
রিনিউ করার জন্য সেট করা হয়েছে বলে রেকর্ড করতে এবং আপনার অ্যাপে রিস্টোরেশন মেসেজ দেখানো বন্ধ করতে পারবে।
সাবস্ক্রিপশন রিসোর্স নিম্নলিখিত উদাহরণের মতো দেখতে হয়:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": next_renewal_date
...
}
],
}
সাবস্ক্রিপশন ফিরিয়ে আনলে নতুন অর্ডার তৈরি হয় না। ব্যবহারকারী আগে বাতিল করেছেন এমন কোনও সাবস্ক্রিপশনের জন্য $০.০০ মূল্যের অর্ডার দেখলে, সম্ভবত সাবস্ক্রিপশন শেষ হওয়ার আগে ব্যবহারকারী আপনার অ্যাপ থেকে আবার সাইন-আপ করেছেন। আরও তথ্যের জন্য, আপগ্রেড, ডাউনগ্রেড ও আবার সাবস্ক্রাইব করা দেখুন।
মেয়াদ শেষ হওয়ার পরে আবার সাবস্ক্রাইব করা
Google Play Console বা API ব্যবহার করে অটোমেটিক রিনিউ হওয়া বেস প্ল্যান কনফিগার করা হলে আবার সাবস্ক্রাইব করার অনুমতি দেওয়া হয়। ব্যবহারকারীরা Google Play Store থেকে মেয়াদ শেষ হয়ে যাওয়া সাবস্ক্রিপশন আবার কিনতে পারেন।
এগুলি নতুন কেনাকাটা। Google Play একটি একেবারে নতুন পার্চেজ টোকেন ইস্যু করে এবং আপনার
ব্যাকএন্ড SUBSCRIPTION_PURCHASED টাইপের RTDN পায়। এই ধরনের অ্যাপ-বাইরের কেনাকাটার ক্ষেত্রে
কেনাকাটার স্ট্যাটাসে linkedPurchaseToken
মূল কেনাকাটার সাথে যুক্ত কোনও তথ্য থাকে না, কারণ মূল
সাবস্ক্রিপশনের মেয়াদ সম্পূর্ণ শেষ হয়ে গেছে।
আবার কেনা সাবস্ক্রিপশনের জন্য সঠিক ব্যবহারকারীকে অ্যাসোসিয়েট করা এবং স্বীকৃতি না দেওয়া কেনাকাটার জন্য অটোমেটিক রিফান্ড আটকানোর জন্য, আপনাকে অবশ্যই ব্যাকএন্ড সার্ভারে আবার কেনা সাবস্ক্রিপশনকে স্বীকৃতি দিতে হবে:
RTDN থেকে পাওয়া নতুন কেনাকাটার টোকেন সহ
purchases.subscriptionsv2.getনম্বরে কল করুন। এই ধরনের অ্যাপ-বাইরে কেনাকাটার ক্ষেত্রে দেওয়া উত্তরেoutOfAppPurchaseContextফিল্ড অন্তর্ভুক্ত থাকে, এটি শুধুমাত্র কনফার্ম না করা আবার সাবস্ক্রিপশন কেনার ক্ষেত্রে থাকে। এই ফিল্ডে এগুলি থাকে:expiredExternalAccountIdentifiers:ExternalAccountIdentifiersঅবজেক্ট যাতে আগের মেয়াদ শেষ হয়ে যাওয়া সাবস্ক্রিপশনের জন্য কনফিগার করাobfuscatedAccountIdওobfuscatedProfileIdফিল্ড থাকে, যদি সেগুলি সেট করা থাকে।expiredPurchaseToken: মেয়াদ শেষ হয়ে যাওয়া শেষ সাবস্ক্রিপশনের পার্চেজ টোকেন।
আপনার ব্যাকএন্ডে নতুন কেনাকাটা সঠিক ব্যবহারকারীর অ্যাকাউন্টের সাথে লিঙ্ক করতে, এই শনাক্তকারীগুলির মধ্যে যেকোনও একটি ব্যবহার করুন।
কেনাকাটা সম্পর্কে জানতে
purchases.subscriptions.acknowledgeনম্বরে কল করুন।- বিকল্প হিসেবে, আপনি
setObfuscatedAccountIdএবংsetObfuscatedProfileIdব্যবহার করে ইন-অ্যাপ বিলিং ফ্লো চলাকালীন কনফিগার করে থাকলে, ব্যবহারকারীরobfuscatedAccountIdএবংobfuscatedProfileIdপাঠাতে পারেন।
- বিকল্প হিসেবে, আপনি
এই সার্ভার-সাইড পদ্ধতির মাধ্যমে, ব্যবহারকারী আপনার অ্যাপ না খুললেও, কেনাকাটা করার তারিখ থেকে তিন দিনের মধ্যে আপনি কেনাকাটা কনফার্ম করতে পারবেন।
আপগ্রেড, ডাউনগ্রেড ও আবার সাবস্ক্রাইব করা
কোনও ব্যবহারকারী আপগ্রেড, ডাউনগ্রেড করলে অথবা সাবস্ক্রিপশনের মেয়াদ শেষ হওয়ার আগে আপনার অ্যাপ থেকে বাতিল করার পরে সাইন-আপ করলে, পুরনো সাবস্ক্রিপশন বাতিল হয়ে যায় এবং একটি নতুন পারচেজ টোকেন সহ নতুন সাবস্ক্রিপশন তৈরি হয়।
এছাড়াও, Google Play Developer API থেকে পাওয়া সাবস্ক্রিপশন
রিসোর্সে
একটি linkedPurchaseToken
ফিল্ড থাকে যা সেই পুরনো কেনাকাটা নির্দেশ করে যেখান থেকে ব্যবহারকারী আপগ্রেড, ডাউনগ্রেড করেছেন
বা আবার সাবস্ক্রাইব করেছেন। আপনি সেই ফিল্ডে কেনাকাটার টোকেন ব্যবহার করে পুরনো
সাবস্ক্রিপশন খুঁজে দেখতে এবং আগে থেকে থাকা ব্যবহারকারীর অ্যাকাউন্ট শনাক্ত করতে পারবেন, যাতে আপনি
নতুন কেনাকাটা একই অ্যাকাউন্টের সাথে যুক্ত করতে পারেন।
কোনও ব্যবহারকারী তার সাবস্ক্রিপশন শেষ হওয়ার আগে আপনার অ্যাপ থেকে একই বেস প্ল্যানে আবার সাইন-আপ করলে, Google Play নতুন কেনাকাটার জন্য $0.00 মূল্যের একটি অর্ডার জেনারেট করে। সাইন-আপ করার সময় ব্যবহারকারীকে চার্জ করা হয় না, কারণ তিনি আগেই বর্তমান বিলিং পিরিয়ডের জন্য পেমেন্ট করেছেন। মূল রিনিউয়াল তারিখে নিয়মিত বিলিং আবার শুরু হয়। $0.00 মূল্যের অর্ডারটি Play Console-এর অর্ডার ম্যানেজমেন্ট বিভাগে এবং আপনার আর্থিক রিপোর্টে দেখা যাবে। এর অর্থ এই নয় যে ব্যবহারকারী ফ্রি ট্রায়াল বা প্রোমোশনাল ছাড় পেয়েছেন।
আপনার অ্যাপে কোনও ব্যবহারকারীকে আপগ্রেড, ডাউনগ্রেড বা আবার সাবস্ক্রাইব করার বিকল্প অফার করার আগে, আপনাকে অবশ্যই আগে থেকে থাকা সাবস্ক্রিপশন সম্পর্কে জানতে হবে। বর্তমান সাবস্ক্রিপশনের স্বীকৃতি এখনও পেন্ডিং থাকলে, কোনও প্ল্যান পরিবর্তন বা আবার সাবস্ক্রাইব করা ব্লক করা হয়।
ব্যবহারকারী আপগ্রেড, ডাউনগ্রেড বা আবার সাবস্ক্রাইব করলে, এটি একটি নতুন কেনাকাটা হিসেবে গণ্য হবে এবং আপনাকে এটি স্বীকার করতে হবে। এটি করার জন্য সাজেস্ট করা পদ্ধতি হল 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 RTDN পাবেন। আপনি purchases.subscriptionsv2.get এন্ডপয়েন্টে কোয়েরি করে
সাবস্ক্রিপশন রিসোর্স পেতে পারেন। এতে সাবস্ক্রিপশনের
প্রতিটি আইটেমের দাম পরিবর্তনের বিবরণ থাকবে।
আগে থেকে থাকা সাবস্ক্রাইবারদের ক্ষেত্রে দামের পরিবর্তন অপট-ইন হিসেবে প্রয়োগ করা হলে, ব্যবহারকারী নতুন দাম কনফার্ম বা বাতিল করার জন্য কোনও অ্যাকশন নিলে আপনি RTDN পাবেন।
চালু করলে দাম বাড়বে, এই বিষয়ে ব্যবহারকারীর কনফার্মেশন ম্যানেজ করা
ব্যবহারকারী আপনার সাবস্ক্রিপশনের দাম বাড়ানোর ব্যাপারে সম্মতি দিলে, আপনি
SubscriptionNotification মেসেজ পাবেন যার type
SUBSCRIPTION_PRICE_CHANGE_UPDATED হবে।
মূল্য পরিবর্তনের পরে রিনিউয়াল ম্যানেজ করা
দাম কমে গেলে অথবা সাবস্ক্রিপশনের দাম বেড়ে গেলে রিনিউ করার সময়,
আপনি SubscriptionNotification মেসেজ পাবেন যার ধরন হবে
SUBSCRIPTION_RENEWED। এই বিজ্ঞপ্তিটিকে অন্য যেকোনও রিনিউয়ালের মতো বিবেচনা করুন।
যেসব ক্ষেত্রে চালু করলে মূল্য বৃদ্ধি গ্রহণ করা হয় না, সেইসব কেস ম্যানেজ করা
কোনও ব্যবহারকারী যদি বেশি দামে রিনিউ করার আগে আপনার অপ্ট-ইন মূল্যবৃদ্ধি
তে সম্মতি না দিয়ে থাকেন, তাহলে তিনি অটোমেটিক আনসাবস্ক্রাইব হয়ে যাবেন
এবং আপনি SUBSCRIPTION_CANCELED টাইপের
SubscriptionNotification মেসেজ
পাবেন। বাতিলকরণ
বিভাগে যেভাবে বর্ণনা করা হয়েছে সেইভাবে এই ইভেন্ট ম্যানেজ করুন।
এছাড়াও, ব্যবহারকারীরা একই পদ্ধতি অনুসরণ করে দাম বাড়ানো থেকে বেরিয়ে আসার জন্য তাদের সাবস্ক্রিপশন বাতিল করতে পারবেন।
দাম বাড়ানোর জন্য সম্মতি (শুধুমাত্র কোরিয়াতে প্রযোজ্য)
দক্ষিণ কোরিয়ার (KR) নতুন রেগুলেশন অনুযায়ী, KR অঞ্চলে সাবস্ক্রিপশন ব্যবহারকারীদের ফ্রি ট্রায়াল বা প্রাথমিক মেয়াদ শেষ হওয়ার পরে দাম বাড়লে তাতে সম্মতি দিতে হবে।
রেগুলেশন মেনে চলতে আপনাকে সাহায্য করতে, Play কোরীয় অঞ্চলে বসবাসকারী ব্যবহারকারীদের সম্মতি সংক্রান্ত প্রয়োজনীয়তা সম্পর্কে বিজ্ঞপ্তি পাঠাবে এবং ব্যবহারকারীদের থেকে পাওয়া সম্মতি সংক্রান্ত উত্তরও স্টোর করবে। যেসব ব্যবহারকারী বেশি দাম কার্যকর হওয়ার আগে সম্মতি দেন না, তাদের সাবস্ক্রিপশন অটোমেটিক বাতিল হয়ে যায়। Play থেকে পাঠানো বিজ্ঞপ্তি ছাড়াও, আপনি নিজের পছন্দমতো মূল্য বৃদ্ধির বিজ্ঞপ্তি ব্যবহারকারীদের পাঠাতে এবং আপনার বিজ্ঞপ্তিতে নির্দিষ্ট ম্যানেজমেন্ট পৃষ্ঠার লিঙ্ক প্রদান করতে পারবেন।
সম্মতি জানানোর সময়সীমা শুরু হলে বা ব্যবহারকারী সম্মতি জানালে
আপনি type
SUBSCRIPTION_PRICE_STEP_UP_CONSENT_UPDATED সহ SubscriptionNotification মেসেজ পাবেন।
প্রাইস স্টেপ-আপ ও প্রাইস পরিবর্তনের মধ্যে পার্থক্য
price step-up বলতে সাবস্ক্রিপশনের দাম বেড়ে যাওয়াকে বোঝায়, এটি
একটি অফার ফেজ থেকে অন্য অফার ফেজে পরিবর্তন হওয়ার কারণে হয়। যেমন, কোনও সাবস্ক্রিপশন ফ্রি ট্রায়াল থেকে নিয়মিত দামে পরিবর্তিত হলে। সাবস্ক্রিপশনের বর্তমান
ফেজ শনাক্ত করতে, আপনি সাবস্ক্রিপশন রিসোর্সে
offerPhase ফিল্ড ব্যবহার করতে পারবেন।
তবে, price change বলতে সাবস্ক্রিপশনের বেস প্ল্যানের দামের জন্য আপনার (ডেভেলপার) করা দামের আপডেটকে বোঝায়।
যেমন,
চালু করলে মূল্য বাড়বে বা বন্ধ করলে মূল্য বাড়বে।
প্রিপেড প্ল্যানের লাইফ সাইকেল ম্যানেজ করা
অটোমেটিক রিনিউ হওয়া সাবস্ক্রিপশনের মতো, আপনাকে প্রতিটি নতুন কেনাকাটার পরে প্রিপেড প্ল্যান সম্পর্কে সম্মতি জানাতে হবে। প্রিপেড প্ল্যানের ক্ষেত্রে, আপনাকে অবশ্যই প্রাথমিক কেনাকাটা এবং যেকোনও টপ-আপ সম্পূর্ণভাবে প্রসেস করতে হবে, কারণ ব্যবহারকারীকে প্রতিবার কেনাকাটার প্রসেস সম্পূর্ণ করতে হবে।
প্রিপেড প্ল্যানের মেয়াদ কম হতে পারে বলে, যত তাড়াতাড়ি সম্ভব কেনাকাটা সম্পূর্ণ করা গুরুত্বপূর্ণ। এক সপ্তাহ বা তার বেশি মেয়াদ সহ প্রিপেড প্ল্যান ৩ দিনের মধ্যে স্বীকার করতে হবে। এক সপ্তাহের কম মেয়াদ সহ প্রিপেড প্ল্যানের ক্ষেত্রে, প্ল্যানের মেয়াদের অর্ধেক সময়ের মধ্যে স্বীকার করতে হবে। যেমন, তিন দিনের প্রিপেড প্ল্যান কেনার কথা স্বীকার করার জন্য ডেভেলপারদের কাছে ১.৫ দিন সময় থাকে।
প্রিপেড প্ল্যান সাবস্ক্রিপশন কেনা হলে, প্রতিটি টপ-আপ সহ, আপনার RTDN ক্লায়েন্টকে SubscriptionNotification মেসেজ
SUBSCRIPTION_PURCHASED টাইপ সহ পাঠানো হয়। লেটেস্ট প্রিপেড প্ল্যান সাবস্ক্রিপশন স্ট্যাটাস চেক করতে
purchases.subscriptionsv2.get
মেথড কল করুন।
টপ-আপ কেনার জন্য নতুন কেনাকাটা টোকেন ইস্যু করা হয় এবং আপনি নতুন সাবস্ক্রিপশন কেনার
স্ট্যাটাসের অংশ হিসেবে linkedPurchaseToken ফিল্ডে আগের কেনাকাটা টোকেন
পাবেন। সাবস্ক্রিপশন
সাইন-আপ করার তারিখ থেকে মেয়াদ শেষ হওয়ার ৬০ দিন পর্যন্ত কেনাকাটার টোকেন বৈধ থাকে। এই তারিখের পরে, 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রিপ্লেস করে।