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

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

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

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

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

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

  • আপনি ব্যবহারকারীকে বিলিং বিকল্পগুলির একটি পছন্দ অফার করতে চান তা নির্দেশ করার জন্য আপনাকে একটি নতুন পদ্ধতিতে কল করতে হবে: enableUserChoiceBilling
  • ব্যবহারকারী বিকল্প বিলিং বেছে নেওয়ার ক্ষেত্রে আপনাকে একটি UserChoiceBillingListener রেজিস্টার করতে হবে।

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

কোটলিন

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

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

var 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-তে একটি সংযোগ স্থাপন করতে হবে।

উপলব্ধ পণ্য প্রদর্শন

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

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

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

ডেভেলপাররা যখন launchBillingFlow() কল করে, তখন Google Play বিলিং সিস্টেম নিম্নলিখিত চেকটি সম্পাদন করে:

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

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

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

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

ব্যবহারকারী ব্যবহারকারীর পছন্দ UX দেখেন

ব্যবহারকারী স্ট্যান্ডার্ড Google Play বিলিং সিস্টেম UX দেখেন

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

ব্যবহারকারী স্ট্যান্ডার্ড Google Play বিলিং সিস্টেম UX দেখেন

ব্যবহারকারী স্ট্যান্ডার্ড Google Play বিলিং সিস্টেম UX দেখেন

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

ব্যবহারকারী Google Play-এর বিলিং সিস্টেম বা বিকল্প বিলিং সিস্টেম বেছে নিয়েছেন কিনা তার উপর নির্ভর করে আপনি বাকি ক্রয় প্রবাহ কীভাবে পরিচালনা করেন।

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

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

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

UserChoiceBillingListener নিম্নলিখিত ক্রিয়াগুলি সম্পাদন করবে:

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

যদি ব্যবহারকারী বিকল্প বিলিং সিস্টেম ব্যবহার করে কেনাকাটা সম্পূর্ণ করেন, তাহলে আপনাকে অবশ্যই 24 ঘন্টার মধ্যে আপনার ব্যাকএন্ড থেকে Google Play ডেভেলপার 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 এর বিলিং সিস্টেম নির্বাচন করেন

ব্যবহারকারী যদি Google Play-এর বিলিং সিস্টেম বেছে নেন, তাহলে তারা Google Play-এর মাধ্যমে ক্রয় চালিয়ে যান।

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

সদস্যতা পরিবর্তন পরিচালনা করুন

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

কিছু সাধারণ সাবস্ক্রিপশন পরিবর্তনের পরিস্থিতি কীভাবে পরিচালনা করবেন তা এই বিভাগে বর্ণনা করে।

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

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

অ্যাড-অন যা একটি বিদ্যমান সাবস্ক্রিপশনের উপর নির্ভর করে, একই অর্থপ্রদানের পদ্ধতি ভাগ করে এবং পুনরাবৃত্ত চার্জগুলিকে আপগ্রেড হিসাবে পরিচালনা করা হয়। অন্যান্য অ্যাড-অনগুলির জন্য, ব্যবহারকারীরা কোন বিলিং সিস্টেম ব্যবহার করতে চান তা চয়ন করতে সক্ষম হওয়া উচিত। ব্যবহারকারীর পছন্দ বিলিং ফ্লো লঞ্চ করুন- এ বর্ণিত 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 via queryProductDetailsAsync.
                .setProductDetails(productDetailsNewPlan)
                // offerIdToken can be found in
                // ProductDetails=>SubscriptionOfferDetails.
                .setOfferToken(offerTokenNewPlan)
                .build()
        )
    )
    .setSubscriptionUpdateParams(
        BillingFlowParams.SubscriptionUpdateParams.newBuilder()
            .setOriginalExternalTransactionId(externalTransactionId)
            .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 via 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.

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

Google Play এর বিলিং সিস্টেমের মাধ্যমে কেনা সদস্যতা

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

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

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

String offerTokenNewPlan = productDetailsNewPlan
                     .getSubscriptionOfferDetails(selectedOfferIndex)
                     .getOfferToken();

  1. বিদ্যমান সাবস্ক্রিপশনের ক্রয়ের টোকেন সহ নতুন ক্রয় প্রক্রিয়া করতে Google Play এর বিলিং সিস্টেমে সঠিক তথ্য পাঠান:

val billingFlowParams =
    BillingFlowParams.newBuilder().setProductDetailsParamsList(
        listOf(
            BillingFlowParams.ProductDetailsParams.newBuilder()
                .setProductDetails(productDetailsNewPlan)
                .setOfferToken(offerTokenNewPlan)
                .build()
        )
    )
    .setSubscriptionUpdateParams(
        BillingFlowParams.SubscriptionUpdateParams.newBuilder()
            .setOldPurchaseToken(oldToken)
            .setReplaceProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_AND_CHARGE_FULL_PRICE)
            .build()
        )
        .build()

BillingClient.launchBillingFlow(activity, billingFlowParams)

BillingFlowParams billingFlowParams =
        BillingFlowParams.newBuilder()
            .setProductDetailsParamsList(
                ImmutableList.of(
                    ProductDetailsParams.newBuilder()
                        // Fetched via queryProductDetailsAsync
                        .setProductDetails(productDetailsNewPlan)
                        // offerIdToken can be found in
                        // ProductDetails=>SubscriptionOfferDetails.
                        .setOfferToken(offerTokenNewPlan)
                        .build()
                )
            )
            .setSubscriptionUpdateParams(
                SubscriptionUpdateParams.newBuilder()
                    // purchaseToken can be found in
                    // Purchase#getPurchaseToken
                    .setOldPurchaseToken("old_purchase_token")
                    .setReplaceProrationMode(ProrationMode.IMMEDIATE_AND_CHARGE_FULL_PRICE)
                    .build()
            )
            .build();

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

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

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

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

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

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

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

Google Play এর বিলিং সিস্টেমের মাধ্যমে কেনা সদস্যতা

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

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

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

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

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

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

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

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

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