সাবস্ক্রিপশনের লাইফসাইকেল

সাবস্ক্রিপশন কেনাকাটা তার লাইফসাইকেল জুড়ে বিভিন্ন অবস্থার মধ্য দিয়ে যেতে পারে, যা অটোমেটিক রিনিউয়াল, পেমেন্ট বাতিল হওয়ার পরিস্থিতি এবং ডেভেলপার ম্যানেজমেন্ট অ্যাকশন সহ অনেক বিষয়ের উপর নির্ভর করে।

অটোমেটিক রিনিউ হওয়া সাবস্ক্রিপশনের লাইফসাইকেল ম্যানেজ করা

ব্যবহারকারীর সাবস্ক্রিপশন স্ট্যাটাস পরিবর্তন হলে, আপনার ব্যাকএন্ড সার্ভার একটি SubscriptionNotification মেসেজ পায়।

subs-auto-renew-state
ছবি ১. অটোমেটিক রিনিউ হওয়া সাবস্ক্রিপশন কেনাকাটার জন্য লাইফসাইকেল স্ট্যাটাস এবং ট্রানজিশন ইভেন্ট।

আপনার ব্যাকএন্ডে স্ট্যাটাস আপডেট করতে, বিজ্ঞপ্তিতে অন্তর্ভুক্ত কেনাকাটার টোকেন সহ purchases.subscriptionsv2.get API কল করুন। এই এন্ডপয়েন্ট একটি পারচেজ টোকেন সহ লেটেস্ট সাবস্ক্রিপশন স্ট্যাটাস প্রদান করে এবং সাবস্ক্রিপশন ম্যানেজমেন্টের জন্য সোর্স অফ ট্রুথ হিসেবে বিবেচিত হয়।

সাবস্ক্রিপশন সাইন-আপ থেকে শুরু করে মেয়াদ শেষ হওয়ার ৬০ দিন পর্যন্ত পারচেজ টোকেন বৈধ থাকে। এই তারিখের পরে, Google Play Developer API কল করার জন্য কেনাকাটার টোকেন আর বৈধ থাকবে না।

নতুন অটোমেটিক রিনিউ হওয়া সাবস্ক্রিপশন কেনা

কোনও ব্যবহারকারী সাবস্ক্রিপশন কিনলে, আপনার RTDN ক্লায়েন্টকে SUBSCRIPTION_PURCHASED টাইপ সহ SubscriptionNotification মেসেজ পাঠানো হয়। আপনি এই বিজ্ঞপ্তি পান বা PurchasesUpdatedListener বা আপনার অ্যাপের onResume() পদ্ধতিতে ম্যানুয়ালি কেনাকাটা ফেচ করার মাধ্যমে অ্যাপ-মধ্যস্থ নতুন কেনাকাটা রেজিস্টার করেন, আপনাকে সুরক্ষিত ব্যাকএন্ডে নতুন কেনাকাটা প্রসেস করতে হবে। এটি করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:

  1. purchases.subscriptionsv2.get এন্ডপয়েন্ট কোয়েরি করে সাবস্ক্রিপশন রিসোর্স পান যাতে লেটেস্ট সাবস্ক্রিপশন স্ট্যাটাস থাকে।
  2. subscriptionState ফিল্ডের ভ্যালু SUBSCRIPTION_STATE_ACTIVE কিনা তা নিশ্চিত করুন।
  3. কেনাকাটা যাচাই করুন।
  4. ব্যবহারকারীকে কন্টেন্ট অ্যাক্সেস করার সুবিধা দিন। সাবস্ক্রিপশন রিসোর্স থেকে পাওয়া 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 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 (সফলভাবে রিনিউ করা হলে)

এছাড়াও, সাবস্ক্রিপশনের লেটেস্ট স্ট্যাটাস পেতে, ২৪‑ঘণ্টার নীরব অতিরিক্ত সময়সীমা শেষ হওয়ার পরে যেকোনও সময় 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 ৪৮ ঘণ্টা পর্যন্ত পেমেন্ট পদ্ধতি চার্জ করার অতিরিক্ত চেষ্টা করে। এই সময়সীমার মধ্যে ব্যবহারকারী সাবস্ক্রিপশনের সুবিধাগুলি পাবেন। এই আবার চেষ্টা করার সময়সীমা শেষ হয়ে যাওয়ার পরে, সাবস্ক্রিপশন অ্যাকাউন্ট হোল্ডে রাখা আছে স্ট্যাটাসে চলে যায় এবং ব্যবহারকারী সাবস্ক্রিপশনের সুবিধা অ্যাক্সেস করতে পারেন না।
  • সাবস্ক্রিপশন পজ করা অবস্থা থেকে আবার চালু করা হলে এবং পেমেন্ট পদ্ধতি কাজ না করলে, সাবস্ক্রিপশন সরাসরি অ্যাকাউন্ট হোল্ডে চলে যায়।
  • অ্যাকাউন্ট হোল্ড থেকে সাবস্ক্রিপশন রিস্টোর করা হলে, রিনিউ করার তারিখ রিসেট হয়ে যায়।

মেয়াদ শেষ হওয়া

সাবস্ক্রিপশনের মেয়াদ শেষ হয়ে গেলে, ব্যবহারকারী সাবস্ক্রিপশনে অ্যাক্সেস হারাবেন। 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 অবজেক্ট চেক করে আপনি দেখতে পারবেন যে সাবস্ক্রিপশন আবার কখন রিনিউ করা হবে বলে আশা করা হচ্ছে।

SUBSCRIPTION_RECOVERED ধরনের একটি SubscriptionNotification মেসেজ পাঠানো হয় যদি পজ করার সময়সীমা শেষ হওয়ার পরে সাবস্ক্রিপশন অটোমেটিক আবার চালু হয় অথবা ব্যবহারকারী ম্যানুয়ালি সাবস্ক্রিপশন আবার চালু করার বিকল্প বেছে নেন।

SubscriptionNotification মেসেজ যার ধরন SUBSCRIPTION_ON_HOLD, সেটি পাঠানো হয় যদি পজ করার পরে সাবস্ক্রিপশন আবার চালু করার সময় পেমেন্ট সংক্রান্ত সমস্যা হয়।

অ্যাকাউন্ট হোল্ডে রাখা নিবন্ধে যেভাবে বর্ণনা করা হয়েছে, এই দুটি পরিস্থিতি সেইভাবে সামলাতে হবে।

আবার সাবস্ক্রাইব করুন

অটোমেটিক রিনিউ হওয়া বেস প্ল্যানের জন্য, Google Play Store একটি আবার সাবস্ক্রাইব করুন বোতাম দেখাতে পারে। এই বোতামটি ব্যবহারকারীদের সাবস্ক্রিপশনে আবার অ্যাক্সেস পেতে সাহায্য করে। এটি বিভিন্ন কারণে দেখা নাও যেতে পারে, যেমন সাবস্ক্রিপশনের মেয়াদ অনেক আগেই শেষ হয়ে গেলে।

ছবি ৭. Google Play Store অ্যাপের অ্যাকাউন্ট > সাবস্ক্রিপশন বিভাগে বাতিল করা সাবস্ক্রিপশন সহ আবার সাবস্ক্রাইব করুন বোতাম দেখা যাচ্ছে।

যদিও বোতামটি সবসময় আবার সাবস্ক্রাইব করুন হিসেবে লেবেল করা থাকে, তবে এর কার্যকারিতা সাবস্ক্রিপশনের অবস্থার উপর নির্ভর করে।

সাবস্ক্রিপশন বাতিল করা হলেও মেয়াদ শেষ না হওয়া পর্যন্ত ব্যবহারকারী সাবস্ক্রিপশন চালু রাখতে এবং সাবস্ক্রিপশনের সুবিধা পেতে পারেন। ব্যবহারকারী আবার সাবস্ক্রাইব করুন বিকল্পে ট্যাপ করলে, বাতিল করার প্রক্রিয়াটি কার্যকরভাবে বাতিল হয়ে যায় এবং সাবস্ক্রিপশন রিনিউ হতে থাকে। এই অ্যাকশনকে Play ডেভেলপার ডকুমেন্টেশন ও 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 মূল কেনাকাটার সাথে যুক্ত কোনও তথ্য থাকে না, কারণ মূল সাবস্ক্রিপশনের মেয়াদ সম্পূর্ণ শেষ হয়ে গেছে।

আবার কেনা সাবস্ক্রিপশনের জন্য সঠিক ব্যবহারকারী অ্যাসোসিয়েশন নিশ্চিত করতে এবং অননুমোদিত কেনাকাটার জন্য অটোমেটিক রিফান্ড প্রতিরোধ করতে, আপনার ব্যাকএন্ড সার্ভারে আবার কেনাকাটার বিষয়টি স্বীকার করতে হবে:

  1. RTDN থেকে পাওয়া নতুন কেনাকাটার টোকেন সহ purchases.subscriptionsv2.get নম্বরে কল করুন। এই ধরনের অ্যাপ-বহিস্থ কেনাকাটার জন্য উত্তরে outOfAppPurchaseContext ফিল্ড অন্তর্ভুক্ত থাকে, যা শুধুমাত্র অননুমোদিত সাবস্ক্রিপশন আবার কেনার জন্য উপলভ্য। এই ফিল্ডে এগুলি থাকে:

    • expiredExternalAccountIdentifiers: ExternalAccountIdentifiers অবজেক্ট যাতে আগের মেয়াদ শেষ হয়ে যাওয়া সাবস্ক্রিপশনের জন্য কনফিগার করা obfuscatedAccountId ও obfuscatedProfileId ফিল্ড থাকে, যদি সেগুলি সেট করা থাকে।
    • expiredPurchaseToken: শেষবার মেয়াদ শেষ হয়ে যাওয়া সাবস্ক্রিপশনের পারচেজ টোকেন।

    আপনার ব্যাকএন্ডে নতুন কেনাকাটা সঠিক ব্যবহারকারীর অ্যাকাউন্টের সাথে লিঙ্ক করতে, এই শনাক্তকারীগুলির মধ্যে যেকোনও একটি ব্যবহার করুন।

  2. কেনাকাটা সম্পর্কে জানতে purchases.subscriptions.acknowledge নম্বরে কল করুন।

    • বিকল্প হিসেবে, আপনি ব্যবহারকারীর obfuscatedAccountId এবং obfuscatedProfileId পাঠাতে পারেন, যদি আপনি অ্যাপ-মধ্যস্থ বিলিং ফ্লো চলাকালীন setObfuscatedAccountId এবং setObfuscatedProfileId ব্যবহার করে সেগুলি কনফিগার করে থাকেন।

এই সার্ভার-সাইড পদ্ধতির মাধ্যমে, ব্যবহারকারী আপনার অ্যাপ না খুললেও, কেনাকাটা করার তারিখ থেকে তিন দিনের মধ্যে আপনি কেনাকাটা কনফার্ম করতে পারবেন।

আপগ্রেড, ডাউনগ্রেড ও আবার সাবস্ক্রাইব করা

কোনও ব্যবহারকারী আপগ্রেড, ডাউনগ্রেড করলে অথবা সাবস্ক্রিপশনের মেয়াদ শেষ হওয়ার আগে আপনার অ্যাপ থেকে বাতিল করার পরে সাইন-আপ করলে, পুরনো সাবস্ক্রিপশন বাতিল হয়ে যায় এবং একটি নতুন পারচেজ টোকেন সহ নতুন সাবস্ক্রিপশন তৈরি হয়।

এছাড়াও, Google Play Developer API থেকে ফেরত আসা সাবস্ক্রিপশন রিসোর্সে একটি linkedPurchaseToken ফিল্ড থাকে যা পুরনো কেনাকাটা দেখায় যেখান থেকে ব্যবহারকারী আপগ্রেড, ডাউনগ্রেড বা আবার সাবস্ক্রাইব করেছেন। আপনি সেই ফিল্ডে পারচেজ টোকেন ব্যবহার করে পুরনো সাবস্ক্রিপশন খুঁজতে এবং আগে থেকে থাকা ব্যবহারকারীর অ্যাকাউন্ট শনাক্ত করতে পারবেন, যাতে আপনি একই অ্যাকাউন্টের সাথে নতুন কেনাকাটা লিঙ্ক করতে পারেন।

সাবস্ক্রিপশনের মেয়াদ শেষ হওয়ার আগে কোনও ব্যবহারকারী আপনার অ্যাপ থেকে একই বেস প্ল্যানের জন্য আবার সাইন-আপ করলে, Google Play নতুন কেনাকাটার জন্য $০.০০ মূল্যের অর্ডার জেনারেট করে। সাইন-আপ করার সময় ব্যবহারকারীকে চার্জ করা হয় না, কারণ তিনি বর্তমান বিলিংয়ের মেয়াদের জন্য আগেই পেমেন্ট করে দিয়েছেন। আসল রিনিউ করার তারিখে নিয়মিত বিলিং আবার চালু হবে। $0.00 মূল্যের অর্ডারটি Play Console-এর অর্ডার ম্যানেজমেন্ট বিভাগে এবং আপনার আর্থিক রিপোর্টে দেখা যাবে। এর অর্থ এই নয় যে ব্যবহারকারী ফ্রি ট্রায়াল বা প্রোমোশনাল ছাড় পেয়েছেন।

আপনার অ্যাপে কোনও ব্যবহারকারীকে আপগ্রেড, ডাউনগ্রেড বা আবার সাবস্ক্রাইব করার বিকল্প অফার করার আগে, আপনাকে অবশ্যই আগে থেকে থাকা সাবস্ক্রিপশন সম্পর্কে জানতে হবে। আগে থেকে থাকা সাবস্ক্রিপশন এখনও স্বীকার করা বাকি থাকলে, প্ল্যান পরিবর্তন বা আবার সাবস্ক্রাইব করার সুবিধা ব্লক করা হয়।

ব্যবহারকারী যদি আপগ্রেড, ডাউনগ্রেড বা আবার সাবস্ক্রাইব করার জন্য সফলভাবে কেনাকাটা করেন, তাহলে এটি একটি নতুন কেনাকাটা যা আপনাকে স্বীকার করতে হবে। এটি করার জন্য সাজেস্ট করা পদ্ধতি হল 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 পাবেন।

দাম বাড়ার জন্য ব্যবহারকারীর সম্মতি সংক্রান্ত কনফার্মেশন ম্যানেজ করুন

কোনও ব্যবহারকারী আপনার সাবস্ক্রিপশনের দাম বৃদ্ধি করার ব্যাপারে সম্মতি দিলে, আপনি SUBSCRIPTION_PRICE_CHANGE_UPDATED টাইপ সহ একটি SubscriptionNotification মেসেজ পাবেন।

মূল্য পরিবর্তনের পরে রিনিউয়াল ম্যানেজ করা

দাম কমলে বা সাবস্ক্রিপশনের দাম বাড়ার পরে রিনিউ হলে, আপনি SUBSCRIPTION_RENEWED ধরনের SubscriptionNotification মেসেজ পাবেন। এই বিজ্ঞপ্তিটিকে অন্য যেকোনও রিনিউয়াল-এর মতো করে দেখুন।

চালু করলে মূল্য বাড়বে সংক্রান্ত সম্মতি গ্রহণ না করা হলে কী করতে হবে তা ম্যানেজ করা

ব্যবহারকারীকে বেশি দামে রিনিউ করার আগে তিনি যদি আপনার চালু করলে মূল্য বাড়বে বিকল্পে সম্মতি না জানান, তাহলে তিনি অটোমেটিক আনসাবস্ক্রাইব হয়ে যান এবং আপনি SUBSCRIPTION_CANCELED টাইপ সহ SubscriptionNotification মেসেজ পান। বাতিলকরণ বিভাগে যেভাবে বর্ণনা করা হয়েছে সেইভাবে এই ইভেন্ট ম্যানেজ করুন।

এছাড়াও, ব্যবহারকারীরা একই পদ্ধতি অনুসরণ করে দাম বাড়ার জন্য বেরিয়ে আসার জন্য তাদের সাবস্ক্রিপশন বাতিল করতে পারবেন।

দক্ষিণ কোরিয়ার (KR) নতুন রেগুলেশন অনুযায়ী, KR অঞ্চলে সাবস্ক্রিপশন ব্যবহারকারীদের ফ্রি ট্রায়াল বা প্রাথমিক মেয়াদ শেষ হওয়ার পরে দাম বাড়লে তাতে সম্মতি জানাতে হবে।

আপনাকে রেগুলেশন মেনে চলতে সাহায্য করার জন্য, Play, KR অঞ্চলের ব্যবহারকারীদের সম্মতি সংক্রান্ত প্রয়োজনীয়তা সম্পর্কে জানাবে এবং ব্যবহারকারীদের থেকে পাওয়া সম্মতি সংক্রান্ত উত্তরও স্টোর করবে। যেসব ব্যবহারকারী বেশি দাম কার্যকর হওয়ার আগে সম্মতি দেন না, তাদের সাবস্ক্রিপশন অটোমেটিক বাতিল হয়ে যায়। Play থেকে পাঠানো বিজ্ঞপ্তি ছাড়াও, আপনি ব্যবহারকারীদের কাস্টম দাম বাড়ানোর বিজ্ঞপ্তি পাঠাতে পারেন এবং বিজ্ঞপ্তিতে নির্দিষ্ট ম্যানেজমেন্ট পৃষ্ঠার লিঙ্ক দিতে পারেন।

সম্মতির সময়সীমা শুরু হলে বা ব্যবহারকারী সম্মতি দিলে, আপনি SUBSCRIPTION_PRICE_STEP_UP_CONSENT_UPDATED টাইপ সহ SubscriptionNotification মেসেজ পাবেন।

দাম বৃদ্ধি ও দাম পরিবর্তনের মধ্যে পার্থক্য

price step-up বলতে সাবস্ক্রিপশনের দাম বৃদ্ধিকে বোঝায়, যা একটি অফার ফেজ থেকে অন্য অফার ফেজে ট্রানজিশনের কারণে হয়। যেমন, ফ্রি ট্রায়াল থেকে রেগুলার দামে সাবস্ক্রিপশন পরিবর্তন করা। সাবস্ক্রিপশনের বর্তমান পর্যায় শনাক্ত করতে আপনি সাবস্ক্রিপশন রিসোর্সের offerPhase ফিল্ড ব্যবহার করতে পারেন।

তবে, price change বলতে সাবস্ক্রিপশনের বেস প্ল্যানের দামের জন্য আপনার (ডেভেলপার) করা দামের আপডেটকে বোঝায়। যেমন, চালু করলে মূল্য বাড়বে বা বন্ধ করলে মূল্য বাড়বে।

প্রিপেড প্ল্যানের লাইফ সাইকেল ম্যানেজ করা

অটোমেটিক রিনিউ হওয়া সাবস্ক্রিপশনের মতো, আপনাকে প্রতিটি নতুন কেনাকাটার পরে প্রিপেড প্ল্যান সম্পর্কে সম্মতি জানাতে হবে। প্রিপেড প্ল্যানের ক্ষেত্রে, আপনাকে অবশ্যই প্রাথমিক কেনাকাটা এবং যেকোনও টপ-আপ সম্পূর্ণভাবে প্রসেস করতে হবে, কারণ ব্যবহারকারীকে প্রতিবার পারচেজ ফ্লোর মাধ্যমে যেতে হবে।

প্রিপেড প্ল্যানের মেয়াদ কম হওয়ার সম্ভাবনা থাকায়, যত তাড়াতাড়ি সম্ভব কেনাকাটার বিষয়টি স্বীকার করা গুরুত্বপূর্ণ। এক সপ্তাহ বা তার বেশি মেয়াদের প্রিপেড প্ল্যান ৩ দিনের মধ্যে স্বীকার করতে হবে। এক সপ্তাহের কম মেয়াদের প্রিপেড প্ল্যানের ক্ষেত্রে, প্ল্যানের মেয়াদের অর্ধেক সময়ের মধ্যে সম্মতি জানাতে হবে। যেমন, তিন দিনের প্রিপেড প্ল্যান কেনার ক্ষেত্রে ডেভেলপারদের কাছে ১.৫ দিন সময় থাকে।

ছবি ৮. সাবস্ক্রিপশন কেনার জন্য লাইফসাইকেল স্টেট ও ট্রানজিশন ইভেন্ট।

প্রতিটি টপ-আপ সহ প্রিপেড প্ল্যান সাবস্ক্রিপশন কেনা হলে, SUBSCRIPTION_PURCHASED ধরনের একটি SubscriptionNotification মেসেজ আপনার RTDN ক্লায়েন্টকে পাঠানো হয়। লেটেস্ট প্রিপেড প্ল্যান সাবস্ক্রিপশন স্ট্যাটাস চেক করতে 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 পরিবর্তন করে।