ব্যবহারকারীর পছন্দের সাথে বিকল্প বিলিংয়ের জন্য অ্যাপ-মধ্যস্থ ইন্টিগ্রেশন নির্দেশিকা

এই নির্দেশিকায় বর্ণনা করা হয়েছে কীভাবে আপনার অ্যাপে ব্যবহারকারীর পছন্দ অনুযায়ী বিকল্প বিলিং ব্যবস্থা চালু করার জন্য এপিআই (API) ইন্টিগ্রেট করতে হয়।

প্লে বিলিং লাইব্রেরি সেটআপ

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

Google Play-এর সাথে সংযোগ করুন

ইন্টিগ্রেশন প্রক্রিয়ার প্রথম ধাপগুলো গুগল প্লে বিলিং ইন্টিগ্রেশন গাইডে বর্ণিত ধাপগুলোর মতোই, তবে আপনার BillingClient ইনিশিয়ালাইজ করার সময় কয়েকটি পরিবর্তন করতে হবে:

  • ব্যবহারকারীকে বিলিং বিকল্পগুলির মধ্যে থেকে বেছে নেওয়ার সুযোগ দিতে চান, তা বোঝানোর জন্য আপনাকে একটি নতুন মেথড কল করতে হবে: enableUserChoiceBilling
  • ব্যবহারকারী বিকল্প বিলিং বেছে নিলে, সেই পরিস্থিতি সামাল দেওয়ার জন্য আপনাকে একটি UserChoiceBillingListener নিবন্ধন করতে হবে।

নিম্নলিখিত উদাহরণটি এই পরিবর্তনগুলি সহ একটি BillingClient ইনিশিয়ালাইজ করার পদ্ধতি প্রদর্শন করে:

কোটলিন

val purchasesUpdatedListener =
   PurchasesUpdatedListener { billingResult, purchases ->
       // Handle new Google Play purchase.
   }

val userChoiceBillingListener =
   UserChoiceBillingListener { userChoiceDetails ->
       // Handle alternative billing choice.
   }

val billingClient = BillingClient.newBuilder(context)
   .setListener(purchasesUpdatedListener)
   .enablePendingPurchases()
   .enableUserChoiceBilling(userChoiceBillingListener)
   .build()

জাভা

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
    @Override
    public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
        // Handle new Google Play purchase.
    }
};

private UserChoiceBillingListener userChoiceBillingListener = new UserChoiceBillingListener() {
    @Override
    public void userSelectedAlternativeBilling(
        UserChoiceDetails userChoiceDetails) {
        // Handle new Google Play purchase.
    }
};

private BillingClient billingClient = BillingClient.newBuilder(context)
    .setListener(purchasesUpdatedListener)
    .enablePendingPurchases()
    .enableUserChoiceBilling(userChoiceBillingListener)
    .build();

BillingClient ইনিশিয়ালাইজ করার পর, ইন্টিগ্রেশন গাইডে বর্ণিত পদ্ধতি অনুযায়ী আপনাকে Google Play-এর সাথে একটি সংযোগ স্থাপন করতে হবে।

উপলব্ধ পণ্যগুলি প্রদর্শন করুন

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

ব্যবহারকারীর পছন্দের বিলিং প্রক্রিয়া চালু করুন

launchBillingFlow() কল করে ব্যবহারকারীর পছন্দের বিলিং ফ্লো চালু করুন। এটি গুগল প্লে বিলিং সিস্টেম ইন্টিগ্রেশনের মাধ্যমে একটি পারচেজ ফ্লো চালু করার মতোই কাজ করে: ব্যবহারকারী যে প্রোডাক্ট এবং অফারটি নিতে চান, তার সাথে সম্পর্কিত একটি ProductDetails ইনস্ট্যান্স এবং একটি offerToken প্রদান করতে হয়। যদি ব্যবহারকারী গুগল প্লে-এর বিলিং সিস্টেম বেছে নেন, তাহলে পারচেজ ফ্লোটি চালিয়ে যাওয়ার জন্য এই তথ্য ব্যবহার করা হয়।

যখন ডেভেলপাররা launchBillingFlow() কল করেন, তখন গুগল প্লে বিলিং সিস্টেম নিম্নলিখিত যাচাইটি করে থাকে:

  • সিস্টেমটি যাচাই করে দেখে যে ব্যবহারকারীর Google Play দেশটি ব্যবহারকারীর পছন্দের বিকল্প বিলিং সমর্থন করে কিনা (অর্থাৎ একটি সমর্থিত দেশ)। যদি ব্যবহারকারীর Google Play দেশটি সমর্থিত হয়, তাহলে Google Play, BillingClient এর কনফিগারেশনের উপর ভিত্তি করে যাচাই করে দেখে যে বিকল্প বিলিং সক্রিয় করা হয়েছে কিনা।
    • যদি ব্যবহারকারীর পছন্দসহ বিকল্প বিলিং সক্রিয় করা থাকে, তাহলে ক্রয় প্রবাহে ব্যবহারকারীর পছন্দের ইউএক্স (UX) দেখানো হয়।
    • যদি ব্যবহারকারীর পছন্দের সুযোগসহ বিকল্প বিলিং সক্রিয় করা না থাকে, তাহলে ক্রয় প্রক্রিয়াটি ব্যবহারকারীর পছন্দের সুযোগ ছাড়াই সাধারণ গুগল প্লে বিলিং সিস্টেমের ইউএক্স (UX) প্রদর্শন করে।
  • যদি ব্যবহারকারীর গুগল প্লে দেশ সমর্থিত দেশ না হয়, তাহলে ব্যবহারকারীর কোনো পছন্দের সুযোগ ছাড়াই ক্রয় প্রক্রিয়াটি সাধারণ গুগল প্লে বিলিং সিস্টেমের ইউএক্স (UX) প্রদর্শন করে।

ব্যবহারকারীর খেলার দেশ একটি সমর্থিত দেশ

ব্যবহারকারীর প্লে দেশ একটি সমর্থিত দেশ নয়।

BillingClient সেটআপের সময় enableUserChoiceBilling কল করা হয়।

ব্যবহারকারী তার পছন্দের ইউএক্স দেখতে পায়।

ব্যবহারকারী গুগল প্লে-এর সাধারণ বিলিং সিস্টেমের ইউএক্স দেখতে পান।

BillingClient সেটআপের সময় enableUserChoiceBilling কল করা হয়নি

ব্যবহারকারী গুগল প্লে-এর সাধারণ বিলিং সিস্টেমের ইউএক্স দেখতে পান।

ব্যবহারকারী গুগল প্লে-এর সাধারণ বিলিং সিস্টেমের ইউএক্স দেখতে পান।

ব্যবহারকারীর নির্বাচন পরিচালনা করুন

ব্যবহারকারী গুগল প্লে-এর বিলিং সিস্টেম নাকি অন্য কোনো বিকল্প বিলিং সিস্টেম বেছে নিয়েছেন, তার ওপর নির্ভর করে ক্রয় প্রক্রিয়ার বাকি অংশ আপনি কীভাবে পরিচালনা করবেন তা ভিন্ন হয়।

যখন ব্যবহারকারী একটি বিকল্প বিলিং সিস্টেম নির্বাচন করেন

যদি ব্যবহারকারী বিকল্প বিলিং সিস্টেমটি বেছে নেন, তাহলে Google Play অ্যাপটিকে জানানোর জন্য UserChoiceBillingListener কে কল করে যে, তাকে বিকল্প বিলিং সিস্টেমে ক্রয় প্রক্রিয়াটি চালু করতে হবে। বিশেষত, userSelectedAlternativeBilling() মেথডটি কল করা হয়।

UserChoiceDetails অবজেক্টে প্রদত্ত এক্সটার্নাল ট্রানজ্যাকশন টোকেনটি বিকল্প বিলিং ফ্লোতে প্রবেশের জন্য ব্যবহারকারীর পছন্দের একটি স্বাক্ষর হিসেবে কাজ করে। ব্যাকএন্ড ইন্টিগ্রেশন গাইডে ব্যাখ্যা করা অনুযায়ী, এই পছন্দের ফলে হওয়া যেকোনো ট্রানজ্যাকশন রিপোর্ট করতে এই টোকেনটি ব্যবহার করুন।

UserChoiceBillingListener এর নিম্নলিখিত কাজগুলো সম্পাদন করা উচিত:

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

যদি ব্যবহারকারী বিকল্প বিলিং সিস্টেম ব্যবহার করে কেনাকাটা সম্পন্ন করেন, তাহলে আপনাকে অবশ্যই ২৪ ঘণ্টার মধ্যে আপনার ব্যাকএন্ড থেকে Google Play Developer API-কে কল করে externalTransactionToken এবং লেনদেনের অতিরিক্ত বিবরণসহ লেনদেনটি Google Play-কে জানাতে হবে । আরও বিস্তারিত জানতে ব্যাকএন্ড ইন্টিগ্রেশন গাইড দেখুন।

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে UserChoiceBillingListener প্রয়োগ করতে হয়:

কোটলিন

private val userChoiceBillingListener =
    UserChoiceBillingListener { userChoiceDetails ->
        // Get the products being purchased by the user.
        val products = userChoiceDetails.products

        // Send external transaction token to developer backend server
        // this devBackend object is for demonstration purposes,
        // developers can implement this step however best fits their
        // app to backend communication.
        devBackend.sendExternalTransactionStarted(
            userChoiceDetails.externalTransactionToken,
            user
        )

        // Launch alternative billing
        // ...
        // The developer backend handles reporting the transaction
        // to Google Play's backend once the alternative billing
        // purchase is completed.
    }

জাভা

private userChoiceBillingListener userChoiceBillingListener = new UserChoiceBillingListener() {
    @Override
    public void userSelectedAlternativeBilling(
           UserChoiceDetails userChoiceDetails) {
       // Get the products being purchased by the user.
       List<Product> products =
              userChoiceDetails.getProducts();

       // Send external transaction token to developer backend server
       // this devBackend object is for demonstration purposes,
       // developers can implement this step however best fits their
       // app to backend communication.
       devBackend.sendExternalTransactionStarted(
              userChoiceDetails.getExternalTransactionToken(),
              user
       );

       // Launch alternative billing
       // ...
       // The developer backend handles reporting the transaction
       // to Google Play's backend once the alternative billing
       // purchase is completed.
    }
};

যখন ব্যবহারকারী গুগল প্লে-এর বিলিং সিস্টেম নির্বাচন করেন

যদি ব্যবহারকারী গুগল প্লে-এর বিলিং ব্যবস্থা বেছে নেন, তাহলে তিনি গুগল প্লে-এর মাধ্যমেই কেনাকাটা চালিয়ে যান।

  • Google Play-এর বিলিং সিস্টেমের মাধ্যমে নতুন ইন-অ্যাপ কেনাকাটা কীভাবে পরিচালনা করতে হয়, সে সম্পর্কে আরও তথ্যের জন্য লাইব্রেরি ইন্টিগ্রেশন গাইডের ' ক্রয় প্রক্রিয়াকরণ ' অংশটি দেখুন।
  • সাবস্ক্রিপশন ক্রয়ের বিষয়ে অতিরিক্ত নির্দেশনার জন্য সাবস্ক্রিপশন ব্যবস্থাপনা নির্দেশিকার ‘নতুন সাবস্ক্রিপশন’ অংশটি দেখুন।

সাবস্ক্রিপশনের পরিবর্তনগুলি পরিচালনা করুন

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

এই অংশে সাবস্ক্রিপশন পরিবর্তনের কিছু সাধারণ পরিস্থিতি কীভাবে সামাল দিতে হয় তা বর্ণনা করা হয়েছে।

আপগ্রেড এবং ডাউনগ্রেড প্রবাহ

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

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

বিকল্প বিলিং সিস্টেমের মাধ্যমে কেনা সাবস্ক্রিপশন

যেসব সাবস্ক্রিপশন ব্যবহারকারীর পছন্দের পর ডেভেলপারের বিকল্প বিলিং সিস্টেমের মাধ্যমে কেনা হয়েছিল, সেগুলোর ক্ষেত্রে আপগ্রেড বা ডাউনগ্রেডের অনুরোধকারী ব্যবহারকারীদের পুনরায় ব্যবহারকারীর পছন্দের প্রক্রিয়ার মধ্য দিয়ে না গিয়ে ডেভেলপারের বিকল্প বিলিং সিস্টেম অনুসরণ করতে হবে।

এটি করার জন্য, যখন ব্যবহারকারী আপগ্রেড বা ডাউনগ্রেডের অনুরোধ করেন, তখন launchBillingFlow() কল করুন। প্যারামিটারে SubscriptionUpdateParams অবজেক্ট নির্দিষ্ট করার পরিবর্তে, setOriginalExternalTransactionId ব্যবহার করুন এবং মূল ক্রয়ের এক্সটার্নাল ট্রানজ্যাকশন আইডি প্রদান করুন। এতে ব্যবহারকারীর পছন্দের স্ক্রিনটি প্রদর্শিত হয় না , কারণ আপগ্রেড এবং ডাউনগ্রেডের জন্য মূল ক্রয়ের ব্যবহারকারীর পছন্দ সংরক্ষিত থাকে। এই ক্ষেত্রে launchBillingFlow() কলটি ট্রানজ্যাকশনটির জন্য একটি নতুন এক্সটার্নাল ট্রানজ্যাকশন টোকেন তৈরি করে, যা আপনি কলব্যাক থেকে পুনরুদ্ধার করতে পারবেন।

কোটলিন

// The external transaction ID from the current
// alternative billing subscription.
val externalTransactionId = //... ;

val billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(
        listOf(
            BillingFlowParams.ProductDetailsParams.newBuilder()
                // Fetched using queryProductDetailsAsync.
                .setProductDetails(productDetailsNewPlan)
                // offerIdToken can be found in
                // ProductDetails=>SubscriptionOfferDetails.
                .setOfferToken(offerTokenNewPlan)
                .build()
        )
    )
    .setSubscriptionUpdateParams(
        BillingFlowParams.SubscriptionUpdateParams.newBuilder()
            .setOriginalExternalTransactionId(externalTransactionId)
            .build()
        )
    .build()

val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)

// When the user selects the alternative billing flow,
// the UserChoiceBillingListener is triggered.

জাভা

// The external transaction ID from the current
// alternative billing subscription.
String externalTransactionId = //... ;

BillingFlowParams billingFlowParams =
    BillingFlowParams.newBuilder()
        .setProductDetailsParamsList(
            ImmutableList.of(
                ProductDetailsParams.newBuilder()
                    // Fetched using queryProductDetailsAsync.
                    .setProductDetails(productDetailsNewPlan)
                    // offerIdToken can be found in
                    // ProductDetails=>SubscriptionOfferDetails
                    .setOfferToken(offerTokenNewPlan)
                    .build()
                )
            )
        .setSubscriptionUpdateParams(
            SubscriptionUpdateParams.newBuilder()
                .setOriginalExternalTransactionId(externalTransactionId)
                .build()
            )
        .build();

BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

// When the user selects the alternative billing flow,
// the UserChoiceBillingListener is triggered.

বিকল্প বিলিং সিস্টেমে আপগ্রেড বা ডাউনগ্রেড সম্পন্ন হলে, নতুন সাবস্ক্রিপশন কেনার জন্য পূর্ববর্তী কলের মাধ্যমে প্রাপ্ত এক্সটার্নাল ট্রানজ্যাকশন টোকেন ব্যবহার করে একটি নতুন ট্রানজ্যাকশন রিপোর্ট করতে হবে।

গুগল প্লে-এর বিলিং সিস্টেমের মাধ্যমে কেনা সাবস্ক্রিপশন

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

  1. নতুন প্ল্যানের জন্য নির্বাচিত অফারটির offerToken শনাক্ত করুন:

    কোটলিন

    val offerTokenNewPlan = productDetailsNewPlan
         .getSubscriptionOfferDetails(selectedOfferIndex)
         .getOfferToken()
    

    জাভা

    String offerTokenNewPlan = productDetailsNewPlan
            .getSubscriptionOfferDetails(selectedOfferIndex)
            .getOfferToken();
    
  2. নতুন কেনাকাটাটি সম্পন্ন করার জন্য, বিদ্যমান সাবস্ক্রিপশনের পারচেজ টোকেন সহ সঠিক তথ্য Google Play-এর বিলিং সিস্টেমে পাঠান:

    কোটলিন

    val billingFlowParams =
        BillingFlowParams.newBuilder()
            .setProductDetailsParamsList(
                listOf(
                    BillingFlowParams.ProductDetailsParams.newBuilder()
                        // Fetched using queryProductDetailsAsync
                        .setProductDetails(productDetailsNewPlan)
                        // offerIdToken can be found in
                        // ProductDetails=>SubscriptionOfferDetails.
                        .setOfferToken(offerTokenNewPlan)
                        .build()
                    )
            )
            .setSubscriptionUpdateParams(
                BillingFlowParams.SubscriptionUpdateParams.newBuilder()
                    // purchaseToken can be found in
                    // Purchase#getPurchaseToken
                    .setOldPurchaseToken(oldToken)
                    .setReplaceProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_AND_CHARGE_FULL_PRICE)
                    .build()
            )
            .build()
    
    val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)
    

    জাভা

    BillingFlowParams billingFlowParams =
        BillingFlowParams.newBuilder()
            .setProductDetailsParamsList(
                ImmutableList.of(
                    ProductDetailsParams.newBuilder()
                        // Fetched using queryProductDetailsAsync
                        .setProductDetails(productDetailsNewPlan)
                        // offerIdToken can be found in
                        // ProductDetails=>SubscriptionOfferDetails.
                        .setOfferToken(offerTokenNewPlan)
                        .build()
                )
            )
            .setSubscriptionUpdateParams(
                SubscriptionUpdateParams.newBuilder()
                    // purchaseToken can be found in
                    // Purchase#getPurchaseToken
                    .setOldPurchaseToken(oldToken)
                    .setReplaceProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_AND_CHARGE_FULL_PRICE)
                    .build()
            )
            .build();
    
    BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
    

এই কেনাকাটাটি গুগল প্লে-এর বিলিং সিস্টেমে সম্পন্ন হয়, এবং আপনার অ্যাপ PurchasesUpdatedListener.onPurchaseUpdated কলটির মাধ্যমে কেনাকাটার ফলাফল গ্রহণ করে। কেনাকাটা সফল হলে, onPurchaseUpdated() মেথডটি নতুন কেনাকাটার তথ্যও গ্রহণ করে, এবং আপনার ব্যাকএন্ড একটি SUBSCRIPTION_PURCHASED রিয়েল টাইম ডেভেলপার নোটিফিকেশন পায়। নতুন কেনাকাটার স্ট্যাটাস দেখার সময়, একটি linkedPurchaseToken অ্যাট্রিবিউট পুরোনো সাবস্ক্রিপশন কেনাকাটার সাথে লিঙ্ক করে দেয়, যাতে আপনি সুপারিশ অনুযায়ী সেটিকে বাতিল করতে পারেন।

সাবস্ক্রিপশন বাতিলকরণ এবং পুনরুদ্ধার

ব্যবহারকারীরা যেকোনো সময় তাদের সাবস্ক্রিপশন বাতিল করতে পারবেন। যখন কোনো ব্যবহারকারী সাবস্ক্রিপশন বাতিল করেন, তখন পরিশোধিত সময়কাল শেষ না হওয়া পর্যন্ত সেই সুবিধাটির অবসান স্থগিত রাখা যেতে পারে। উদাহরণস্বরূপ, যদি কোনো ব্যবহারকারী মাসের মাঝামাঝি সময়ে একটি মাসিক সাবস্ক্রিপশন বাতিল করেন, তবে তার অ্যাক্সেস বাতিল না হওয়া পর্যন্ত তিনি বাকি প্রায় ২ সপ্তাহ পরিষেবাটি ব্যবহার করতে পারবেন। এই সময়কালে, সাবস্ক্রিপশনটি কার্যত সক্রিয় থাকে, তাই ব্যবহারকারী পরিষেবাটি ব্যবহার করতে পারেন।

এই সক্রিয় সময়কালে ব্যবহারকারীরা বাতিলকরণটি প্রত্যাহার করার সিদ্ধান্ত নিতে পারেন, যা অস্বাভাবিক নয়। এই নির্দেশিকায়, এটিকে পুনরুদ্ধার (restoration ) বলা হয়। নিম্নলিখিত বিভাগগুলিতে আপনার বিকল্প বিলিং এপিআই ইন্টিগ্রেশনে পুনরুদ্ধারের পরিস্থিতিগুলি কীভাবে পরিচালনা করবেন তা বর্ণনা করা হয়েছে।

বিকল্প বিলিং সিস্টেমের মাধ্যমে কেনা সাবস্ক্রিপশন

যদি বাতিল করা সাবস্ক্রিপশনের জন্য আপনার কাছে একটি এক্সটার্নাল ট্রানজ্যাকশন আইডি থাকে, তাহলে সাবস্ক্রিপশনটি পুনরুদ্ধার করার জন্য launchBillingFlow() কল করার প্রয়োজন নেই, তাই এই ধরনের অ্যাক্টিভেশনের জন্য এটি ব্যবহার করা উচিত নয়। যদি কোনো ব্যবহারকারী বাতিল করা সাবস্ক্রিপশনের সক্রিয় মেয়াদের মধ্যে থাকাকালীন তাদের সাবস্ক্রিপশন পুনরুদ্ধার করেন, তাহলে সেই সময়ে কোনো ট্রানজ্যাকশন সংঘটিত হয় না; বর্তমান চক্রের মেয়াদ শেষ হলে এবং পরবর্তী নবায়ন শুরু হলে আপনি কেবল নবায়নের রিপোর্ট করা চালিয়ে যেতে পারেন। এর মধ্যে সেইসব ক্ষেত্রও অন্তর্ভুক্ত যেখানে ব্যবহারকারী পুনরুদ্ধারের অংশ হিসাবে একটি ক্রেডিট বা বিশেষ নবায়ন মূল্য পান (উদাহরণস্বরূপ, ব্যবহারকারীকে তাদের সাবস্ক্রিপশন চালিয়ে যেতে উৎসাহিত করার জন্য একটি প্রোমোশন)।

গুগল প্লে-এর বিলিং সিস্টেমের মাধ্যমে কেনা সাবস্ক্রিপশন

সাধারণত, ব্যবহারকারীরা গুগল প্লে-এর বিলিং সিস্টেমে সাবস্ক্রিপশন পুনরুদ্ধার করতে পারেন। বাতিল করা সাবস্ক্রিপশনের ক্ষেত্রে, যা মূলত গুগল প্লে-এর বিলিং সিস্টেম থেকে কেনা হয়েছিল, ব্যবহারকারী সাবস্ক্রিপশনটি সক্রিয় থাকা অবস্থায় গুগল প্লে-এর ' রিসাবস্ক্রাইব' ফিচারের মাধ্যমে বাতিলকরণটি বাতিল করতে পারেন। সেক্ষেত্রে, আপনি আপনার ব্যাকএন্ডে একটি SUBSCRIPTION_RESTARTED রিয়েল টাইম ডেভেলপার নোটিফিকেশন পাবেন এবং কোনো নতুন পারচেজ টোকেন ইস্যু করা হবে না —সাবস্ক্রিপশনটি চালু রাখার জন্য মূল টোকেনটিই ব্যবহৃত হবে। গুগল প্লে-এর বিলিং সিস্টেমে কীভাবে পুনরুদ্ধার পরিচালনা করতে হয় তা জানতে, সাবস্ক্রিপশন ম্যানেজমেন্ট গাইডের ' রিস্টোরেশনস' অংশটি দেখুন।

আপনি অ্যাপ থেকে launchBillingFlow() কল করে Google Play-এর বিলিং সিস্টেমেও একটি পুনরুদ্ধার প্রক্রিয়া শুরু করতে পারেন। এটি কীভাবে করতে হয় তার ব্যাখ্যার জন্য "সাবস্ক্রিপশন মেয়াদ শেষ হওয়ার আগে - অ্যাপের মধ্যে" দেখুন। যে ব্যবহারকারীরা মূল ক্রয়ের জন্য (যা বাতিল করা হয়েছে কিন্তু এখনও সক্রিয় আছে) ব্যবহারকারীর পছন্দের প্রক্রিয়াটি সম্পন্ন করেছিলেন, তাদের ক্ষেত্রে সিস্টেম স্বয়ংক্রিয়ভাবে তাদের পছন্দ শনাক্ত করে এবং এই ক্রয়গুলি পুনরুদ্ধার করার জন্য ইউজার ইন্টারফেস প্রদর্শন করে। তাদের Google Play-এর মাধ্যমে সাবস্ক্রিপশনটি পুনরায় কেনার বিষয়টি নিশ্চিত করতে বলা হয়, কিন্তু তাদের আবার ব্যবহারকারীর পছন্দের প্রক্রিয়াটি সম্পন্ন করার প্রয়োজন হয় না। এই ক্ষেত্রে ব্যবহারকারীর জন্য একটি নতুন পারচেজ টোকেন ইস্যু করা হয়। আপনার ব্যাকএন্ড একটি SUBSCRIPTION_PURCHASED রিয়েল টাইম ডেভেলপার নোটিফিকেশন পায়, এবং বাতিল করা সাবস্ক্রিপশনের পুরানো পারচেজ টোকেন ব্যবহার করে নতুন ক্রয়ের স্ট্যাটাসের জন্য linkedPurchaseToken ভ্যালুটি আপগ্রেড বা ডাউনগ্রেডের মতোই সেট করা হয়।

পুনঃসাবস্ক্রিপশন

যদি কোনো সাবস্ক্রিপশন সম্পূর্ণরূপে মেয়াদোত্তীর্ণ হয়ে যায়, তা বাতিলের কারণে হোক বা পুনরুদ্ধার ছাড়াই পেমেন্ট প্রত্যাখ্যানের (মেয়াদোত্তীর্ণ অ্যাকাউন্ট হোল্ড) কারণে হোক, তাহলে ব্যবহারকারীকে তার অধিকার পুনরায় চালু করতে চাইলে অবশ্যই পুনরায় সাবস্ক্রাইব করতে হবে।

একটি সাধারণ সাইনআপের মতোই অ্যাপের মাধ্যমে পুনরায় সাবস্ক্রাইব করার প্রক্রিয়াটিও চালু করা যেতে পারে। ব্যবহারকারীরা কোন বিলিং সিস্টেম ব্যবহার করতে চান, তা বেছে নেওয়ার সুযোগ থাকা উচিত। এক্ষেত্রে launchBillingFlow() কল করা যেতে পারে, যেমনটি "ব্যবহারকারীর পছন্দের বিলিং ফ্লো চালু করুন" অংশে বর্ণনা করা হয়েছে।

পরীক্ষার বিকল্প বিলিং

আপনার বিকল্প বিলিং ইন্টিগ্রেশন পরীক্ষা করার জন্য লাইসেন্স টেস্টার ব্যবহার করা উচিত। লাইসেন্স টেস্টার অ্যাকাউন্ট দ্বারা শুরু করা লেনদেনের জন্য আপনাকে চালান পাঠানো হবে না। লাইসেন্স টেস্টার কনফিগার করার বিষয়ে আরও তথ্যের জন্য ‘অ্যাপ্লিকেশন লাইসেন্সিং সহ ইন-অ্যাপ বিলিং পরীক্ষা করুন’ দেখুন।

পরবর্তী পদক্ষেপ

একবার আপনি অ্যাপের ভেতরের ইন্টিগ্রেশন শেষ করে ফেললে, আপনার ব্যাকএন্ড ইন্টিগ্রেট করার জন্য আপনি প্রস্তুত।