সাবস্ক্রিপশন ক্রয় তাদের জীবনচক্র জুড়ে বিভিন্ন অবস্থার মধ্য দিয়ে যেতে পারে, যা স্বয়ংক্রিয় পুনর্নবীকরণ আচরণ, অর্থপ্রদান প্রত্যাখ্যানের পরিস্থিতি এবং বিকাশকারী ব্যবস্থাপনার পদক্ষেপ সহ অনেক কারণের উপর নির্ভর করে।
স্বয়ংক্রিয় পুনর্নবীকরণ সাবস্ক্রিপশনের জন্য জীবনচক্র পরিচালনা করুন
যখন কোনও ব্যবহারকারীর সাবস্ক্রিপশনের অবস্থা পরিবর্তন হয়, তখন আপনার ব্যাকএন্ড সার্ভার একটি SubscriptionNotification বার্তা পায়।
আপনার ব্যাকএন্ডের অবস্থা আপডেট করতে, বিজ্ঞপ্তিতে অন্তর্ভুক্ত ক্রয় টোকেন সহ purchases.subscriptionsv2.get API-তে কল করুন। এই এন্ডপয়েন্টটি ক্রয় টোকেন প্রদত্ত সর্বশেষ সাবস্ক্রিপশন অবস্থা প্রদান করে এবং সাবস্ক্রিপশন পরিচালনার জন্য সত্যের উৎস হিসাবে বিবেচিত হয়।
ক্রয় টোকেনটি সাবস্ক্রিপশন সাইন আপ থেকে মেয়াদ শেষ হওয়ার ৬০ দিন পর্যন্ত বৈধ থাকবে। এই তারিখের পরে, ক্রয় টোকেনটি আর Google Play ডেভেলপার API কল করার জন্য বৈধ থাকবে না।
নতুন স্বয়ংক্রিয় পুনর্নবীকরণযোগ্য সাবস্ক্রিপশন ক্রয়
যখন একজন ব্যবহারকারী সাবস্ক্রিপশন ক্রয় করেন, তখন আপনার RTDN ক্লায়েন্টে SUBSCRIPTION_PURCHASED টাইপের একটি SubscriptionNotification বার্তা পাঠানো হয়। আপনি এই বিজ্ঞপ্তিটি পান অথবা PurchasesUpdatedListener এর মাধ্যমে অ্যাপের মধ্যে একটি নতুন ক্রয় নিবন্ধন করুন অথবা আপনার অ্যাপের onResume() পদ্ধতিতে ম্যানুয়ালি ক্রয় আনুন , আপনার নতুন ক্রয়টি আপনার সুরক্ষিত ব্যাকএন্ডে প্রক্রিয়া করা উচিত। এটি করার জন্য, এই পদক্ষেপগুলি অনুসরণ করুন:
- সর্বশেষ সাবস্ক্রিপশন অবস্থা ধারণকারী একটি সাবস্ক্রিপশন রিসোর্স পেতে
purchases.subscriptionsv2.getএন্ডপয়েন্টটি অনুসন্ধান করুন। - নিশ্চিত করুন যে
subscriptionStateক্ষেত্রের মানSUBSCRIPTION_STATE_ACTIVE। - ক্রয়টি যাচাই করুন ।
- ব্যবহারকারীকে কন্টেন্টে অ্যাক্সেস দিন। ক্রয়ের সময়
setObfuscatedAccountIdএবংsetObfuscatedProfileIdব্যবহার করে শনাক্তকারী সেট করা থাকলে, সাবস্ক্রিপশন রিসোর্স থেকেExternalAccountIdentifiersঅবজেক্টের মাধ্যমে ক্রয়ের সাথে সম্পর্কিত ব্যবহারকারী অ্যাকাউন্টটি সনাক্ত করা যেতে পারে।
SubscriptionPurchaseLineItem এর offerPhase ফিল্ডটি সাবস্ক্রিপশনের বর্তমান পর্যায়ের বিশদ বিবরণ প্রদান করে, যেমন বিনামূল্যে ট্রায়াল বা প্রারম্ভিক মূল্য।
প্লে বিলিং লাইব্রেরিতে সাবস্ক্রিপশন স্বীকৃতি দেওয়ার একটি পদ্ধতি, 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 ডেভেলপার 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 এর মাধ্যমে সক্রিয় হিসাবে দেখানো হয়।
আপনার ব্যাকএন্ডের সাথে সাবস্ক্রিপশন অবস্থা সিঙ্ক্রোনাইজ করলে আপনি পেমেন্ট হ্রাস সম্পর্কে আরও সচেতন হতে পারবেন এবং অনিচ্ছাকৃত পরিবর্তন কমানোর চেষ্টা করার সময় আপনাকে আরও প্রসঙ্গ দেবে। ব্যবহারকারী যখন গ্রেস পিরিয়ডে প্রবেশ করবেন তখন 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(যদি সফলভাবে পুনর্নবীকরণ করা হয়)
সাবস্ক্রিপশনের সর্বশেষ অবস্থা জানতে আপনি 24 ঘন্টার নীরব গ্রেস পিরিয়ডের পরে যেকোনো সময় 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 অ্যাকাউন্ট হোল্ডে থাকা ব্যবহারকারীদের তাদের পেমেন্ট প্রত্যাখ্যানের বিষয়ে অবহিত করে এবং আপনার তাদের পেমেন্ট পদ্ধতি ঠিক করতে উৎসাহিত করা উচিত।
ব্যবহারকারী তাদের পেমেন্ট পদ্ধতি ঠিক করার পর, সাবস্ক্রিপশনটি একটি সক্রিয় অবস্থায় ফিরে আসে এবং তারপরে আপনাকে সাবস্ক্রাইব করা সামগ্রীতে অ্যাক্সেস পুনরুদ্ধার করতে হবে। এই ক্ষেত্রে, ক্রয় টোকেনটি অ্যাকাউন্ট হোল্ড শুরু হওয়ার আগে যেমন ছিল তেমনই থাকবে কারণ একই ক্রয় পুনরুদ্ধার হচ্ছে, এবং আপনি SUBSCRIPTION_RECOVERED টাইপের একটি RTDN পাবেন।
কিস্তি সাবস্ক্রিপশনের জন্য, যেকোনো ব্যক্তিগত অর্থপ্রদানের প্রচেষ্টার জন্য অর্থপ্রদান প্রত্যাখ্যান এবং পুনরুদ্ধার ঘটতে পারে।
পুনরুদ্ধারের পরে, 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 টাইপের একটি 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 ৪৮ ঘন্টা পর্যন্ত পেমেন্ট পদ্ধতিতে চার্জ করার জন্য অতিরিক্ত প্রচেষ্টা করে। এই সময়কালে ব্যবহারকারী সাবস্ক্রিপশনের সুবিধাগুলি ধরে রাখেন। এই পুনরায় চেষ্টা করার সময়কাল অতিবাহিত হওয়ার পরে, সাবস্ক্রিপশনটি অ্যাকাউন্ট হোল্ডে চলে যায় এবং ব্যবহারকারী সাবস্ক্রিপশনের সুবিধাগুলি হারাবেন।
- যখন সাবস্ক্রিপশনটি ব্যর্থ পেমেন্ট পদ্ধতির সাথে স্থগিত অবস্থা থেকে পুনরায় শুরু হয়, তখন সাবস্ক্রিপশনটি সরাসরি অ্যাকাউন্ট হোল্ডে চলে যায়।
- যখন কোনও সাবস্ক্রিপশন অ্যাকাউন্ট হোল্ড থেকে পুনরুদ্ধার করা হয়, তখন পুনর্নবীকরণের তারিখ রিসেট হয়।
মেয়াদ শেষ
সাবস্ক্রিপশনের মেয়াদ শেষ হয়ে গেলে, ব্যবহারকারী সাবস্ক্রিপশনের অ্যাক্সেস হারাবেন। এই ক্ষেত্রে SUBSCRIPTION_EXPIRED টাইপের একটি SubscriptionNotification বার্তা পাঠানো হবে। আপনি যখন এই বিজ্ঞপ্তিটি পাবেন, তখন সর্বশেষ সাবস্ক্রিপশন রিসোর্স পেতে Google Play ডেভেলপার 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 তে সেট করা থাকে কারণ কিস্তির সময়কালের শেষ না হওয়া পর্যন্ত কিস্তি সাবস্ক্রিপশনটি এখনও সক্রিয় থাকে। তবে, একটি খালি মুলতুবি বাতিলকরণ অবজেক্ট উপস্থিত রয়েছে। প্রতিশ্রুতির সময়কালের শেষে একটি SUBSCRIPTION_EXPIRED এর পরে একটি SUBSCRIPTION_CANCELED বিজ্ঞপ্তি পাঠানো হয়।
বাতিলকরণের অপেক্ষায় থাকা একটি কিস্তি সাবস্ক্রিপশন ক্রয়ের সাবস্ক্রিপশন রিসোর্সটি নিম্নলিখিত উদাহরণের মতো দেখাচ্ছে:
{
"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 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 অবজেক্টটি চেক করে আপনি দেখতে পারবেন কখন সাবস্ক্রিপশনটি আবার নবায়ন হবে।
বিরতির সময় শেষে যদি সাবস্ক্রিপশন স্বয়ংক্রিয়ভাবে পুনরায় চালু হয় অথবা ব্যবহারকারী ম্যানুয়ালি সাবস্ক্রিপশন পুনরায় চালু করতে চান, তাহলে SUBSCRIPTION_RECOVERED টাইপের একটি SubscriptionNotification বার্তা পাঠানো হবে।
সাবস্ক্রিপশন বিরতির পরে পুনরায় চালু করার চেষ্টা করার সময় যদি কোনও অর্থপ্রদান ব্যর্থ হয়, তাহলে SUBSCRIPTION_ON_HOLD টাইপের একটি SubscriptionNotification বার্তা পাঠানো হয়।
উভয় পরিস্থিতিই অ্যাকাউন্ট হোল্ডে বর্ণিত পদ্ধতিতে পরিচালনা করা উচিত।
পুনরায় সাবস্ক্রাইব করুন
স্বয়ংক্রিয়ভাবে পুনর্নবীকরণযোগ্য সাবস্ক্রিপশন বেস প্ল্যানগুলির জন্য, গুগল প্লে স্টোর একটি রিসাবস্ক্রাইব বোতাম প্রদর্শন করতে পারে। এই বোতামটি ব্যবহারকারীদের সাবস্ক্রিপশনে অ্যাক্সেস ফিরে পেতে দেয়। বিভিন্ন কারণে এটি প্রদর্শিত নাও হতে পারে, উদাহরণস্বরূপ যখন একটি সাবস্ক্রিপশন অনেক আগে শেষ হয়ে যায়।

যদিও বোতামটি সর্বদা "পুনঃসাবস্ক্রাইব করুন" লেবেলযুক্ত থাকে, তবে এর কার্যকারিতা সাবস্ক্রিপশনের অবস্থার উপর নির্ভর করে।
সাবস্ক্রিপশন বাতিল করা হলেও এখনও মেয়াদ শেষ না হলেও, ব্যবহারকারী এখনও সাবস্ক্রাইব আছেন এবং সাবস্ক্রিপশনের সুবিধা পাচ্ছেন। ব্যবহারকারী যদি "পুনরায় সাবস্ক্রাইব করুন" এ ট্যাপ করেন, তাহলে বাতিলকরণ কার্যকরভাবে পূর্বাবস্থায় ফেরানো হবে এবং সাবস্ক্রিপশনটি পুনর্নবীকরণ হতে থাকবে। এই ক্রিয়াটি প্লে ডেভেলপার ডকুমেন্টেশন এবং API-তে পুনরুদ্ধার হিসাবে পরিচিত।
একটি স্বয়ংক্রিয় পুনর্নবীকরণযোগ্য সাবস্ক্রিপশনের মেয়াদ শেষ হয়ে গেলে, আপনি ব্যবহারকারীদের একই সাবস্ক্রিপশন বেস প্ল্যান কেনার অনুমতি দিতে পারেন। এই ক্রিয়াটি Play ডেভেলপার ডকুমেন্টেশন এবং API-তে "পুনরায় সাবস্ক্রাইব করুন " নামে পরিচিত। আপনি Play Console- এ বা API ব্যবহার করে প্রতিটি বেস প্ল্যানের জন্য এই বিকল্পটি কনফিগার করতে পারেন।
মেয়াদ শেষ হওয়ার আগে পুনরুদ্ধার করুন
যদি আপনার অ্যাপটি শুধুমাত্র queryPurchasesAsync() পদ্ধতির উপর নির্ভর করে একজন ব্যবহারকারী সাবস্ক্রিপশনের অধিকারী কিনা তা নির্ধারণ করে, তাহলে আপনার অ্যাপটি স্বয়ংক্রিয়ভাবে পুনরুদ্ধার পরিচালনা করবে কারণ queryPurchasesAsync() পদ্ধতিটি মেয়াদ শেষ হওয়ার আগেই বাতিল করা কেনাকাটাগুলি ফেরত পাঠাতে থাকে। একটি পুনরুদ্ধার করা সাবস্ক্রিপশন এমনভাবে পুনর্নবীকরণ করা অব্যাহত থাকে যেন এটি বাতিল করা হয়নি।
যদি আপনার অ্যাপটি সাবস্ক্রিপশন অবস্থাকে ব্যাকএন্ডের সাথে সিঙ্ক্রোনাইজ করে, তাহলে আপনার SUBSCRIPTION_RESTARTED টাইপের একটি SubscriptionNotification বার্তা শুনতে হবে। আপনি এই 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এ কল করুন।- ঐচ্ছিকভাবে, আপনি ব্যবহারকারীর
obfuscatedAccountIdএবংobfuscatedProfileIdপাঠাতে পারেন যদি আপনি অ্যাপ-মধ্যস্থ বিলিং প্রবাহের সময়setObfuscatedAccountIdএবংsetObfuscatedProfileIdব্যবহার করে কনফিগার করে থাকেন।
- ঐচ্ছিকভাবে, আপনি ব্যবহারকারীর
এই সার্ভার-সাইড পদ্ধতির মাধ্যমে আপনি ক্রয়ের তারিখ থেকে তিন দিনের মধ্যে ক্রয়টি স্বীকার করতে পারবেন, এমনকি যদি ব্যবহারকারী আপনার অ্যাপটি নাও খোলেন।
আপগ্রেড, ডাউনগ্রেড এবং পুনঃসাবস্ক্রাইব
যখন কোনও ব্যবহারকারী সাবস্ক্রিপশনের মেয়াদ শেষ হওয়ার আগে আপনার অ্যাপ থেকে আপগ্রেড, ডাউনগ্রেড বা বাতিলকরণের পরে সাইন আপ করেন , তখন পুরানো সাবস্ক্রিপশনটি বাতিল হয়ে যায় এবং একটি নতুন ক্রয় টোকেন দিয়ে একটি নতুন সাবস্ক্রিপশন তৈরি করা হয়।
এছাড়াও, Google Play Developer API থেকে ফিরে আসা সাবস্ক্রিপশন রিসোর্সে একটি linkedPurchaseToken ফিল্ড রয়েছে যা ব্যবহারকারী যে পুরনো ক্রয়টি আপগ্রেড, ডাউনগ্রেড বা পুনঃসাবস্ক্রাইব করেছেন তা নির্দেশ করে। আপনি সেই ফিল্ডে ক্রয় টোকেন ব্যবহার করে পুরানো সাবস্ক্রিপশনটি দেখতে এবং বিদ্যমান ব্যবহারকারী অ্যাকাউন্টটি সনাক্ত করতে পারেন যাতে আপনি একই অ্যাকাউন্টের সাথে নতুন ক্রয়টি সংযুক্ত করতে পারেন।
আপনার অ্যাপে কোনও ব্যবহারকারীকে আপগ্রেড, ডাউনগ্রেড বা পুনঃসাবস্ক্রাইব করার বিকল্পগুলি অফার করার আগে, আপনাকে অবশ্যই বিদ্যমান সাবস্ক্রিপশনটি স্বীকার করতে হবে। বিদ্যমান সাবস্ক্রিপশনটি এখনও স্বীকৃতির অপেক্ষায় থাকলে, কোনও পরিকল্পনা পরিবর্তন বা পুনঃসাবস্ক্রাইব ব্লক করা হবে।
যদি ব্যবহারকারী সফলভাবে আপগ্রেড, ডাউনগ্রেড, অথবা পুনরায় সাবস্ক্রাইব ক্রয় করে, তাহলে এটি একটি নতুন ক্রয় যা আপনাকে স্বীকার করতে হবে। এটি করার প্রস্তাবিত উপায় হল Google Play Developer API ব্যবহার করা। সাবস্ক্রিপশন রিসোর্সটি নিম্নলিখিত উদাহরণের মতো দেখাচ্ছে:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
"linkedPurchaseToken": old_purchase_token,
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": next_renewal_date,
"autoRenewingPlan": {
"autoRenewEnabled": true
}
}
],
}
দামের পরিবর্তন
স্বয়ংক্রিয়ভাবে পুনর্নবীকরণযোগ্য সাবস্ক্রিপশনের দাম পরিবর্তন করা এবং উপযুক্ত সময়ে ব্যবহারকারীদের অবহিত করা সম্পর্কে জানতে মূল্য পরিবর্তনের সেরা অনুশীলন নির্দেশিকাটি দেখুন।
যখন মূল্য পরিবর্তন যোগ করা হয় এবং মূল্য পরিবর্তনের স্থিতির যেকোনো আপডেটের জন্য, আপনি SUBSCRIPTION_PRICE_CHANGE_UPDATED RTDN পাবেন। আপনি purchases.subscriptionsv2.get endpoint অনুসন্ধান করে একটি সাবস্ক্রিপশন রিসোর্স পেতে পারেন যাতে সাবস্ক্রিপশনের প্রতিটি আইটেমের জন্য মূল্য পরিবর্তনের বিবরণ থাকবে।
যখন মূল্য পরিবর্তনগুলি বিদ্যমান গ্রাহকদের জন্য অপ্ট-ইন হিসাবে প্রয়োগ করা হয়, তখন ব্যবহারকারী যদি নতুন মূল্য নিশ্চিত বা প্রত্যাখ্যান করার জন্য পদক্ষেপ নেন তবে আপনি একটি RTDN পাবেন।
ব্যবহারকারীর দ্বারা অপ্ট-ইন মূল্য পরিবর্তনের নিশ্চিতকরণ পরিচালনা করুন
যখন কোনও ব্যবহারকারী আপনার সাবস্ক্রিপশনের মূল্য বৃদ্ধি গ্রহণ করেন, তখন আপনি SUBSCRIPTION_PRICE_CHANGE_UPDATED টাইপের একটি সাবস্ক্রিপশননোটিফিকেশন বার্তা পাবেন।
মূল্য পরিবর্তন প্রয়োগের পরে পুনর্নবীকরণ পরিচালনা করুন
মূল্য হ্রাসের সাথে সাথে, অথবা যখন সাবস্ক্রিপশনের মূল্য বৃদ্ধি পুনর্নবীকরণ করা হবে, তখন আপনি SUBSCRIPTION_RENEWED টাইপের একটি SubscriptionNotification বার্তা পাবেন। এই বিজ্ঞপ্তিটিকে অন্য যেকোনো পুনর্নবীকরণের মতোই বিবেচনা করুন।
যেসব ক্ষেত্রে অপ্ট-ইন মূল্য বৃদ্ধি গ্রহণযোগ্য নয়, সেগুলি পরিচালনা করুন
যদি কোনও ব্যবহারকারী আপনার অপ্ট-ইন মূল্য বৃদ্ধি গ্রহণ না করে, তবে উচ্চ মূল্যে পুনর্নবীকরণের প্রয়োজন হয়, তাহলে তারা স্বয়ংক্রিয়ভাবে সদস্যতা ত্যাগ করবে এবং আপনি SUBSCRIPTION_CANCELED টাইপের একটি সাবস্ক্রিপশন নোটিফিকেশন বার্তা পাবেন। বাতিলকরণ বিভাগে বর্ণিত পদ্ধতিতে এই ইভেন্টটি পরিচালনা করুন।
ব্যবহারকারীরা একই পদ্ধতি অনুসরণ করে অপ্ট-আউট মূল্য বৃদ্ধির জন্য তাদের সাবস্ক্রিপশন বাতিল করতে পারেন।
দাম বৃদ্ধির সম্মতি (শুধুমাত্র KR অঞ্চলের জন্য প্রযোজ্য)
নতুন দক্ষিণ কোরিয়ান (KR) নিয়মাবলীর কারণে, KR অঞ্চলের সাবস্ক্রিপশন ব্যবহারকারীদের তাদের বিনামূল্যে ট্রায়াল বা প্রারম্ভিক সময়কাল শেষ হওয়ার পরে যে কোনও মূল্য বৃদ্ধির সাথে সম্মতি দিতে হবে।
এই নিয়ম মেনে চলতে আপনাকে সাহায্য করার জন্য, Play KR অঞ্চলের ব্যবহারকারীদের সম্মতির প্রয়োজনীয়তা সম্পর্কে অবহিত করবে এবং ব্যবহারকারীদের কাছ থেকে সম্মতির প্রতিক্রিয়াও সংরক্ষণ করবে। উচ্চ মূল্য কার্যকর হওয়ার আগে সম্মতি প্রদান না করলে ব্যবহারকারীদের সাবস্ক্রিপশন স্বয়ংক্রিয়ভাবে বাতিল হয়ে যায়। Play থেকে পাঠানো বিজ্ঞপ্তিগুলি ছাড়াও, আপনি আপনার ব্যবহারকারীদের কাছে আপনার কাস্টম মূল্য ধাপ-বৃদ্ধির বিজ্ঞপ্তিগুলিও পাঠাতে পারেন এবং আপনার বিজ্ঞপ্তিগুলিতে নির্দিষ্ট ব্যবস্থাপনা পৃষ্ঠার লিঙ্ক সরবরাহ করতে পারেন।
সম্মতির সময়কাল শুরু হলে অথবা ব্যবহারকারী সম্মতি প্রদান করলে, আপনি SUBSCRIPTION_PRICE_STEP_UP_CONSENT_UPDATED টাইপের একটি সাবস্ক্রিপশন নোটিফিকেশন বার্তা পাবেন।
মূল্য বৃদ্ধি এবং মূল্য পরিবর্তনের মধ্যে পার্থক্য
price step-up বলতে বোঝায় সাবস্ক্রিপশনের মূল্য বৃদ্ধি, যা এক অফার পর্যায় থেকে অন্য পর্যায়ে স্থানান্তরের কারণে হয়। উদাহরণস্বরূপ, একটি সাবস্ক্রিপশন বিনামূল্যে ট্রায়াল থেকে নিয়মিত মূল্যে স্থানান্তরিত হচ্ছে। সাবস্ক্রিপশনের বর্তমান পর্যায়টি সনাক্ত করতে আপনি সাবস্ক্রিপশন রিসোর্সে offerPhase ক্ষেত্রটি ব্যবহার করতে পারেন।
তবে, price change বলতে আপনার (ডেভেলপার) দ্বারা সাবস্ক্রিপশনের মূল পরিকল্পনার মূল্যের জন্য শুরু করা মূল্য আপডেটগুলিকে বোঝায়। উদাহরণস্বরূপ, অপ্ট-ইন মূল্য বৃদ্ধি বা অপ্ট-আউট মূল্য বৃদ্ধি।
প্রিপেইড প্ল্যানের জীবনচক্র পরিচালনা করুন
স্বয়ংক্রিয় পুনর্নবীকরণ সাবস্ক্রিপশনের মতো, প্রতিটি নতুন ক্রয়ের পরে আপনাকে অবশ্যই প্রিপেইড প্ল্যানগুলি স্বীকার করতে হবে। প্রিপেইড প্ল্যানের ক্ষেত্রে, আপনাকে প্রাথমিক ক্রয় এবং যেকোনো টপ-আপ উভয়ই সম্পূর্ণরূপে প্রক্রিয়া করতে হবে, কারণ ব্যবহারকারীকে প্রতিবার ক্রয় প্রবাহের মধ্য দিয়ে যেতে হবে।
প্রিপেইড প্ল্যানের সময়কাল কম হওয়ার সম্ভাবনা থাকায়, যত তাড়াতাড়ি সম্ভব ক্রয়ের স্বীকৃতি প্রদান করা গুরুত্বপূর্ণ। এক সপ্তাহ বা তার বেশি সময়কালের প্রিপেইড প্ল্যানগুলি 3 দিনের মধ্যে স্বীকৃতি প্রদান করতে হবে। এক সপ্তাহের কম সময়কালের প্রিপেইড প্ল্যানগুলি পরিকল্পনার সময়কালের অর্ধেকের মধ্যে স্বীকৃতি প্রদান করতে হবে। উদাহরণস্বরূপ, ডেভেলপারদের কাছে তিন দিনের প্রিপেইড প্ল্যানের ক্রয়ের স্বীকৃতি প্রদানের জন্য 1.5 দিন সময় থাকে।
যখনই কোনও প্রিপেইড প্ল্যান সাবস্ক্রিপশন কেনা হয়, তখনই SUBSCRIPTION_PURCHASED টাইপের একটি SubscriptionNotification বার্তা আপনার RTDN ক্লায়েন্টকে পাঠানো হয়, যার মধ্যে প্রতিটি টপ-আপও অন্তর্ভুক্ত। সর্বশেষ প্রিপেইড প্ল্যান সাবস্ক্রিপশনের অবস্থা পরীক্ষা করতে purchases.subscriptionsv2.get পদ্ধতিতে কল করুন।
টপ-আপ কেনাকাটার জন্য একটি নতুন ক্রয় টোকেন জারি করা হয় এবং নতুন সাবস্ক্রিপশন ক্রয় অবস্থার অংশ হিসেবে আপনি linkedPurchaseToken ক্ষেত্রে পূর্ববর্তী ক্রয় টোকেনটি পাবেন। ক্রয় টোকেনটি সাবস্ক্রিপশন সাইন আপ থেকে মেয়াদ শেষ হওয়ার 60 দিন পর্যন্ত বৈধ থাকবে। এই তারিখের পরে, ক্রয় টোকেনটি আর Google Play ডেভেলপার 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প্রতিস্থাপন করে।