১. ভূমিকা
এই কোডল্যাবটি আপনাকে গুগল প্লে বিলিং লাইব্রেরি (PBL) ব্যবহার করে সাবস্ক্রিপশন প্ল্যানের পরিবর্তনগুলি পরিচালনা করতে শেখাবে। বিভিন্ন রিপ্লেসমেন্ট মোড কীভাবে মূল্য নির্ধারণ এবং ব্যবহারকারীর অধিকারকে প্রভাবিত করে, তা আপনি জানতে পারবেন এবং এর পাশাপাশি ব্যাকএন্ড রিয়েল-টাইম ডেভেলপার নোটিফিকেশন (RTDN) কীভাবে প্রসেস করতে হয়, তাও শিখবেন।
দর্শক
অ্যান্ড্রয়েড অ্যাপ ডেভেলপারদের জন্য ডিজাইন করা এই কোডল্যাবটি অত্যাধুনিক সাবস্ক্রিপশন ম্যানেজমেন্ট ফিচারগুলো বাস্তবায়নের জন্য নির্দেশনা প্রদান করে। এই নির্দেশনা আপনাকে ব্যবহারকারীদের বিভিন্ন সাবস্ক্রিপশন প্ল্যানের মধ্যে আপগ্রেড, ডাউনগ্রেড বা স্থানান্তরের ক্ষেত্রে একটি নির্বিঘ্ন অভিজ্ঞতা দিতে সাহায্য করে।
আপনি যা শিখবেন...
- প্লে ডেভেলপার কনসোলে কীভাবে সাবস্ক্রিপশন তৈরি করবেন।
- আপনার অ্যাপের আপগ্রেড এবং ডাউনগ্রেড নীতির সাথে সামঞ্জস্য রেখে সঠিক
ReplacementMode(যেমন,WITH_TIME_PRORATIONবনামDEFERRED) কীভাবে নির্বাচন করবেন। - প্ল্যান পরিবর্তনের জন্য গুগল প্লে পারচেজ ফ্লো চালু করতে
launchBillingFlowমধ্যেBillingFlowParamsকীভাবে কনফিগার করবেন - আপনার ব্যাকএন্ডে নিরাপদে পুরোনো অ্যাক্সেস প্রত্যাহার করতে এবং নতুন অ্যাক্সেস দিতে কীভাবে রিয়েল-টাইম ডেভেলপার নোটিফিকেশন (RTDN) এবং
purchases.subscriptionsv2API ব্যবহার করবেন
আপনার যা যা লাগবে
- ডেভেলপার অ্যাকাউন্টের মাধ্যমে গুগল প্লে কনসোলে প্রবেশ করা যাবে। যদি আপনার ডেভেলপার অ্যাকাউন্ট না থাকে, তাহলে আপনাকে একটি অ্যাকাউন্ট তৈরি করতে হবে।
- এই কোডল্যাবের নমুনা অ্যাপটি আপনি গিটহাব থেকে ডাউনলোড করতে পারেন।
- অ্যান্ড্রয়েড স্টুডিও
২. নমুনা অ্যাপটি তৈরি করুন
এই কোডল্যাবে একটি নমুনা অ্যান্ড্রয়েড অ্যাপ ব্যবহার করে দেখানো হয়েছে কিভাবে পিবিএল-এ সাবস্ক্রিপশন রিপ্লেসমেন্ট প্রয়োগ করতে হয়। নমুনা অ্যাপটি একটি সম্পূর্ণ কার্যকরী অ্যান্ড্রয়েড অ্যাপ হিসেবে ডিজাইন করা হয়েছে, যার সম্পূর্ণ সোর্স কোড রয়েছে এবং যা নিম্নলিখিত দিকগুলো প্রদর্শন করে:
- PBL-এর সাথে অ্যাপটি একীভূত করুন
- সাবস্ক্রিপশন প্রতিস্থাপন বাস্তবায়ন করুন
আপনি যদি সাবস্ক্রিপশন রিপ্লেসমেন্ট এবং পিবিএল-এর সাথে আগে থেকেই পরিচিত থাকেন, তাহলে স্যাম্পল অ্যাপটি ডাউনলোড করে এটি নিয়ে পরীক্ষা-নিরীক্ষা করতে পারেন।
নিম্নলিখিত ডেমো ভিডিওটিতে দেখানো হয়েছে যে, নমুনা অ্যাপটি ডেপ্লয় এবং রান করার পর দেখতে কেমন হবে ও এর আচরণ কেমন হবে।
পূর্বশর্ত
স্যাম্পল অ্যাপটি বিল্ড এবং ডিপ্লয় করার আগে, নিম্নলিখিত কাজগুলো করুন:
- একটি গুগল প্লে কনসোল ডেভেলপার অ্যাকাউন্ট তৈরি করুন । যদি আপনার আগে থেকেই একটি ডেভেলপার অ্যাকাউন্ট থাকে, তাহলে এই ধাপটি এড়িয়ে যান।
- প্লে কনসোলে মনিটাইজেশন ফিচার চালু করে একটি নতুন অ্যাপ তৈরি করুন । বিকল্পভাবে, আপনি প্লে কনসোলে থাকা কোনো বিদ্যমান অ্যাপও ব্যবহার করতে পারেন। যদি আপনার অ্যাপের জন্য মনিটাইজেশন ফিচার চালু করা না থাকে, তবে তা সেট আপ করার জন্য এই ধাপগুলো অনুসরণ করুন।
- অ্যান্ড্রয়েড স্টুডিও ইনস্টল করুন।
নির্মাণ করুন
কোডল্যাব অনুসরণ করে প্রয়োজনীয় নমুনা অ্যাপটি তৈরি করতে:
- গিটহাব থেকে নমুনা অ্যাপটি ডাউনলোড করুন।
- প্লে ডেভেলপার কনসোলে থাকা আপনার অ্যাপের অ্যাপ্লিকেশন আইডি অনুযায়ী স্যাম্পল অ্যাপের
build.gradleএapplicationIdআপডেট করুন। - নমুনা অ্যাপটি তৈরি করুন ।
দ্রষ্টব্য : এটি স্থানীয় পরীক্ষার জন্য অ্যাপটি সফলভাবে বিল্ড করে। তবে, অ্যাপটি চালালে পণ্য এবং মূল্য পাওয়া যায় না, কারণ প্লে ডেভেলপার কনসোলে প্রয়োজনীয় সাবস্ক্রিপশনগুলো এখনও তৈরি করা হয়নি। পরবর্তী বিভাগে ডেভেলপার কনসোলে সাবস্ক্রিপশন তৈরি করার পদ্ধতি আলোচনা করা হবে।
৩. প্লে কনসোলে সাবস্ক্রিপশন তৈরি করুন
গুগল প্লে সাবস্ক্রিপশন সিস্টেম আপনাকে সাবস্ক্রিপশন তৈরি, পরিচালনা এবং বিক্রি করার ক্ষেত্রে নমনীয়তা প্রদান করে। প্লে কনসোলে, আপনি একাধিক বেস প্ল্যান সহ সাবস্ক্রিপশন কনফিগার করতে পারেন, যার প্রতিটিতে একাধিক অফার থাকে। সাবস্ক্রিপশন অফারগুলিতে বিভিন্ন প্রাইসিং মডেল এবং যোগ্যতার বিকল্প থাকতে পারে। এই কোডল্যাবের জন্য, আপনি তিনটি সাবস্ক্রিপশন তৈরি করবেন: প্রিমিয়াম প্ল্যান , বেসিক প্ল্যান এবং লাইট প্ল্যান , যা বিভিন্ন মূল্যের একটি সাধারণ সাবস্ক্রিপশন অফারকে অনুকরণ করবে। এগুলোর প্রতিটির একটিমাত্র মাসিক রিকারিং বেস প্ল্যান থাকবে।
একটি নতুন সাবস্ক্রিপশন তৈরি করুন
একটি নতুন সাবস্ক্রিপশন তৈরি করতে
- প্লে কনসোল খুলুন এবং সাবস্ক্রিপশন পৃষ্ঠায় যান ( Monetize with Play > Products > Subscriptions )
- সাবস্ক্রিপশন তৈরি করুন -এ ক্লিক করুন।
- আপনার সাবস্ক্রিপশনের বিবরণ লিখুন:
- প্রোডাক্ট আইডি : একটি অনন্য প্রোডাক্ট আইডি দিন।
premium_planলিখুন। - নাম : সাবস্ক্রিপশনটির জন্য একটি সংক্ষিপ্ত নাম লিখুন। উদাহরণ:
Premium Plan।
- প্রোডাক্ট আইডি : একটি অনন্য প্রোডাক্ট আইডি দিন।
- তৈরি করুন- এ ক্লিক করুন।
বেস প্ল্যান তৈরি করুন
- প্লে কনসোল খুলুন এবং সাবস্ক্রিপশন পৃষ্ঠায় যান ( Monetize with Play > Products > Subscriptions )
- যে সাবস্ক্রিপশনটিতে আপনি একটি বেস প্ল্যান তৈরি করতে চান, সেটির পাশে থাকা ডান তীরচিহ্নে ক্লিক করে সাবস্ক্রিপশনের বিবরণ দেখুন।
- বেস প্ল্যান যোগ করুন -এ ক্লিক করুন।
- একটি বেস প্ল্যান আইডি লিখুন। উদাহরণ:
monthly-auto-renewing। - ধরণ হিসেবে স্বয়ংক্রিয় নবায়নযোগ্য নির্বাচন করুন।
- স্বয়ংক্রিয়ভাবে নবায়নযোগ্য বেস প্ল্যানের জন্য নিম্নলিখিতগুলি সেট করুন:
- বিলিং সময়কাল: মাসিক ।
- অতিরিক্ত সময়সীমা: ৭ দিন ।
- বিলিং প্ল্যান ও অফার পরিবর্তন: বিলিং তারিখে চার্জ করা হবে ।
- পুনরায় সদস্যতা নিন: অনুমতি দিন ।
- মূল্য এবং প্রাপ্যতা বিভাগে, বেস প্ল্যানের মূল্য নির্ধারণ করতে ‘মূল্য নির্ধারণ করুন’ (Set Prices) এ ক্লিক করুন।
- সমস্ত দেশ ও অঞ্চল নির্বাচন করুন এবং তারপরে 'মূল্য নির্ধারণ করুন' বোতামে ক্লিক করুন।
- এই বেস প্ল্যানটির মূল্য $10 নির্ধারণ করুন এবং তারপর আপডেট-এ ক্লিক করুন।
- বেস প্ল্যানের মূল্য নির্ধারণ করা হয়ে গেলে, নিচের ডানদিকে থাকা 'Save'- এ ক্লিক করুন এবং তারপর 'Activate'-এ ক্লিক করুন।
নমুনা অ্যাপটির জন্য সাবস্ক্রিপশন তৈরি করুন
এই কোডল্যাবের উদ্দেশ্যে, নিম্নলিখিত কনফিগারেশন সহ আরও দুটি সাবস্ক্রিপশন তৈরি করুন:
- বেসিক প্ল্যান
- পণ্যের আইডি: বেসিক_প্ল্যান
- নাম: বেসিক প্ল্যান
- বেস প্ল্যান আইডি: মাসিক-স্বয়ংক্রিয়ভাবে-নবায়নযোগ্য
- দাম: $৫
- লাইট প্ল্যান
- পণ্যের আইডি: lite_plan
- নাম: লাইট প্ল্যান
- বেস প্ল্যান আইডি: মাসিক-স্বয়ংক্রিয়ভাবে-নবায়নযোগ্য
- দাম: $৩
স্যাম্পল অ্যাপটি এই প্রোডাক্ট আইডি এবং বেস প্ল্যান আইডিগুলো ব্যবহার করার জন্য কনফিগার করা হয়েছে। আপনি ভিন্ন কনফিগারেশন সহ বিভিন্ন সাবস্ক্রিপশন তৈরি করতে পারেন, সেক্ষেত্রে আপনার তৈরি করা প্রোডাক্ট আইডিটি ব্যবহার করার জন্য স্যাম্পল অ্যাপটি পরিবর্তন করতে হবে।
সাবস্ক্রিপশন তৈরির ভিডিও
নিম্নলিখিত ভিডিওটিতে প্লে ডেভেলপার কনসোলে সাবস্ক্রিপশন তৈরি করার জন্য পূর্বে বর্ণিত ধাপগুলো দেখানো হয়েছে।
৪. সাবস্ক্রিপশন প্রতিস্থাপন
PBL-এর সাথে ইন্টিগ্রেট করা ডেভেলপাররা তাদের বিদ্যমান গ্রাহকদের চাহিদা আরও ভালোভাবে মেটানোর জন্য সাবস্ক্রিপশন প্ল্যান পরিবর্তনের বিভিন্ন বিকল্প প্রদান করতে পারেন:
- If you sell multiple subscription tiers, such as basic and premium subscriptions, you can allow users to switch tiers by purchasing a different subscription's base plan or offer.
- আপনি ব্যবহারকারীদের তাদের বর্তমান বিলিং সময়কাল পরিবর্তন করার অনুমতি দিতে পারেন, যেমন মাসিক প্ল্যান থেকে বার্ষিক প্ল্যানে পরিবর্তন করা।
- আপনি ব্যবহারকারীদের স্বয়ংক্রিয়ভাবে নবায়নযোগ্য এবং প্রিপেইড প্ল্যানের মধ্যে পরিবর্তন করার সুযোগও দিতে পারেন।
যখন ব্যবহারকারীরা তাদের সাবস্ক্রিপশন আপগ্রেড, ডাউনগ্রেড বা পরিবর্তন করার সিদ্ধান্ত নেন, তখন আপনি একটি প্রতিস্থাপন মোড নির্দিষ্ট করে দেন, যা নির্ধারণ করে যে বর্তমান বিলিং মেয়াদের আনুপাতিক মূল্য কীভাবে প্রয়োগ করা হবে এবং ব্যবহারকারীদের জন্য অধিকার পরিবর্তনটি কখন ঘটবে।
প্লে বিলিং লাইব্রেরি এই আচরণটি নিয়ন্ত্রণ করার জন্য বেশ কয়েকটি ReplacementMode অপশন প্রদান করে।
উপলব্ধ প্রতিস্থাপন মোড
-
WITH_TIME_PRORATION: সাবস্ক্রিপশন আইটেমটি তাৎক্ষণিকভাবে আপগ্রেড বা ডাউনগ্রেড করা হয়। অবশিষ্ট সময় মূল্যের পার্থক্যের উপর ভিত্তি করে সমন্বয় করা হয় এবং পরবর্তী বিলিং তারিখ আপডেট করার মাধ্যমে নতুন সাবস্ক্রিপশনের জন্য জমা করা হয়। এটিই ডিফল্ট আচরণ । -
CHARGE_PRORATED_PRICE): সাবস্ক্রিপশন আইটেমটি অবিলম্বে আপগ্রেড করা হয় এবং বিলিং চক্র একই থাকে। এরপর অবশিষ্ট সময়ের জন্য মূল্যের পার্থক্য ব্যবহারকারীর কাছ থেকে চার্জ করা হয়। -
CHARGE_FULL_PRICE: সাবস্ক্রিপশন আইটেমটি অবিলম্বে আপগ্রেড বা ডাউনগ্রেড করা হয় এবং এই নতুন সুবিধার জন্য ব্যবহারকারীর কাছ থেকে সাথে সাথেই সম্পূর্ণ মূল্য চার্জ করা হয়। পূর্ববর্তী সাবস্ক্রিপশনের অবশিষ্ট মূল্য হয় একই সুবিধার জন্য স্থানান্তরিত হয়, অথবা ভিন্ন সুবিধায় পরিবর্তন করার সময় সময়ের অনুপাতে গণনা করা হয়। -
WITHOUT_PRORATION: সাবস্ক্রিপশন আইটেমটি তাৎক্ষণিকভাবে আপগ্রেড বা ডাউনগ্রেড করা হয় এবং সাবস্ক্রিপশন নবায়নের সময় নতুন মূল্য ধার্য করা হয়। বিলিং চক্র অপরিবর্তিত থাকে। -
DEFERRED: সাবস্ক্রিপশন আইটেমটি শুধুমাত্র সাবস্ক্রিপশন নবায়নের সময়ই আপগ্রেড বা ডাউনগ্রেড করা হয়।
৫. সময়ভিত্তিক আনুপাতিক বন্টন
এই প্রতিস্থাপন মোডে, সাবস্ক্রিপশন আইটেমটি তাৎক্ষণিকভাবে আপগ্রেড বা ডাউনগ্রেড করা হয়। অবশিষ্ট সময় মূল্যের পার্থক্যের উপর ভিত্তি করে সমন্বয় করা হয় এবং পরবর্তী বিলিং তারিখ এগিয়ে দিয়ে নতুন সাবস্ক্রিপশনে জমা করা হয়। এটিই ডিফল্ট আচরণ।
উদাহরণ দৃশ্যকল্প
একজন ব্যবহারকারী এপ্রিলের ১৫ তারিখে বেসিক প্ল্যান (প্রতি মাসে $৪.৯৯) থেকে প্রিমিয়াম প্ল্যানে (প্রতি মাসে $৯.৯৯) পরিবর্তন করেন, যা তার মাসিক বিলিং চক্রের মাঝামাঝি সময়।
এই পরিস্থিতিতে:
- ব্যবহারকারী অবিলম্বে প্রিমিয়াম প্ল্যানটিতে অ্যাক্সেস পেয়ে যান।
- গুগল প্লে স্বয়ংক্রিয়ভাবে আনুপাতিক সময়কাল গণনা করে। ধরা যাক, যদি প্লে গণনা করে যে বেসিক প্ল্যানের অবশিষ্ট ১৫ দিন প্রিমিয়াম প্ল্যানের ৭ দিনের সমান, তাহলে পরবর্তী বিলিং তারিখ এগিয়ে এনে ২১শে এপ্রিল করা হয়।
- ব্যবহারকারীকে তাৎক্ষণিক কোনো অর্থ প্রদান করতে হবে না।
কোড স্নিপেট
// ProductDetails for the plan to be switched to
ProductDetails productDetails = ...;
// The specific offer token for the toBeSwitched plan's base plan
String offerToken = "...";
// The purchase token of the user's current subscription
String oldPurchaseToken = "...";
// The productId for the user's current subscription
String oldProductId = "...";
// The replacementMode to replace the user's subscription
int replacementMode = SubscriptionProductReplacementParams.ReplacementMode.WITH_TIME_PRORATION;
SubscriptionProductReplacementParams subscriptionProductReplacementParams =
SubscriptionProductReplacementParams.newBuilder()
.setOldProductId(oldProductId)
.setReplacementMode(replacementMode)
.build();
ProductDetailsParams productDetailsParams =
ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.setSubscriptionProductReplacementParams(subscriptionProductReplacementParams)
.setOfferToken(offerToken)
.build();
List<ProductDetailsParams> productDetailsParamsList = ImmutableList.of(productDetailsParams);
BillingFlowParams billingFlowParams =
BillingFlowParams.newBuilder()
.setProductDetailsParamsList(productDetailsParamsList)
.setSubscriptionUpdateParams(
SubscriptionUpdateParams.newBuilder().setOldPurchaseToken(oldPurchaseToken).build())
.build();
billingClient.launchBillingFlow(activity, billingFlowParams);
WITH_TIME_PRORATION দিয়ে আপগ্রেড করুন
এই পরিস্থিতিটি অনুকরণ করতে:
- স্যাম্পল অ্যাপের
MainActivityতে, কোড স্নিপেটেreplacementModeকেSubscriptionProductReplacementParams.ReplacementMode.WITH_TIME_PRORATIONএ আপডেট করুন। - অ্যাপ্লিকেশনটি পুনর্নির্মাণ করে চালু করুন।
- গুগল প্লে স্টোর থেকে বিদ্যমান সাবস্ক্রিপশন (যদি থাকে) বাতিল করুন এবং এর মেয়াদ শেষ হয়ে যাবে।
- বেসিক প্ল্যানটি কিনুন।
- প্রিমিয়াম প্ল্যানে পরিবর্তন করুন।
ব্যবহারকারীর প্ল্যানটি অবিলম্বে প্রিমিয়াম প্ল্যানে আপগ্রেড করা হয়েছে। ব্যবহারকারীকে তাৎক্ষণিকভাবে $0.00 পরিশোধ করতে হবে। বেসিক প্ল্যানের অবশিষ্ট মূল্য প্রিমিয়াম প্ল্যানের জন্য আনুপাতিক হারে সমন্বয় করা হবে, যার ফলে পরবর্তী নবায়নের তারিখ এগিয়ে আসবে। নতুন সমন্বয়কৃত বিলিং তারিখে ব্যবহারকারীর কাছ থেকে $9.99 নবায়ন ফি চার্জ করা হবে।
WITH_TIME_PRORATION ব্যবহার করে ডাউনগ্রেড করুন
এই পরিস্থিতিটি অনুকরণ করতে:
- স্যাম্পল অ্যাপের
MainActivityতে, কোড স্নিপেটেreplacementModeকেSubscriptionProductReplacementParams.ReplacementMode.WITH_TIME_PRORATIONএ আপডেট করুন। - অ্যাপ্লিকেশনটি পুনর্নির্মাণ করে চালু করুন।
- গুগল প্লে স্টোর থেকে বিদ্যমান সাবস্ক্রিপশন (যদি থাকে) বাতিল করুন এবং এর মেয়াদ শেষ হয়ে যাবে।
- বেসিক প্ল্যানটি কিনুন।
- লাইট প্ল্যানে পরিবর্তন করুন।
ব্যবহারকারীর সুবিধাটি অবিলম্বে লাইট প্ল্যানে অবনমিত করা হয়েছে। অবিলম্বে প্রদেয় অর্থের পরিমাণ হলো $0.00। বেসিক প্ল্যানের অবশিষ্ট মূল্য লাইট প্ল্যানের জন্য আনুপাতিক হারে সমন্বয় করা হয়েছে, যা পরবর্তী নবায়নের তারিখকে উল্লেখযোগ্যভাবে বাড়িয়ে দেয়। নতুনভাবে সমন্বয়কৃত বিলিং তারিখে ব্যবহারকারীর কাছ থেকে $2.99 নবায়ন ফি চার্জ করা হবে।
উপসংহার
এই অংশে আপনি শিখেছেন, কীভাবে WITH_TIME_PRORATION মূল্যের পার্থক্যের উপর ভিত্তি করে পরবর্তী নবায়নের সময় সমন্বয় করার মাধ্যমে তাৎক্ষণিক কোনো চার্জ ছাড়াই ব্যবহারকারীর প্রাপ্য সুবিধা পরিবর্তন করে। ব্যবহারকারীদের আপগ্রেড বা ডাউনগ্রেড করার জন্য এটি একটি কার্যকর ডিফল্ট কৌশল।
৬. আনুপাতিক হারে ধার্যকৃত মূল্য
এই প্রতিস্থাপন মোডে, সাবস্ক্রিপশন আইটেমটি তাৎক্ষণিকভাবে আপগ্রেড করা হয় এবং বিলিং চক্র একই থাকে। এরপর অবশিষ্ট সময়ের জন্য মূল্যের পার্থক্যটুকু ব্যবহারকারীর কাছ থেকে চার্জ করা হয়।
দ্রষ্টব্য: এই বিকল্পটি শুধুমাত্র সাবস্ক্রিপশন আইটেম আপগ্রেডের ক্ষেত্রে উপলব্ধ, যেখানে প্রতি ইউনিট সময়ের মূল্য বৃদ্ধি পায়।
উদাহরণ দৃশ্যকল্প
বেসিক প্ল্যানের (প্রতি মাসে $৪.৯৯) একজন ব্যবহারকারী তার মাসিক বিলিং চক্র শেষ হতে প্রায় ১০ দিন বাকি থাকতেই ২০শে এপ্রিল প্রিমিয়াম প্ল্যানে (প্রতি মাসে $৯.৯৯) আপগ্রেড করার সিদ্ধান্ত নেন।
এই পরিস্থিতিতে:
- ব্যবহারকারী অবিলম্বে প্রিমিয়াম প্ল্যানটিতে অ্যাক্সেস পেয়ে যান।
- বর্তমান বিলিং চক্রের অবশিষ্ট ১০ দিনের জন্য ব্যবহারকারীর কাছ থেকে আনুপাতিক হারে অতিরিক্ত অর্থ অবিলম্বে চার্জ করা হয়। এর পরিমাণ প্রায় ২.৯৯ ডলার, যা প্রিমিয়াম প্ল্যানের ১০ দিনের মূল্যের প্রতিনিধিত্ব করে।
- ব্যবহারকারীর বিলিং তারিখ পরিবর্তন হয় না।
কোড স্নিপেট
// ProductDetails for the plan to be switched to
ProductDetails productDetails = ...;
// The specific offer token for the toBeSwitched plan's base plan
String offerToken = "...";
// The purchase token of the user's current subscription
String oldPurchaseToken = "...";
// The productId for the user's current subscription
String oldProductId = "...";
// The replacementMode to replace the user's subscription
int replacementMode = SubscriptionProductReplacementParams.ReplacementMode.CHARGE_PRORATED_PRICE;
SubscriptionProductReplacementParams subscriptionProductReplacementParams =
SubscriptionProductReplacementParams.newBuilder()
.setOldProductId(oldProductId)
.setReplacementMode(replacementMode)
.build();
ProductDetailsParams productDetailsParams =
ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.setSubscriptionProductReplacementParams(subscriptionProductReplacementParams)
.setOfferToken(offerToken)
.build();
List<ProductDetailsParams> productDetailsParamsList = ImmutableList.of(productDetailsParams);
BillingFlowParams billingFlowParams =
BillingFlowParams.newBuilder()
.setProductDetailsParamsList(productDetailsParamsList)
.setSubscriptionUpdateParams(
SubscriptionUpdateParams.newBuilder().setOldPurchaseToken(oldPurchaseToken).build())
.build();
billingClient.launchBillingFlow(activity, billingFlowParams);
আনুপাতিক মূল্যে আপগ্রেড করুন
এই পরিস্থিতিটি অনুকরণ করতে:
- স্যাম্পল অ্যাপের
MainActivityতে, কোড স্নিপেটেreplacementModeSubscriptionProductReplacementParams.ReplacementMode.CHARGE_PRORATED_PRICEএ আপডেট করুন। - অ্যাপ্লিকেশনটি পুনর্নির্মাণ করে চালু করুন।
- গুগল প্লে স্টোর থেকে বিদ্যমান সাবস্ক্রিপশন (যদি থাকে) বাতিল করুন এবং এর মেয়াদ শেষ হয়ে যাবে।
- বেসিক প্ল্যানটি কিনুন।
- প্রিমিয়াম প্ল্যানে পরিবর্তন করুন।
ব্যবহারকারীকে তার মূল নবায়নের তারিখ অপরিবর্তিত রেখে অবিলম্বে প্রিমিয়াম প্ল্যানে আপগ্রেড করা হয়। বর্তমান চক্রের অবশিষ্ট দিনগুলোর জন্য প্রিমিয়াম এবং বেসিক প্ল্যানের মূল্যের আনুপাতিক পার্থক্যই হলো অবিলম্বে প্রদেয় অর্থ। নবায়নের তারিখে, ব্যবহারকারীর কাছ থেকে প্রিমিয়াম নবায়নের সম্পূর্ণ ফি $৯.৯৯ চার্জ করা হবে।
CHARGE_PRORATED_PRICE দিয়ে ডাউনগ্রেড করুন
এই পরিস্থিতিটি অনুকরণ করতে:
- স্যাম্পল অ্যাপের
MainActivityতে, কোড স্নিপেটেreplacementModeSubscriptionProductReplacementParams.ReplacementMode.CHARGE_PRORATED_PRICEএ আপডেট করুন। - অ্যাপ্লিকেশনটি পুনর্নির্মাণ করে চালু করুন।
- গুগল প্লে স্টোর থেকে বিদ্যমান সাবস্ক্রিপশন (যদি থাকে) বাতিল করুন এবং এর মেয়াদ শেষ হয়ে যাবে।
- বেসিক প্ল্যানটি কিনুন।
- লাইট প্ল্যানে পরিবর্তন করুন।
এই রিপ্লেসমেন্ট মোডটি ডাউনগ্রেডের সময় একটি ত্রুটির কারণ হয়, কারণ এটি শুধুমাত্র সেইসব সাবস্ক্রিপশন আইটেম আপগ্রেডের জন্য উপলব্ধ যেখানে প্রতি ইউনিট সময়ের মূল্য বৃদ্ধি পায়। বিলিং প্রক্রিয়াটি ব্যর্থ হবে এবং ব্যবহারকারীকে একটি ত্রুটি প্রদর্শন করবে, যেখানে বলা থাকবে যে ডাউনগ্রেডের জন্য প্রোরেশন মোড সমর্থিত নয়।
উপসংহার
এই অংশে ব্যাখ্যা করা হয়েছে কিভাবে CHARGE_PRORATED_PRICE বিলিং চক্র অক্ষুণ্ণ রেখে, অবশিষ্ট বিলিং মেয়াদের জন্য ব্যবহারকারীদের কাছ থেকে মূল্যের সঠিক পার্থক্যটুকু চার্জ করে তাৎক্ষণিক আপগ্রেডের সুযোগ দেয়। এটি তখন উপযোগী হয় যখন ব্যবহারকারীরা তাদের বিলিং তারিখ পরিবর্তন না করে আরও ব্যয়বহুল কোনো টায়ারে আপগ্রেড করতে চান।
৭. সম্পূর্ণ মূল্য ধার্য করুন
এই প্রতিস্থাপন মোডে, সাবস্ক্রিপশন আইটেমটি তাৎক্ষণিকভাবে আপগ্রেড বা ডাউনগ্রেড করা হয় এবং নতুন এনটাইটেলমেন্টের জন্য ব্যবহারকারীর কাছ থেকে সাথে সাথেই সম্পূর্ণ মূল্য চার্জ করা হয়। পূর্ববর্তী সাবস্ক্রিপশনের অবশিষ্ট ভ্যালু হয় একই এনটাইটেলমেন্টের জন্য স্থানান্তরিত হয়, অথবা ভিন্ন এনটাইটেলমেন্টে পরিবর্তন করার সময় সময়ের অনুপাতে সমন্বয় করা হয়।
উদাহরণ দৃশ্যকল্প
একজন ব্যবহারকারী বেসিক প্ল্যানে (১লা এপ্রিল থেকে প্রতি মাসে ৪.৯৯ ডলার) আছেন। ২০শে এপ্রিল, তিনি প্রিমিয়াম প্ল্যানে (প্রতি মাসে ৯.৯৯ ডলার) পরিবর্তন করতে চান।
এই পরিস্থিতিতে:
- ব্যবহারকারীর কাছ থেকে প্রিমিয়াম প্ল্যানের সম্পূর্ণ মূল্য ($9.99) তাৎক্ষণিকভাবে কেটে নেওয়া হয়।
- বেসিক প্ল্যানের অবশিষ্ট সময় (যেমন, ১০ দিনের পরিমাণ) প্রিমিয়াম প্ল্যানের সমতুল্য সময়ে রূপান্তরিত করা হয়। এই উদাহরণে, ১০ দিনের বেসিক প্ল্যান ৫ দিনের প্রিমিয়াম প্ল্যানের সমতুল্য।
- ব্যবহারকারীর পরবর্তী নবায়নের তারিখটি এই আনুপাতিক সময় অন্তর্ভুক্ত করে সমন্বয় করা হয়। ফলে, নবায়নের তারিখটি হয় ২৫শে মে (২০শে এপ্রিল + ১ মাস + ৫ দিন)।
- ২৫শে মে থেকে পরবর্তী নবায়নগুলো মাসিক ভিত্তিতে করা হবে।
কোড স্নিপেট
// ProductDetails for the plan to be switched to
ProductDetails productDetails = ...;
// The specific offer token for the toBeSwitched plan's base plan
String offerToken = "...";
// The purchase token of the user's current subscription
String oldPurchaseToken = "...";
// The productId for the user's current subscription
String oldProductId = "...";
// The replacementMode to replace the user's subscription
int replacementMode = SubscriptionProductReplacementParams.ReplacementMode.CHARGE_FULL_PRICE;
SubscriptionProductReplacementParams subscriptionProductReplacementParams =
SubscriptionProductReplacementParams.newBuilder()
.setOldProductId(oldProductId)
.setReplacementMode(replacementMode)
.build();
ProductDetailsParams productDetailsParams =
ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.setSubscriptionProductReplacementParams(subscriptionProductReplacementParams)
.setOfferToken(offerToken)
.build();
List<ProductDetailsParams> productDetailsParamsList = ImmutableList.of(productDetailsParams);
BillingFlowParams billingFlowParams =
BillingFlowParams.newBuilder()
.setProductDetailsParamsList(productDetailsParamsList)
.setSubscriptionUpdateParams(
SubscriptionUpdateParams.newBuilder().setOldPurchaseToken(oldPurchaseToken).build())
.build();
billingClient.launchBillingFlow(activity, billingFlowParams);
সম্পূর্ণ মূল্যে আপগ্রেড করুন
এই পরিস্থিতিটি অনুকরণ করতে:
- স্যাম্পল অ্যাপের
MainActivityতে, কোড স্নিপেটেreplacementModeকেSubscriptionProductReplacementParams.ReplacementMode.CHARGE_FULL_PRICEএ আপডেট করুন। - অ্যাপ্লিকেশনটি পুনর্নির্মাণ করে চালু করুন।
- গুগল প্লে স্টোর থেকে বিদ্যমান সাবস্ক্রিপশন (যদি থাকে) বাতিল করুন এবং এর মেয়াদ শেষ হয়ে যাবে।
- বেসিক প্ল্যানটি কিনুন।
- প্রিমিয়াম প্ল্যানে পরিবর্তন করুন।
ব্যবহারকারীকে অবিলম্বে প্রিমিয়াম প্ল্যানে আপগ্রেড করা হয়। অবিলম্বে প্রদেয় অর্থ হলো প্রিমিয়াম প্ল্যানের সম্পূর্ণ মূল্য - $৯.৯৯। বেসিক প্ল্যানের যেকোনো অবশিষ্ট ভ্যালু নতুন প্রিমিয়াম প্ল্যানের মেয়াদে রূপান্তরিত হয়, যা প্রথম নবায়নের তারিখকে সামান্য বাড়িয়ে দেয়। এরপর, প্রতি চক্রে নবায়নের পরিমাণ হবে $৯.৯৯।
সম্পূর্ণ মূল্য চার্জ করে ডাউনগ্রেড করুন
এই পরিস্থিতিটি অনুকরণ করতে:
- স্যাম্পল অ্যাপের
MainActivityতে, কোড স্নিপেটেreplacementModeকেSubscriptionProductReplacementParams.ReplacementMode.CHARGE_FULL_PRICEএ আপডেট করুন। - অ্যাপ্লিকেশনটি পুনর্নির্মাণ করে চালু করুন।
- গুগল প্লে স্টোর থেকে বিদ্যমান সাবস্ক্রিপশন (যদি থাকে) বাতিল করুন এবং এর মেয়াদ শেষ হয়ে যাবে।
- বেসিক প্ল্যানটি কিনুন।
- লাইট প্ল্যানে পরিবর্তন করুন।
ব্যবহারকারীকে অবিলম্বে লাইট প্ল্যানে ডাউনগ্রেড করা হয় এবং একটি নতুন বিলিং চক্র শুরু হয়। অবিলম্বে প্রদেয় অর্থের পরিমাণ হলো $২.৯৯-এর সম্পূর্ণ টার্গেট প্রাইস। বেসিক প্ল্যানের অব্যবহৃত অংশ নতুন লাইট প্ল্যানের জন্য আনুপাতিক হারে সমন্বয় করা হয়, যা প্রথম নবায়নের তারিখ বাড়িয়ে দেয়। এরপর থেকে, প্রতি চক্রে নবায়নের পরিমাণ হবে $২.৯৯।
উপসংহার
এই অংশে আমরা আলোচনা করেছি যে, কীভাবে CHARGE_FULL_PRICE প্ল্যান পরিবর্তনের দিনেই ব্যবহারকারীর কাছ থেকে সম্পূর্ণ অর্থ চার্জ করে এবং সাথে সাথেই একটি নতুন বিলিং চক্র শুরু হয়ে যায়। পূর্ববর্তী প্ল্যান থেকে কোনো অবশিষ্ট ব্যালেন্স থাকলে তা ক্রমানুসারে পরবর্তী নবায়নের তারিখ পর্যন্ত প্রযোজ্য হয়।
৮. আনুপাতিক বন্টন ছাড়া
এই প্রতিস্থাপন মোডে, সাবস্ক্রিপশন আইটেমটি তাৎক্ষণিকভাবে আপগ্রেড বা ডাউনগ্রেড করা হয় এবং সাবস্ক্রিপশন নবায়নের সময় নতুন মূল্য ধার্য করা হয়।
উদাহরণ দৃশ্যকল্প
একজন ব্যবহারকারী বেসিক প্ল্যানে (১লা এপ্রিল থেকে প্রতি মাসে ৪.৯৯ ডলার) আছেন। ২০শে এপ্রিল, তিনি প্রিমিয়াম প্ল্যানে (প্রতি মাসে ৯.৯৯ ডলার) পরিবর্তন করতে চান।
এই পরিস্থিতিতে:
- ব্যবহারকারী অবিলম্বে প্রিমিয়াম প্ল্যানটিতে অ্যাক্সেস পেয়ে যান।
- ব্যবহারকারীকে পরবর্তী সাবস্ক্রিপশন নবায়নের তারিখ (১লা মে) পর্যন্ত বর্ধিত ৯.৯৯ ডলার মূল্য পরিশোধ করতে হবে না।
কোড স্নিপেট
// ProductDetails for the plan to be switched to
ProductDetails productDetails = ...;
// The specific offer token for the toBeSwitched plan's base plan
String offerToken = "...";
// The purchase token of the user's current subscription
String oldPurchaseToken = "...";
// The productId for the user's current subscription
String oldProductId = "...";
// The replacementMode to replace the user's subscription
int replacementMode = SubscriptionProductReplacementParams.ReplacementMode.WITHOUT_PRORATION;
SubscriptionProductReplacementParams subscriptionProductReplacementParams =
SubscriptionProductReplacementParams.newBuilder()
.setOldProductId(oldProductId)
.setReplacementMode(replacementMode)
.build();
ProductDetailsParams productDetailsParams =
ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.setSubscriptionProductReplacementParams(subscriptionProductReplacementParams)
.setOfferToken(offerToken)
.build();
List<ProductDetailsParams> productDetailsParamsList = ImmutableList.of(productDetailsParams);
BillingFlowParams billingFlowParams =
BillingFlowParams.newBuilder()
.setProductDetailsParamsList(productDetailsParamsList)
.setSubscriptionUpdateParams(
SubscriptionUpdateParams.newBuilder().setOldPurchaseToken(oldPurchaseToken).build())
.build();
billingClient.launchBillingFlow(activity, billingFlowParams);
WITHOUT_PRORATION দিয়ে আপগ্রেড করুন
এই পরিস্থিতিটি অনুকরণ করতে:
- স্যাম্পল অ্যাপের
MainActivityতে, কোড স্নিপেটেreplacementModeকেSubscriptionProductReplacementParams.ReplacementMode.WITHOUT_PRORATIONএ আপডেট করুন। - অ্যাপ্লিকেশনটি পুনর্নির্মাণ করে চালু করুন।
- গুগল প্লে স্টোর থেকে বিদ্যমান সাবস্ক্রিপশন (যদি থাকে) বাতিল করুন এবং এর মেয়াদ শেষ হয়ে যাবে।
- বেসিক প্ল্যানটি কিনুন।
- প্রিমিয়াম প্ল্যানে পরিবর্তন করুন।
ব্যবহারকারীকে তার বিদ্যমান নবায়নের তারিখ অপরিবর্তিত রেখে অবিলম্বে প্রিমিয়াম প্ল্যানে আপগ্রেড করা হয়। তাৎক্ষণিকভাবে প্রদেয় অর্থের পরিমাণ হলো $0.00। পরবর্তী বিলিং তারিখে $9.99-এর নতুন নবায়ন মূল্যে পরিবর্তিত হওয়ার আগে, ব্যবহারকারী প্রদত্ত চক্রের অবশিষ্ট সময়ের জন্য প্রিমিয়াম প্ল্যানটি ব্যবহার করতে পারবেন।
WITHOUT_PRORATION সহ ডাউনগ্রেড করুন
এই পরিস্থিতিটি অনুকরণ করতে:
- স্যাম্পল অ্যাপের
MainActivityতে, কোড স্নিপেটেreplacementModeকেSubscriptionProductReplacementParams.ReplacementMode.WITHOUT_PRORATIONএ আপডেট করুন। - অ্যাপ্লিকেশনটি পুনর্নির্মাণ করে চালু করুন।
- গুগল প্লে স্টোর থেকে বিদ্যমান সাবস্ক্রিপশন (যদি থাকে) বাতিল করুন এবং এর মেয়াদ শেষ হয়ে যাবে।
- বেসিক প্ল্যানটি কিনুন।
- লাইট প্ল্যানে পরিবর্তন করুন।
ব্যবহারকারীকে অবিলম্বে লাইট প্ল্যানে ডাউনগ্রেড করা হবে এবং তিনি যে বেসিক ফিচারগুলোর জন্য অর্থ প্রদান করেছিলেন, সেগুলো হারাবেন। তাৎক্ষণিকভাবে প্রদেয় অর্থের পরিমাণ হলো $0.00। বিলিং চক্র অপরিবর্তিত থাকবে এবং ব্যবহারকারী তার পরবর্তী নির্ধারিত নবায়নের সময় নতুন, কম হার $2.99 প্রদান করবেন।
উপসংহার
এই অংশে দেখানো হয়েছে কিভাবে WITHOUT_PRORATION চেকআউট চার্জ ছাড়াই ব্যবহারকারীর প্রাপ্য সুবিধাগুলো তাৎক্ষণিকভাবে অদলবদল করে এবং বিলিং চক্রকে অপরিবর্তিত রাখে।
৯. স্থগিত
এই প্রতিস্থাপন মোডে, সাবস্ক্রিপশন আইটেমটি শুধুমাত্র সাবস্ক্রিপশন নবায়নের সময় আপগ্রেড বা ডাউনগ্রেড করা হয়, কিন্তু নতুন ক্রয়টি তাৎক্ষণিকভাবে কার্যকর হয়। বিদ্যমান আইটেমটিকে অনবায়নযোগ্য হিসেবে সেট করা হয় এবং এটি বর্তমান বিলিং চক্রের শেষে মেয়াদোত্তীর্ণ হয়ে যায়, অপরদিকে নতুন অনুরোধ করা অধিকারটি ঠিক তার পরেই শুরু হয়।
উদাহরণ দৃশ্যকল্প
একজন ব্যবহারকারী বেসিক প্ল্যানে (১লা এপ্রিল থেকে প্রতি মাসে ৪.৯৯ ডলার) আছেন। ২০শে এপ্রিল, তিনি প্রিমিয়াম প্ল্যানে (প্রতি মাসে ৯.৯৯ ডলার) পরিবর্তন করতে চান।
এই পরিস্থিতিতে:
- এর জন্য ব্যবহারকারীকে তাৎক্ষণিকভাবে কোনো চার্জ দিতে হয় না।
- ব্যবহারকারী বর্তমান বিলিং চক্রের শেষ পর্যন্ত (৩০শে এপ্রিল) মৌলিক সুবিধাগুলো পেতে থাকবেন।
- পরবর্তী নবায়নের তারিখে (১লা মে) সাবস্ক্রিপশন প্ল্যানটি স্বয়ংক্রিয়ভাবে প্রিমিয়ামে আপগ্রেড হয়ে যাবে।
কোড স্নিপেট
// ProductDetails for the plan to be switched to
ProductDetails productDetails = ...;
// The specific offer token for the toBeSwitched plan's base plan
String offerToken = "...";
// The purchase token of the user's current subscription
String oldPurchaseToken = "...";
// The productId for the user's current subscription
String oldProductId = "...";
// The replacementMode to replace the user's subscription
int replacementMode = SubscriptionProductReplacementParams.ReplacementMode.DEFERRED;
SubscriptionProductReplacementParams subscriptionProductReplacementParams =
SubscriptionProductReplacementParams.newBuilder()
.setOldProductId(oldProductId)
.setReplacementMode(replacementMode)
.build();
ProductDetailsParams productDetailsParams =
ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.setSubscriptionProductReplacementParams(subscriptionProductReplacementParams)
.setOfferToken(offerToken)
.build();
List<ProductDetailsParams> productDetailsParamsList = ImmutableList.of(productDetailsParams);
BillingFlowParams billingFlowParams =
BillingFlowParams.newBuilder()
.setProductDetailsParamsList(productDetailsParamsList)
.setSubscriptionUpdateParams(
SubscriptionUpdateParams.newBuilder().setOldPurchaseToken(oldPurchaseToken).build())
.build();
billingClient.launchBillingFlow(activity, billingFlowParams);
স্থগিত সহ আপগ্রেড করুন
এই পরিস্থিতিটি অনুকরণ করতে:
- স্যাম্পল অ্যাপের
MainActivityতে, কোড স্নিপেটেreplacementModeSubscriptionProductReplacementParams.ReplacementMode.DEFERREDএ আপডেট করুন। - অ্যাপ্লিকেশনটি পুনর্নির্মাণ করে চালু করুন।
- গুগল প্লে স্টোর থেকে বিদ্যমান সাবস্ক্রিপশন (যদি থাকে) বাতিল করুন এবং এর মেয়াদ শেষ হয়ে যাবে।
- বেসিক প্ল্যানটি কিনুন।
- প্রিমিয়াম প্ল্যানে পরিবর্তন করুন।
ব্যবহারকারী তার বর্তমান বিলিং চক্রের শেষ পর্যন্ত বেসিক প্ল্যানেই থাকবেন। তাৎক্ষণিকভাবে প্রদেয় অর্থের পরিমাণ হলো $0.00। নবায়নের তারিখে, তার প্ল্যানটি প্রিমিয়াম প্ল্যানে আপগ্রেড হবে এবং তাকে নতুন নবায়ন ফি বাবদ $9.99 চার্জ করা হবে।
স্থগিত সহ অবনমন
এই পরিস্থিতিটি অনুকরণ করতে:
- স্যাম্পল অ্যাপের
MainActivityতে, কোড স্নিপেটেreplacementModeSubscriptionProductReplacementParams.ReplacementMode.DEFERREDএ আপডেট করুন। - অ্যাপ্লিকেশনটি পুনর্নির্মাণ করে চালু করুন।
- গুগল প্লে স্টোর থেকে বিদ্যমান সাবস্ক্রিপশন (যদি থাকে) বাতিল করুন এবং এর মেয়াদ শেষ হয়ে যাবে।
- বেসিক প্ল্যানটি কিনুন।
- লাইট প্ল্যানে পরিবর্তন করুন।
ব্যবহারকারী তার বর্তমান বিলিং চক্রের শেষ পর্যন্ত বেসিক প্ল্যানেই থাকবেন। তাৎক্ষণিকভাবে প্রদেয় অর্থের পরিমাণ হলো $0.00। নবায়নের তারিখে, তার প্ল্যানটি লাইট প্ল্যানে আপগ্রেড হবে এবং তাকে নতুন নবায়ন ফি বাবদ $2.99 চার্জ করা হবে।
উপসংহার
এই অংশে ব্যাখ্যা করা হয়েছে কিভাবে DEFERRED রিপ্লেসমেন্ট মোড একজন সক্রিয় ব্যবহারকারীর পরিশোধিত মেয়াদ শেষ না হওয়া পর্যন্ত আপগ্রেড বা ডাউনগ্রেড স্থগিত রাখে। এর ফলে, ইতিমধ্যে কেনা ফিচারগুলো হারিয়ে যাওয়া রোধ করতে ডাউনগ্রেডের জন্য এটি বিশেষভাবে আদর্শ।
১০. ব্যাকএন্ড এবং ক্লায়েন্ট-সাইড প্রসেসিং
কোনো ব্যবহারকারী সফলভাবে সাবস্ক্রিপশন প্রতিস্থাপন করার পর, পরিষেবা বিঘ্নিত হওয়া বা ডাবল-বিলিংয়ের মতো সমস্যা এড়াতে আপনার অ্যাপ এবং ব্যাকএন্ড উভয়ই যেন পরিবর্তনটি সঠিকভাবে পরিচালনা করে, তা নিশ্চিত করুন।
উদাহরণ দৃশ্যকল্প
- ব্যবহারকারীর একটি বেসিক মাসিক প্ল্যান আছে (product_id
basic_planএবং purchase_tokenbasic_purchase_token_123)। - ব্যবহারকারী তাৎক্ষণিক প্রতিস্থাপন মোড (
WITHOUT_PRORATION,WITH_TIME_PRORATION,CHARGE_PRORATED_PRICE,CHARGE_FULL_PRICEএর মধ্যে যেকোনো একটি) ব্যবহার করে একটি প্রিমিয়াম প্ল্যানে পরিবর্তন করেন। - সাবস্ক্রিপশন পরিবর্তন সফল হলে, গুগল এটিকে একটি নতুন সাবস্ক্রিপশন হিসেবে গণ্য করে এবং প্রিমিয়াম প্ল্যানের জন্য একটি নতুন ও ভিন্ন পারচেজ টোকেন তৈরি করে (product_id
premium_planএবং purchase_tokenpremium_purchase_token_123)।
ক্লায়েন্ট-সাইড প্রসেসিং
onPurchasesUpdated
যখন প্রতিস্থাপন ক্রয়টি সম্পন্ন হয়, তখন PurchasesUpdatedListener সক্রিয় হয়। যদিও এটি একটি পরিবর্তন ছিল, গুগল প্লে প্রিমিয়াম প্ল্যানটিকে একটি সম্পূর্ণ নতুন ক্রয় হিসেবে গণ্য করে।
অ্যাপটি একটি Purchase অবজেক্ট পাবে, যাতে premium_purchase_token_123 পারচেজ টোকেন এবং product_id premium_plan থাকবে। আপনাকে এটিকে ঠিক একজন নতুন সাবস্ক্রাইবারের মতোই পরিচালনা করতে হবে: টোকেনটি যাচাই করুন এবং অ্যাক্সেস দেওয়ার জন্য প্রস্তুত হন।
@Override
public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
if (billingResult.getResponseCode() == BillingResponseCode.OK && purchases != null) {
for (Purchase purchase : purchases) {
// purchase.getPurchaseToken() = premium_purchase_token_123
// purchase.getProducts() will contain premium_plan
// Verify the purchase and grant entitlement
handleNewPurchase(purchase);
}
}
}
queryPurchasesAsync
queryPurchasesAsync শুধুমাত্র আপনার অ্যাপ থেকে কেনা সক্রিয় সাবস্ক্রিপশনগুলোই ফেরত দেয়। ব্যবহারকারীকে কোন এনটাইটেলমেন্টটি দেখানো হবে তা নির্ধারণ করতে আপনার এই পদ্ধতির উপর নির্ভর করা উচিত। তাৎক্ষণিক প্রতিস্থাপন হিসেবে, queryPurchasesAsync() পুরোনো BASIC পারচেজ টোকেন ফেরত দেওয়া বন্ধ করে দেবে এবং এখন থেকে শুধুমাত্র নতুন PREMIUM পারচেজ টোকেন ফেরত দেবে।
যখনই আপনার অ্যাপ পুনরায় চালু হবে বা কোনো কেনাকাটা সম্পন্ন হবে, এই মেথডটি কল করুন। যদি প্রিমিয়াম টোকেনটি উপস্থিত থাকে, তাহলে অবিলম্বে প্রিমিয়াম ফিচারগুলো প্রদান করুন এবং বেসিক ফিচারগুলো সরিয়ে দিন।
ব্যাকএন্ড প্রসেসিং (RTDN)
যখন কোনো প্রতিস্থাপন ঘটে, গুগল প্লে আপনার কনফিগার করা পাব/সাব টপিকে একটি রিয়েল-টাইম ডেভেলপার নোটিফিকেশন (RTDN) পাঠায়।
- তাৎক্ষণিক প্রতিস্থাপনের ক্ষেত্রে, গুগল নতুন ক্রয় টোকেন সহ একটি
SUBSCRIPTION_PURCHASEDRTDN পাঠায়। নমুনা RTDN পেলোড{ "version":"1.0", "packageName":"com.google.play.billing.samples.subscriptions", "eventTimeMillis":"...", "subscriptionNotification": { "version":"1.0", "notificationType":4, // SUBSCRIPTION_PURCHASED "purchaseToken":"premium_purchase_token_123" //purchase token for the new subscription } } - যখন আপনার সার্ভার RTDN থেকে নতুন পারচেজ টোকেনটি পাবে, তখন ক্রয়ের বিবরণ আনার জন্য নতুন পারচেজ টোকেনটি দিয়ে
purchases.subscriptionsV2API-টি কল করুন। API রেসপন্সে একটিlinkedPurchaseTokenফিল্ড থাকে, যা দিয়ে নির্ধারণ করা হয় যে পারচেজ টোকেনটি একটি নতুন সাবস্ক্রিপশন ক্রয়ের জন্য নাকি সাবস্ক্রিপশন প্রতিস্থাপনের জন্য। - সাবস্ক্রিপশন প্রতিস্থাপনের ক্ষেত্রে,
linkedPurchaseTokenবলতে পুরানো সাবস্ক্রিপশনের পারচেজ টোকেনকে বোঝায়। এই পরিস্থিতিতে এটি হবেbasic_purchase_token_123। নমুনাGET purchases.subscriptionsV2প্রতিক্রিয়াcurl \ 'https://androidpublisher.googleapis.com/androidpublisher/v3/applications/<application_id>/purchases/subscriptionsv2/tokens/premium_purchase_token_123' \ --header 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' \ --header 'Accept: application/json' { "kind": "androidpublisher#subscriptionPurchaseV2", "startTime": "...", "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE", "latestOrderId": "GPA.<order_id>", "linkedPurchaseToken": "basic_purchase_token_123", // The purchase token of the subscription that was replaced (Basic Plan in this case) "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED", "lineItems": [ { "productId": "premium_plan", // productID of the new subscription (Premium Plan in this case) "expiryTime": "....", "autoRenewingPlan": {...}, "offerDetails": { "basePlanId": "monthly-auto-renewing" // base plan ID of the new subscription }, "itemReplacement": { // Details about the subscription replacement "productId": "subscription_basic", // productID of the old subscription (Basic Plan in this case) "replacementMode": "CHARGE_PRORATED_PRICE", // Replacement strategy used for this subscription change "basePlanId": "monthly-auto-renewing" // base plan ID of the old subscription }, "offerPhase": {...} } ], "etag": "<etag_value>" } - আপনাকে অবশ্যই নতুন প্রিমিয়াম ক্রয়টি স্বীকার করতে হবে। এটি আপনার অ্যাপের মধ্যে অথবা আপনার ব্যাকএন্ডে করা যেতে পারে। ৩ দিনের মধ্যে ক্রয়টি স্বীকার করতে ব্যর্থ হলে অর্থ ফেরত দেওয়া হবে এবং আপনার অধিকার বাতিল করা হবে। ক্রয় প্রক্রিয়া এবং স্বীকার করার বিষয়ে আরও বিস্তারিত জানতে, ডেভেলপার ডকুমেন্টেশন দেখুন।
উপসংহার
This section covered the steps for handling immediate subscription replacements on both the client and your backend. You learned that Google Play treats the new plan as a brand new purchase, issuing a new purchase token. On the client, you must process this new purchase using the PurchasesUpdatedListener and update entitlements based on the response from queryPurchasesAsync . On the backend, you should listen for SUBSCRIPTION_PURCHASED RTDNs for the new token, use the purchases.subscriptionsv2 API to identify the linkedPurchaseToken of the old subscription, and promptly revoke access associated with the old token while granting the new entitlement. Remember to always acknowledge the new purchase.
১১. স্থগিত প্রতিস্থাপন প্রক্রিয়া
তাৎক্ষণিক প্রতিস্থাপন মোডের বিপরীতে, ReplacementMode.DEFERRED সাবস্ক্রিপশন পরিবর্তন এবং এনটাইটেলমেন্ট আপডেটকে বর্তমান বিলিং চক্রের শেষ পর্যন্ত স্থগিত রাখে। স্থগিত প্রতিস্থাপন পরিচালনার জন্য নির্দিষ্ট লজিকের প্রয়োজন হয়, যাতে ব্যবহারকারীরা সঠিক সময়ে যথাযথ এনটাইটেলমেন্ট পান।
উদাহরণ দৃশ্যকল্প
- ব্যবহারকারীর একটি বেসিক মাসিক প্ল্যান (product_id
basic_planএবং purchase_tokenbasic_purchase_token_123) আছে, যা ১৫ই এপ্রিল নবায়ন হবে । - ১লা এপ্রিল , ব্যবহারকারী
ReplacementMode.DEFERREDব্যবহার করে একটি প্রিমিয়াম প্ল্যানে পরিবর্তন করার সিদ্ধান্ত নেন। - গুগল প্রিমিয়াম প্ল্যানের জন্য (product_id
premium_planএবং purchase_tokenpremium_purchase_123) অবিলম্বে একটি নতুন পারচেজ টোকেন তৈরি করে, কিন্তু ব্যবহারকারীর কাছ থেকে চার্জ করা অর্থের পরিমাণ এবং এর প্রাপ্যতা ১৫ই এপ্রিলের জন্য নির্ধারিত রয়েছে।
প্রক্রিয়া স্থগিত প্রতিস্থাপন
১. ক্রয় প্রক্রিয়া সফল হওয়ার ঠিক পরেই (অ্যাপ)
- ক্রয় প্রক্রিয়া সম্পন্ন হওয়ার পর
PurchasesUpdatedListenerকল করা হয়। অ্যাপটি একটিPurchaseঅবজেক্ট পাবে, যাতে নতুন ক্রয় টোকেনpremium_purchase_token_123থাকবে। তবে, product_id-টি পুরোনোbasic_planকেই নির্দেশ করবে, কারণ ব্যবহারকারীর শুধুমাত্র Basic প্ল্যানের অধিকার রয়েছে। আপনাকে এটিকে হুবহু একটি নতুন ক্রয়ের মতোই বিবেচনা করতে হবে এবং টোকেনটি স্বীকার করতে হবে।@Override public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) { if (billingResult.getResponseCode() == BillingResponseCode.OK && purchases != null) { for (Purchase purchase : purchases) { // purchase.getPurchaseToken() = premium_purchase_token_123 // purchase.getProducts() will contain basic_plan // Verify and acknowledge the purchase handleNewPurchase(purchase); } } } queryPurchasesAsyncসাথে সাথেই নতুন পারচেজ টোকেন (premium_purchase_token_123) এবং এর সাথে যুক্ত মূল এনটাইটেলমেন্ট (basic_plan) সহ পারচেজটি রিটার্ন করে। ব্যবহারকারীকে বেসিক প্ল্যানের এনটাইটেলমেন্ট প্রদান অব্যাহত রাখতে আপনি এর উপর নির্ভর করতে পারেন।
২. ক্রয় প্রক্রিয়া সফল হওয়ার ঠিক পরেই (ব্যাকএন্ড)
- নতুন ক্রয় টোকেন (
premium_purchase_token_123) কেনার প্রক্রিয়া শেষ হওয়ার সাথে সাথেই SUBSCRIPTION_PURCHASED RTDN পাঠানো হয়। নমুনা RTDN পেলোড{ "version":"1.0", "packageName":"com.google.play.billing.samples.subscriptions", "eventTimeMillis":"...", "subscriptionNotification": { "version":"1.0", "notificationType":4, // SUBSCRIPTION_PURCHASED "purchaseToken":"premium_purchase_token_123" //purchase token for the new subscription } } - ক্রয়ের বিবরণ আনার জন্য নতুন পারচেজ টোকেন সহ
GET purchases.subscriptionsv2অনুরোধটি কল করুন। রেসপন্সে ২টি লাইন আইটেম থাকে।- একটি হলো পুরোনো সাবস্ক্রিপশন (বেসিক প্ল্যান) এবং এর
expiryTimeভবিষ্যতে। পুরোনো সাবস্ক্রিপশনটি নবায়ন করা হবে না এবং এর একটিdeferredItemReplacementরয়েছে, যাতে নতুন সাবস্ক্রিপশনটি (প্রিমিয়াম প্ল্যান) অন্তর্ভুক্ত। এটি নির্দেশ করে যে পুরোনো সুবিধাটির মেয়াদ শেষ হলে তা প্রতিস্থাপিত হবে। - একটি হলো নতুন কেনা সাবস্ক্রিপশন। এর 'expiryTime'-এর জন্য কোনো মান সেট করা নেই।
{ "kind": "androidpublisher#subscriptionPurchaseV2", "startTime": "2026-05-07T15:50:11.383Z", "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE", "latestOrderId": "GPA.<order_id>", "linkedPurchaseToken": "basic_purchase_token_123", "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED", "lineItems": [ { "productId": "premium_plan", // Premium Plan has no expiry time "autoRenewingPlan": {...}, "offerDetails": {...}, "itemReplacement": {. // Subscription replacement details "productId": "basic_plan", "replacementMode": "DEFERRED", "basePlanId": "monthly-auto-renewing" }, "offerPhase": {} }, { "productId": "basic_plan", // Subscription to be replaced "expiryTime": "2026-05-07T15:54:34.768Z", // Expiry time in the future "autoRenewingPlan": {}, "offerDetails": {...}, "deferredItemReplacement": { // identifier indicating this subscription will be replaced upon renewal "productId": "subscription_premium" }, "latestSuccessfulOrderId": "GPA.<order_id>", "itemReplacement": {...}, } ], "etag": "<etag>" } - একটি হলো পুরোনো সাবস্ক্রিপশন (বেসিক প্ল্যান) এবং এর
- আপনাকে অবশ্যই নতুন ক্রয় টোকেনটি স্বীকার করতে হবে। এটি আপনার অ্যাপের মধ্যে অথবা আপনার ব্যাকএন্ডে করা যেতে পারে। ক্রয় প্রক্রিয়াকরণ এবং স্বীকৃতি সম্পর্কে আরও বিস্তারিত জানতে, ডেভেলপার ডকুমেন্টেশন দেখুন।
- পুরানো ক্রয় টোকেনের (
basic_purchase_token_123) জন্য SUBSCRIPTION_EXPIRED RTDN পাঠানো হয়েছে। নমুনা RTDN পেলোড{ "version":"1.0", "packageName":"com.google.play.billing.samples.subscriptions", "eventTimeMillis":"...", "subscriptionNotification": { "version":"1.0", "notificationType":13, // SUBSCRIPTION_EXPIRED "purchaseToken":"basic_purchase_token_123" //purchase token for the old subscription } } - পুরানো পারচেজ টোকেন ব্যবহার করে
GET purchases.subscriptionsv2API কল করলে, এটি মেয়াদোত্তীর্ণ (SUBSCRIPTION_STATE_EXPIRED) হিসেবে দেখায়। পুরানো প্ল্যানের এনটাইটেলমেন্ট অবশিষ্ট সময়ের জন্য নতুন পারচেজে স্থানান্তরিত হয়ে যায়।
৩. প্রতিস্থাপনের তারিখে - ক্রয় প্রক্রিয়া (অ্যাপ) সম্পন্ন হওয়ার পর প্রথম নবায়ন
-
queryPurchasesAsyncনতুন পারচেজ টোকেন (premium_purchase_token_123) এবং এর সাথে যুক্ত নতুন সাবস্ক্রিপশন (premium_plan) সহ পারচেজটি রিটার্ন করে। - ক্রয় প্রক্রিয়া সফল হলেই নতুন ক্রয়টি ইতিমধ্যে সম্পন্ন হয়ে যাওয়ার কথা, ব্যবহারকারীকে সঠিক সাবস্ক্রিপশনের অ্যাক্সেস দেওয়া হয়েছে কিনা তা নিশ্চিত করা ছাড়া আপনাকে অন্য কোনো বিশেষ পদক্ষেপ নিতে হবে না।
৪. প্রতিস্থাপনের তারিখে - ক্রয় প্রক্রিয়ার (ব্যাকএন্ড) পর প্রথম নবায়ন
-
ReplacementMode.DEFERREDচালু থাকলে, প্রথম নবায়নগুলোSUBSCRIPTION_RENEWEDRTDN প্রসেসকারী অন্য যেকোনো নবায়নের মতোই সাধারণ আচরণ অনুসরণ করে। এমনটা ঘটলে প্রতিস্থাপনের জন্য আপনার কোনো বিশেষ লজিকের প্রয়োজন নেই। - ক্রয়ের বিবরণ আনার জন্য নতুন পারচেজ টোকেন সহ
GET purchases.subscriptionsv2অনুরোধটি কল করুন। রেসপন্সে ২টি লাইন আইটেম থাকে।- এটি পুরানো সাবস্ক্রিপশন (বেসিক প্ল্যান)-এর প্রতিনিধিত্ব করে এবং এর
expiryTimeঅতীতে। পুরানো সাবস্ক্রিপশনটিরdeferredItemReplacementফিল্ডের জন্য আর কোনো মান সেট করা থাকবে না। - একটি নতুন সাবস্ক্রিপশন, যার মেয়াদ ভবিষ্যতে
expiryTimeএবং 'autoRenewEnabled' ফিল্ডটি 'trueতে সেট করা আছে।
{ "kind": "androidpublisher#subscriptionPurchaseV2", "subscriptionState": "SUBSCRIPTION_STATE_ACTIVE", "latestOrderId": "GPA.<order_id>..0", "linkedPurchaseToken": "basic_purchase_token_123", // purchase token of the old subscription "acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED", "lineItems": [ { "productId": "premium_plan", // New subscription "expiryTime": "2026-05-07T16:00:09.437Z", // Expiry time set in the future "autoRenewingPlan": { "autoRenewEnabled": true, // Auto Renewing Flag set to True "recurringPrice": {...} }, "offerDetails": {...}, "latestSuccessfulOrderId": "GPA.<order_id>..0", "itemReplacement": {. // Details of the subscription replacement "productId": "basic_plan", "replacementMode": "DEFERRED", "basePlanId": "monthly-auto-renewing" }, "offerPhase": {...} }, { "productId": "basic_plan", // Old subscription, Does not contains the deferredItemReplacement field "expiryTime": "2026-05-07T15:54:34.768Z", // Expiry time set in the past "autoRenewingPlan": {}, "offerDetails": {...}, "latestSuccessfulOrderId": "GPA.<order_id>..0", "itemReplacement": {...}, } ], "etag": "<etag>" } - এটি পুরানো সাবস্ক্রিপশন (বেসিক প্ল্যান)-এর প্রতিনিধিত্ব করে এবং এর
উপসংহার
এই বিভাগে ReplacementMode.DEFERRED জন্য প্রয়োজনীয় বিশেষ ব্যবস্থাপনা বিস্তারিতভাবে আলোচনা করা হয়েছে। আপনি জেনেছেন যে, ইমিডিয়েট মোডের মতো নয়, এক্ষেত্রে এনটাইটেলমেন্ট পরিবর্তন শুধুমাত্র বর্তমান বিলিং চক্রের শেষে ঘটে থাকে। এই বিভাগে আপনার অ্যাপ এবং ব্যাকএন্ড উভয়ের জন্য প্রাথমিক ক্রয় সঠিকভাবে সম্পন্ন করা, নতুন টোকেনটি স্বীকার করা এবং পুরোনো সাবস্ক্রিপশনের মেয়াদ শেষ হয়ে নতুনটি সক্রিয় হলে এনটাইটেলমেন্ট পরিবর্তনটি পরিচালনা করার জন্য প্রয়োজনীয় পদক্ষেপগুলো আলোচনা করা হয়েছে।
১২. সাবস্ক্রিপশন প্রতিস্থাপন খেলার মাঠ
স্যাম্পল অ্যাপের রিপ্লেসমেন্ট প্লেগ্রাউন্ড ফিচারটি আপনাকে আপনার গুগল প্লে কনসোল অ্যাকাউন্টে কনফিগার করা সাবস্ক্রিপশন প্রোডাক্টগুলোর আপগ্রেড এবং ডাউনগ্রেড পরীক্ষা করার সুযোগ দেয়। এই বিভাগে রিপ্লেসমেন্ট প্লেগ্রাউন্ড ফিচারটি কীভাবে ব্যবহার করতে হয় তা বর্ণনা করা হয়েছে।
সেটআপ
রিপ্লেসমেন্ট প্লেগ্রাউন্ড ফিচারটি ব্যবহার করতে, নিম্নলিখিত বিষয়গুলো নিশ্চিত করুন:
- আপনার
build.gradleফাইলেরpackageIdটি আপনার Google Play Console-এ কনফিগার করা অ্যাপ্লিকেশনের সাথে মেলে। - আপনার টেস্ট ইউজার অ্যাকাউন্টটি গুগল প্লে কনসোলে একজন লাইসেন্স পরীক্ষক হিসেবে নথিভুক্ত করা হয়েছে। লাইসেন্স টেস্টিং সম্পর্কে আরও জানতে, ‘আপনার অ্যাপের বিলিং বাস্তবায়ন পরীক্ষা করুন ’ দেখুন।
সাবস্ক্রিপশন প্রতিস্থাপন খেলার মাঠ
স্যাম্পল অ্যাপটিতে একটি রিপ্লেসমেন্ট প্লেগ্রাউন্ড ট্যাব রয়েছে, যা আপনাকে সাবস্ক্রিপশন পরিবর্তনের সিমুলেশন করতে দেয়। আপনি আপনার প্লে কনসোলে সংজ্ঞায়িত সাবস্ক্রিপশনগুলো কোয়েরি করতে পারেন এবং বিভিন্ন রিপ্লেসমেন্ট মোড ব্যবহার করে সেগুলোর মধ্যে স্যুইচিং পরীক্ষা করতে পারেন। এই প্লেগ্রাউন্ডটি আপনাকে বুঝতে সাহায্য করে যে, বিভিন্ন মোড আপনার সাবস্ক্রিপশনের বিলিং সাইকেল এবং এনটাইটেলমেন্টকে কীভাবে প্রভাবিত করে, যাতে আপনি নির্ধারণ করতে পারেন কোন বিকল্পগুলো আপনার ব্যবসার প্রয়োজনের জন্য সবচেয়ে উপযুক্ত।
প্লেগ্রাউন্ড ব্যবহার করে প্রতিস্থাপন অনুকরণ করতে, এই ধাপগুলো অনুসরণ করুন:
- প্লেগ্রাউন্ড ট্যাবে যান।
- আপনার যদি একটি সক্রিয় সাবস্ক্রিপশন থাকে: সেটি হাইলাইট করা থাকবে। এই সাবস্ক্রিপশনটিই প্রতিস্থাপন করা হবে।

- আপনার যদি কোনো সক্রিয় সাবস্ক্রিপশন না থাকে: আপনাকে প্রথমে একটি কিনতে হবে।
- প্লেগ্রাউন্ডটি ডিফল্টরূপে এই কোডল্যাবের জন্য তৈরি করা বেসিক , প্রিমিয়াম এবং লাইট প্ল্যানগুলো তালিকাভুক্ত করে।
- আপনার প্লে ডেভেলপার কনসোলে কনফিগার করা অন্যান্য প্ল্যান দিয়ে পরীক্ষা করতে, 'Add Custom Plan'-এ ক্লিক করুন এবং
productIdওbasePlanIdদিয়ে অনুসন্ধান করুন। - নির্বাচিত সাবস্ক্রিপশনটি ক্রয় করুন।
- ব্যবহারকারীর সদ্য কেনা সক্রিয় সাবস্ক্রিপশনটি এখন প্রদর্শিত হওয়া উচিত।

- ব্যবহারকারী যে সাবস্ক্রিপশনটিতে যেতে চান , সেটি নির্বাচন করুন।
- রূপান্তরের জন্য একটি প্রতিস্থাপন মোড নির্বাচন করুন।

- সাবস্ক্রিপশন প্রতিস্থাপন অনুকরণ করতে টেস্ট রিপ্লেসমেন্ট বোতামটি ক্লিক করুন।
- আপনার গুগল প্লে বিলিং বটম শীটটি দেখা উচিত, যেখানে সাবস্ক্রিপশন প্রতিস্থাপনের হিসাবকৃত বিবরণ (যেমন তাৎক্ষণিক চার্জ এবং বিলিং চক্রের সমন্বয়) থাকে।

- লেনদেনটি সম্পন্ন করুন।
- সক্রিয় সাবস্ক্রিপশনের পরিবর্তন এবং আপডেট করা নবায়নের তারিখ ও মূল্য সম্পর্কে বিস্তারিত জানতে প্লে স্টোর অ্যাপের মধ্যে থাকা 'সাবস্ক্রিপশন পরিচালনা' (Manage Subscriptions) পৃষ্ঠায় যান।

১৩. পরবর্তী পদক্ষেপ
- আপনার প্লে বিলিং ইন্টিগ্রেশন থেকে কীভাবে সর্বোচ্চ সুবিধা লাভ করবেন তা জানুন।
- ব্যবহারকারীরা এই পণ্যগুলি কেনা শুরু করলে, আপনার সুরক্ষিত ব্যাকএন্ডে কেনাকাটা যাচাই ও প্রক্রিয়াকরণের জন্য সর্বোত্তম পদ্ধতিগুলি অনুসরণ করতে ভুলবেন না।
রেফারেন্স নথি
১৪. অভিনন্দন
অভিনন্দন! আপনি বিভিন্ন প্রোরেশন মোড ব্যবহার করে সফলভাবে সাবস্ক্রিপশন প্রতিস্থাপন বাস্তবায়ন করেছেন এবং প্ল্যান পরিবর্তনের জন্য ব্যাকএন্ড হ্যান্ডলিং কনফিগার করেছেন।
আপনি যা শিখেছেন
- নির্দিষ্ট রিপ্লেসমেন্ট মোড ব্যবহার করে
SubscriptionProductReplacementParamsকীভাবে কনফিগার করবেন। - তাৎক্ষণিক আপগ্রেড এবং বিলম্বিত ডাউনগ্রেডের মধ্যে পার্থক্য।
- RTDN ব্যবহার করে
linkedPurchaseTokenসাহায্যে কীভাবে পুরোনো সাবস্ক্রিপশন টোকেন বাতিল করা যায়।
জরিপ
এই কোডল্যাব সম্পর্কে আপনার মতামত অত্যন্ত মূল্যবান। অনুগ্রহ করে কয়েক মিনিট সময় নিয়ে আমাদের সমীক্ষাটি পূরণ করুন।