আপনার অ্যাপে Google Play বিলিং লাইব্রেরি সংহত করুন

এই বিষয়টি বর্ণনা করে যে কীভাবে পণ্য বিক্রি শুরু করতে আপনার অ্যাপে Google Play বিলিং লাইব্রেরি সংহত করতে হয়।

একটি ক্রয় জীবন

এখানে এককালীন কেনাকাটা বা সাবস্ক্রিপশনের জন্য একটি সাধারণ ক্রয় প্রবাহ।

  1. তারা কি কিনতে পারে ব্যবহারকারীকে দেখান।
  2. ক্রয় গ্রহণ করার জন্য ব্যবহারকারীর জন্য ক্রয় প্রবাহ চালু করুন।
  3. আপনার সার্ভারে ক্রয় যাচাই করুন.
  4. ব্যবহারকারীকে বিষয়বস্তু দিন।
  5. কন্টেন্ট ডেলিভারি স্বীকার করুন. ব্যবহারযোগ্য পণ্যগুলির জন্য, ক্রয়টি গ্রহণ করুন যাতে ব্যবহারকারী আবার আইটেমটি কিনতে পারেন।

সদস্যতাগুলি বাতিল না হওয়া পর্যন্ত স্বয়ংক্রিয়ভাবে পুনর্নবীকরণ হয়। একটি সাবস্ক্রিপশন নিম্নলিখিত রাজ্যগুলির মধ্য দিয়ে যেতে পারে:

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

Google Play-তে একটি সংযোগ শুরু করুন৷

Google Play এর বিলিং সিস্টেমের সাথে সংহত করার প্রথম ধাপ হল আপনার অ্যাপে Google Play বিলিং লাইব্রেরি যোগ করা এবং একটি সংযোগ শুরু করা।

Google Play বিলিং লাইব্রেরি নির্ভরতা যোগ করুন

আপনার অ্যাপের build.gradle ফাইলে Google Play বিলিং লাইব্রেরি নির্ভরতা যোগ করুন যেমন দেখানো হয়েছে:

গ্রোভি

dependencies {
    def billing_version = "7.0.0"

    implementation "com.android.billingclient:billing:$billing_version"
}

কোটলিন

dependencies {
    val billing_version = "7.0.0"

    implementation("com.android.billingclient:billing:$billing_version")
}

আপনি যদি Kotlin ব্যবহার করেন, Google Play বিলিং লাইব্রেরি KTX মডিউলে Kotlin এক্সটেনশন এবং coroutines সমর্থন রয়েছে যা Google Play বিলিং লাইব্রেরি ব্যবহার করার সময় আপনাকে বাগধারাপূর্ণ Kotlin লিখতে সক্ষম করে। আপনার প্রকল্পে এই এক্সটেনশনগুলি অন্তর্ভুক্ত করতে, আপনার অ্যাপের build.gradle ফাইলে দেখানো হিসাবে নিম্নলিখিত নির্ভরতা যোগ করুন:

গ্রোভি

dependencies {
    def billing_version = "7.0.0"

    implementation "com.android.billingclient:billing-ktx:$billing_version"
}

কোটলিন

dependencies {
    val billing_version = "7.0.0"

    implementation("com.android.billingclient:billing-ktx:$billing_version")
}

একটি বিলিং ক্লায়েন্ট শুরু করুন

একবার আপনি Google Play বিলিং লাইব্রেরিতে একটি নির্ভরতা যোগ করলে, আপনাকে একটি BillingClient ইনস্ট্যান্স শুরু করতে হবে। BillingClient হল Google Play বিলিং লাইব্রেরি এবং আপনার বাকি অ্যাপের মধ্যে যোগাযোগের প্রধান ইন্টারফেস। BillingClient অনেক সাধারণ বিলিং ক্রিয়াকলাপের জন্য সিঙ্ক্রোনাস এবং অ্যাসিঙ্ক্রোনাস উভয় সুবিধার পদ্ধতি প্রদান করে। একক ইভেন্টের জন্য একাধিক PurchasesUpdatedListener কলব্যাক এড়াতে আপনার কাছে একবারে একটি সক্রিয় BillingClient সংযোগ খোলা থাকার দৃঢ়ভাবে সুপারিশ করা হয়।

একটি BillingClient তৈরি করতে, newBuilder() ব্যবহার করুন। আপনি newBuilder() এ যেকোনো প্রসঙ্গ পাস করতে পারেন, এবং BillingClient একটি অ্যাপ্লিকেশন প্রসঙ্গ পেতে এটি ব্যবহার করে। এর মানে আপনার মেমরি লিক সম্পর্কে চিন্তা করার দরকার নেই। কেনাকাটার আপডেট পেতে, আপনাকে অবশ্যই একটি PurchasesUpdatedListener এর একটি রেফারেন্স দিয়ে setListener() কল করতে হবে। এই শ্রোতা আপনার অ্যাপে সমস্ত কেনাকাটার জন্য আপডেট পায়।

কোটলিন

private val purchasesUpdatedListener =
   PurchasesUpdatedListener { billingResult, purchases ->
       // To be implemented in a later section.
   }

private var billingClient = BillingClient.newBuilder(context)
   .setListener(purchasesUpdatedListener)
   // Configure other settings.
   .build()

জাভা

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
    @Override
    public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
        // To be implemented in a later section.
    }
};

private BillingClient billingClient = BillingClient.newBuilder(context)
    .setListener(purchasesUpdatedListener)
    // Configure other settings.
    .build();

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

আপনি একটি BillingClient তৈরি করার পরে, আপনাকে Google Play এর সাথে একটি সংযোগ স্থাপন করতে হবে৷

Google Play এর সাথে সংযোগ করতে, startConnection() এ কল করুন। সংযোগ প্রক্রিয়াটি অ্যাসিঙ্ক্রোনাস, এবং ক্লায়েন্টের সেটআপ সম্পূর্ণ হয়ে গেলে এবং এটি আরও অনুরোধ করার জন্য প্রস্তুত হলে একটি কলব্যাক পেতে আপনাকে অবশ্যই একটি BillingClientStateListener প্রয়োগ করতে হবে।

Google Play-তে হারিয়ে যাওয়া সংযোগগুলি পরিচালনা করতে আপনাকে অবশ্যই পুনরায় চেষ্টা করার যুক্তি প্রয়োগ করতে হবে৷ পুনরায় চেষ্টা করার যুক্তি প্রয়োগ করতে, onBillingServiceDisconnected() কলব্যাক পদ্ধতিটি ওভাররাইড করুন এবং আরও অনুরোধ করার আগে BillingClient Google Play-তে পুনরায় সংযোগ করার জন্য startConnection() পদ্ধতিতে কল করে কিনা তা নিশ্চিত করুন৷

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি সংযোগ শুরু করতে হয় এবং এটি ব্যবহারের জন্য প্রস্তুত কিনা তা পরীক্ষা করে:

কোটলিন

billingClient.startConnection(object : BillingClientStateListener {
    override fun onBillingSetupFinished(billingResult: BillingResult) {
        if (billingResult.responseCode ==  BillingResponseCode.OK) {
            // The BillingClient is ready. You can query purchases here.
        }
    }
    override fun onBillingServiceDisconnected() {
        // Try to restart the connection on the next request to
        // Google Play by calling the startConnection() method.
    }
})

জাভা

billingClient.startConnection(new BillingClientStateListener() {
    @Override
    public void onBillingSetupFinished(BillingResult billingResult) {
        if (billingResult.getResponseCode() ==  BillingResponseCode.OK) {
            // The BillingClient is ready. You can query purchases here.
        }
    }
    @Override
    public void onBillingServiceDisconnected() {
        // Try to restart the connection on the next request to
        // Google Play by calling the startConnection() method.
    }
});

কিনতে উপলব্ধ পণ্য দেখান

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

আপনার ব্যবহারকারীদের কাছে আপনার পণ্যগুলি প্রদর্শন করার আগে পণ্যের বিবরণের জন্য অনুসন্ধান করা একটি গুরুত্বপূর্ণ পদক্ষেপ, কারণ এটি স্থানীয় পণ্যের তথ্য প্রদান করে। সাবস্ক্রিপশনের জন্য, নিশ্চিত করুন যে আপনার পণ্যের প্রদর্শন সমস্ত Play নীতি অনুসরণ করে

অ্যাপ-মধ্যস্থ পণ্যের বিবরণ জানতে, queryProductDetailsAsync() এ কল করুন।

অ্যাসিঙ্ক্রোনাস অপারেশনের ফলাফল পরিচালনা করতে, আপনাকে অবশ্যই একটি শ্রোতা নির্দিষ্ট করতে হবে যা ProductDetailsResponseListener ইন্টারফেস প্রয়োগ করে। তারপরে আপনি onProductDetailsResponse() ওভাররাইড করতে পারেন, যা শ্রোতাকে অবহিত করে যখন প্রশ্নটি শেষ হয়, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

val queryProductDetailsParams =
    QueryProductDetailsParams.newBuilder()
        .setProductList(
            ImmutableList.of(
                Product.newBuilder()
                    .setProductId("product_id_example")
                    .setProductType(ProductType.SUBS)
                    .build()))
        .build()

billingClient.queryProductDetailsAsync(queryProductDetailsParams) {
    billingResult,
    productDetailsList ->
      // check billingResult
      // process returned productDetailsList
}

জাভা

QueryProductDetailsParams queryProductDetailsParams =
    QueryProductDetailsParams.newBuilder()
        .setProductList(
            ImmutableList.of(
                Product.newBuilder()
                    .setProductId("product_id_example")
                    .setProductType(ProductType.SUBS)
                    .build()))
        .build();

billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
        public void onProductDetailsResponse(BillingResult billingResult,
                List<ProductDetails> productDetailsList) {
            // check billingResult
            // process returned productDetailsList
        }
    }
)

পণ্যের বিবরণের জন্য অনুসন্ধান করার সময়, QueryProductDetailsParams এর একটি উদাহরণ পাস করুন যা একটি ProductType সহ Google Play Console-এ তৈরি পণ্য আইডি স্ট্রিংগুলির একটি তালিকা নির্দিষ্ট করে। ProductType এককালীন পণ্যের জন্য ProductType.INAPP বা সদস্যতার জন্য ProductType.SUBS হতে পারে৷

কোটলিন এক্সটেনশনের সাথে প্রশ্ন করা হচ্ছে

আপনি যদি Kotlin এক্সটেনশন ব্যবহার করেন , তাহলে আপনি queryProductDetails() এক্সটেনশন ফাংশনে কল করে অ্যাপ-মধ্যস্থ পণ্যের বিশদ বিবরণ জানতে পারেন।

queryProductDetails() Kotlin coroutines ব্যবহার করে যাতে আপনাকে আলাদা শ্রোতা সংজ্ঞায়িত করতে হয় না। পরিবর্তে, ক্যোয়ারী সম্পূর্ণ না হওয়া পর্যন্ত ফাংশনটি স্থগিত থাকে, যার পরে আপনি ফলাফলটি প্রক্রিয়া করতে পারেন:

suspend fun processPurchases() {
    val productList = listOf(
        QueryProductDetailsParams.Product.newBuilder()
            .setProductId("product_id_example")
            .setProductType(BillingClient.ProductType.SUBS)
            .build()
    )
    val params = QueryProductDetailsParams.newBuilder()
    params.setProductList(productList)

    // leverage queryProductDetails Kotlin extension function
    val productDetailsResult = withContext(Dispatchers.IO) {
        billingClient.queryProductDetails(params.build())
    }

    // Process the result.
}

কদাচিৎ, কিছু ডিভাইস ProductDetails এবং queryProductDetailsAsync() সমর্থন করতে পারে না, সাধারণত Google Play পরিষেবার পুরানো সংস্করণের কারণে। এই দৃশ্যের জন্য যথাযথ সমর্থন নিশ্চিত করতে, প্লে বিলিং লাইব্রেরি 5 মাইগ্রেশন গাইডে পিছনের সামঞ্জস্যপূর্ণ বৈশিষ্ট্যগুলি কীভাবে ব্যবহার করবেন তা শিখুন।

ফলাফল প্রক্রিয়া করুন

Google Play বিলিং লাইব্রেরি ProductDetails অবজেক্টের একটি List প্রশ্নের ফলাফল সঞ্চয় করে। আপনি তারপর একটি ইন-অ্যাপ পণ্য সম্পর্কে প্রাসঙ্গিক তথ্য, যেমন এর মূল্য বা বিবরণ দেখতে তালিকার প্রতিটি ProductDetails বস্তুতে বিভিন্ন পদ্ধতিতে কল করতে পারেন৷ উপলব্ধ পণ্যের বিস্তারিত তথ্য দেখতে, ProductDetails ক্লাসে পদ্ধতির তালিকা দেখুন।

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

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

  • queryProductDetailsAsync() সাবস্ক্রিপশন পণ্যের বিবরণ এবং প্রতি সাবস্ক্রিপশনে সর্বাধিক 50টি অফার প্রদান করে।
  • queryProductDetailsAsync() শুধুমাত্র অফার প্রদান করে যার জন্য ব্যবহারকারী যোগ্য। ব্যবহারকারী যদি এমন একটি অফার কেনার চেষ্টা করে যার জন্য তারা অযোগ্য (উদাহরণস্বরূপ, অ্যাপটি যদি যোগ্য অফারগুলির একটি পুরানো তালিকা প্রদর্শন করে), তাহলে Play ব্যবহারকারীকে জানায় যে তারা অযোগ্য এবং ব্যবহারকারী বেস প্ল্যান কেনার জন্য বেছে নিতে পারেন পরিবর্তে

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

আপনার অ্যাপ থেকে ক্রয়ের অনুরোধ শুরু করতে, আপনার অ্যাপের মূল থ্রেড থেকে launchBillingFlow() পদ্ধতিতে কল করুন। এই পদ্ধতিটি একটি BillingFlowParams অবজেক্টের একটি রেফারেন্স নেয় যেখানে কলিং queryProductDetailsAsync() থেকে প্রাপ্ত প্রাসঙ্গিক ProductDetails অবজেক্ট রয়েছে। একটি BillingFlowParams অবজেক্ট তৈরি করতে, BillingFlowParams.Builder ক্লাস ব্যবহার করুন।

কোটলিন

// An activity reference from which the billing flow will be launched.
val activity : Activity = ...;

val productDetailsParamsList = listOf(
    BillingFlowParams.ProductDetailsParams.newBuilder()
        // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
        .setProductDetails(productDetails)
        // For One-time product, "setOfferToken" method shouldn't be called.
        // For subscriptions, to get an offer token, call ProductDetails.subscriptionOfferDetails()
        // for a list of offers that are available to the user
        .setOfferToken(selectedOfferToken)
        .build()
)

val billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .build()

// Launch the billing flow
val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)

জাভা

// An activity reference from which the billing flow will be launched.
Activity activity = ...;

ImmutableList<ProductDetailsParams> productDetailsParamsList =
    ImmutableList.of(
        ProductDetailsParams.newBuilder()
             // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // For one-time products, "setOfferToken" method shouldn't be called.
            // For subscriptions, to get an offer token, call
            // ProductDetails.subscriptionOfferDetails() for a list of offers
            // that are available to the user.
            .setOfferToken(selectedOfferToken)
            .build()
    );

BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .build();

// Launch the billing flow
BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

launchBillingFlow() পদ্ধতি BillingClient.BillingResponseCode এ তালিকাভুক্ত বেশ কয়েকটি প্রতিক্রিয়া কোডের একটি প্রদান করে। ক্রয় প্রবাহ চালু করার সময় কোন ত্রুটি ছিল না তা নিশ্চিত করতে এই ফলাফলটি পরীক্ষা করতে ভুলবেন না। OK একটি BillingResponseCode একটি সফল লঞ্চ নির্দেশ করে।

launchBillingFlow() করার জন্য একটি সফল কলে, সিস্টেমটি Google Play ক্রয়ের স্ক্রীন প্রদর্শন করে। চিত্র 1 একটি সদস্যতার জন্য একটি ক্রয় স্ক্রীন দেখায়:

গুগল প্লে ক্রয় স্ক্রীন একটি সাবস্ক্রিপশন দেখায় যা ক্রয়ের জন্য উপলব্ধ
চিত্র 1. Google Play ক্রয় স্ক্রীন একটি সাবস্ক্রিপশন দেখায় যা ক্রয়ের জন্য উপলব্ধ।

Google Play onPurchasesUpdated() ক্রয় অপারেশনের ফলাফল এমন একজন শ্রোতার কাছে পৌঁছে দিতে কল করে যা PurchasesUpdatedListener ইন্টারফেস প্রয়োগ করে। আপনি যখন আপনার ক্লায়েন্ট আরম্ভ করেন তখন setListener() পদ্ধতি ব্যবহার করে শ্রোতাকে নির্দিষ্ট করা হয়।

সম্ভাব্য প্রতিক্রিয়া কোডগুলি পরিচালনা করতে আপনাকে অবশ্যই onPurchasesUpdated() প্রয়োগ করতে হবে। নিম্নলিখিত উদাহরণ দেখায় কিভাবে onPurchasesUpdated() ওভাররাইড করতে হয়:

কোটলিন

override fun onPurchasesUpdated(billingResult: BillingResult, purchases: List<Purchase>?) {
   if (billingResult.responseCode == BillingResponseCode.OK && purchases != null) {
       for (purchase in purchases) {
           handlePurchase(purchase)
       }
   } else if (billingResult.responseCode == BillingResponseCode.USER_CANCELED) {
       // Handle an error caused by a user cancelling the purchase flow.
   } else {
       // Handle any other error codes.
   }
}

জাভা

@Override
void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
    if (billingResult.getResponseCode() == BillingResponseCode.OK
        && purchases != null) {
        for (Purchase purchase : purchases) {
            handlePurchase(purchase);
        }
    } else if (billingResult.getResponseCode() == BillingResponseCode.USER_CANCELED) {
        // Handle an error caused by a user cancelling the purchase flow.
    } else {
        // Handle any other error codes.
    }
}

একটি সফল ক্রয় চিত্র 2 এর মতো একটি Google Play ক্রয় সাফল্যের স্ক্রীন তৈরি করে৷

গুগল প্লে এর ক্রয় সাফল্যের স্ক্রিন
চিত্র 2. Google Play এর ক্রয় সাফল্যের স্ক্রীন।

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

ব্যবহারকারীকে একটি অর্ডার আইডি বা লেনদেনের একটি অনন্য আইডি সহ লেনদেনের একটি রসিদও ইমেল করা হয়। ব্যবহারকারীরা প্রতিটি এক-কালীন পণ্য ক্রয়ের জন্য একটি অনন্য অর্ডার আইডি সহ একটি ইমেল পান এবং প্রাথমিক সদস্যতা ক্রয় এবং পরবর্তী পুনরাবৃত্ত স্বয়ংক্রিয় পুনর্নবীকরণের জন্যও। আপনি Google Play কনসোলে অর্থ ফেরত পরিচালনা করতে অর্ডার আইডি ব্যবহার করতে পারেন।

একটি ব্যক্তিগতকৃত মূল্য নির্দেশ করুন

যদি আপনার অ্যাপটি ইউরোপীয় ইউনিয়নের ব্যবহারকারীদের কাছে বিতরণ করা যায়, তাহলে ব্যবহারকারীদের কাছে প্রকাশ করতে setIsOfferPersonalized() পদ্ধতি ব্যবহার করুন যে একটি আইটেমের মূল্য স্বয়ংক্রিয় সিদ্ধান্ত গ্রহণের মাধ্যমে ব্যক্তিগতকৃত করা হয়েছে।

Google Play ক্রয় স্ক্রীন নির্দেশ করে যে দামটি ব্যবহারকারীর জন্য কাস্টমাইজ করা হয়েছে।
চিত্র 3. Google Play ক্রয় স্ক্রীন নির্দেশ করে যে দামটি ব্যবহারকারীর জন্য কাস্টমাইজ করা হয়েছে৷

আপনি আর্ট পরামর্শ করতে হবে. 6 (1) (ea) ভোক্তা অধিকার নির্দেশিকা 2011/83/EU- এর CRD আপনি ব্যবহারকারীদের জন্য যে মূল্য অফার করছেন তা ব্যক্তিগতকৃত কিনা তা নির্ধারণ করতে।

setIsOfferPersonalized() একটি বুলিয়ান ইনপুট নেয়। true হলে, প্লে UI প্রকাশ অন্তর্ভুক্ত করে। false হলে, UI প্রকাশটি বাদ দেয়। ডিফল্ট মান false

আরও তথ্যের জন্য ভোক্তা সহায়তা কেন্দ্র দেখুন।

ক্রয় প্রক্রিয়াকরণ

একবার একজন ব্যবহারকারী একটি ক্রয় সম্পূর্ণ করলে, আপনার অ্যাপটিকে সেই ক্রয় প্রক্রিয়া করতে হবে। বেশিরভাগ ক্ষেত্রে, আপনার অ্যাপটি আপনার PurchasesUpdatedListener মাধ্যমে কেনাকাটার বিষয়ে অবহিত করা হয়। যাইহোক, এমন কিছু ক্ষেত্রে রয়েছে যেখানে আপনার অ্যাপটিকে BillingClient.queryPurchasesAsync() এ কল করে কেনাকাটার বিষয়ে সচেতন করা হবে, যেমনটি কেনাকাটা ফেচিং এ বর্ণনা করা হয়েছে।

অতিরিক্তভাবে, আপনার সুরক্ষিত ব্যাকএন্ডে যদি আপনার একটি রিয়েল টাইম ডেভেলপার বিজ্ঞপ্তি ক্লায়েন্ট থাকে, তাহলে আপনি একটি subscriptionNotification বা একটি oneTimeProductNotification পেয়ে নতুন কেনাকাটা নিবন্ধন করতে পারেন যা আপনাকে একটি নতুন ক্রয়ের বিষয়ে সতর্ক করে। এই বিজ্ঞপ্তিগুলি পাওয়ার পরে, সম্পূর্ণ স্থিতি পেতে এবং আপনার নিজস্ব ব্যাকএন্ড অবস্থা আপডেট করতে Google Play বিকাশকারী API-কে কল করুন৷

আপনার অ্যাপ নিম্নলিখিত উপায়ে একটি ক্রয় প্রক্রিয়া করা উচিত:

  1. ক্রয় যাচাই করুন.
  2. ব্যবহারকারীকে সামগ্রী দিন এবং সামগ্রীর বিতরণ স্বীকার করুন৷ ঐচ্ছিকভাবে, আইটেমটিকে গ্রাস করা হিসাবে চিহ্নিত করুন যাতে ব্যবহারকারী আবার আইটেমটি কিনতে পারেন।

একটি ক্রয় যাচাই করতে, প্রথমে যাচাই করুন যে ক্রয় অবস্থাটি PURCHASED হয়েছে৷ যদি ক্রয়টি PENDING থাকে, তাহলে আপনার মুলতুবি লেনদেন পরিচালনার বর্ণনা অনুযায়ী ক্রয় প্রক্রিয়া করা উচিত। onPurchasesUpdated() বা queryPurchasesAsync() থেকে প্রাপ্ত কেনাকাটার জন্য, আপনার অ্যাপটি এনটাইটেলমেন্ট দেওয়ার আগে বৈধতা নিশ্চিত করতে আপনাকে ক্রয়টি আরও যাচাই করতে হবে। কিভাবে একটি ক্রয় সঠিকভাবে যাচাই করতে হয় তা জানতে, এনটাইটেলমেন্ট দেওয়ার আগে ক্রয় যাচাই করুন দেখুন।

একবার আপনি ক্রয় যাচাই করে নিলে, আপনার অ্যাপ ব্যবহারকারীকে এনটাইটেলমেন্ট দেওয়ার জন্য প্রস্তুত। ক্রয়ের সাথে যুক্ত ব্যবহারকারীর অ্যাকাউন্টটি Purchases.products দ্বারা প্রত্যাবর্তিত ProductPurchase.obfuscatedExternalAccountId দ্বারা চিহ্নিত করা যেতে পারে Purchases.products:get এবং Purchases.subscriptions দ্বারা ফেরত দেওয়া SubscriptionPurchase.obfuscatedExternalAccountId Purchases.subscriptions:get , obfuscatedAccountId থেকে পরিষেবাতে Purchase.getAccountIdentifiers() ক্লায়েন্ট সাইডে, যদি কেনার সময় setObfuscatedAccountId দিয়ে সেট করা থাকে।

এনটাইটেলমেন্ট দেওয়ার পরে, আপনার অ্যাপকে অবশ্যই ক্রয় স্বীকার করতে হবে। এই স্বীকৃতি Google Play-তে যোগাযোগ করে যে আপনি ক্রয়ের জন্য এনটাইটেলমেন্ট দিয়েছেন।

এনটাইটেলমেন্ট মঞ্জুর করার এবং ক্রয় স্বীকার করার প্রক্রিয়াটি ক্রয়টি একটি ভোগ্য, একটি অ-ভোগযোগ্য, বা একটি সদস্যতার উপর নির্ভর করে।

ভোগ্য পণ্য

ভোগ্য সামগ্রীর জন্য, যদি আপনার অ্যাপের একটি নিরাপদ ব্যাকএন্ড থাকে, তাহলে আমরা সুপারিশ করি যে আপনি নির্ভরযোগ্যভাবে কেনাকাটা করার জন্য Purchases.products:consume ব্যবহার করুন। Purchases.products:get কল করার ফলাফল থেকে consumptionState চেক করে নিশ্চিত করুন যে ক্রয়টি ইতিমধ্যেই সেবন করা হয়নি। যদি আপনার অ্যাপটি ব্যাকএন্ড ছাড়া শুধুমাত্র ক্লায়েন্টের জন্য হয়, তাহলে Google Play বিলিং লাইব্রেরি থেকে consumeAsync() ব্যবহার করুন। উভয় পদ্ধতিই স্বীকৃতির প্রয়োজনীয়তা পূরণ করে এবং নির্দেশ করে যে আপনার অ্যাপ ব্যবহারকারীকে এনটাইটেলমেন্ট দিয়েছে। এই পদ্ধতিগুলি পুনঃক্রয়ের জন্য উপলব্ধ ইনপুট ক্রয় টোকেনের সাথে সম্পর্কিত এককালীন পণ্য তৈরি করতে আপনার অ্যাপকে সক্ষম করে৷ consumeAsync() এর সাথে আপনাকে অবশ্যই একটি বস্তু পাস করতে হবে যা ConsumeResponseListener ইন্টারফেস প্রয়োগ করে। এই বস্তুটি খরচ অপারেশনের ফলাফল পরিচালনা করে। আপনি onConsumeResponse() পদ্ধতিটি ওভাররাইড করতে পারেন, যা অপারেশন সম্পূর্ণ হলে Google Play বিলিং লাইব্রেরি কল করে।

নিম্নলিখিত উদাহরণটি সংশ্লিষ্ট ক্রয় টোকেন ব্যবহার করে Google Play বিলিং লাইব্রেরির সাথে একটি পণ্য গ্রহণের চিত্র তুলে ধরে:

কোটলিন

suspend fun handlePurchase(purchase: Purchase) {
    // Purchase retrieved from BillingClient#queryPurchasesAsync or your PurchasesUpdatedListener.
    val purchase : Purchase = ...;

    // Verify the purchase.
    // Ensure entitlement was not already granted for this purchaseToken.
    // Grant entitlement to the user.

    val consumeParams =
        ConsumeParams.newBuilder()
            .setPurchaseToken(purchase.getPurchaseToken())
            .build()
    val consumeResult = withContext(Dispatchers.IO) {
        client.consumePurchase(consumeParams)
    }
}

জাভা

void handlePurchase(Purchase purchase) {
    // Purchase retrieved from BillingClient#queryPurchasesAsync or your PurchasesUpdatedListener.
    Purchase purchase = ...;

    // Verify the purchase.
    // Ensure entitlement was not already granted for this purchaseToken.
    // Grant entitlement to the user.

    ConsumeParams consumeParams =
        ConsumeParams.newBuilder()
            .setPurchaseToken(purchase.getPurchaseToken())
            .build();

    ConsumeResponseListener listener = new ConsumeResponseListener() {
        @Override
        public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {
            if (billingResult.getResponseCode() == BillingResponseCode.OK) {
                // Handle the success of the consume operation.
            }
        }
    };

    billingClient.consumeAsync(consumeParams, listener);
}

অ-ভোগযোগ্য পণ্য

অ-ব্যবহারযোগ্য কেনাকাটা স্বীকার করতে, যদি আপনার অ্যাপের নিরাপদ ব্যাকএন্ড থাকে, তাহলে আমরা Purchases.products:acknowledgePurchases.products:get কল করার ফলাফল থেকে acknowledgementState চেক করে নিশ্চিত করুন যে ক্রয়টি আগে স্বীকার করা হয়নি।

যদি আপনার অ্যাপ শুধুমাত্র-ক্লায়েন্ট হয়, তাহলে আপনার অ্যাপে Google Play বিলিং লাইব্রেরি থেকে BillingClient.acknowledgePurchase() ব্যবহার করুন। একটি কেনাকাটা স্বীকার করার আগে, Google Play বিলিং লাইব্রেরিতে isAcknowledged() পদ্ধতি ব্যবহার করে আপনার অ্যাপটি ইতিমধ্যেই স্বীকার করা হয়েছে কিনা তা পরীক্ষা করা উচিত।

Google Play বিলিং লাইব্রেরি ব্যবহার করে কীভাবে কেনাকাটা স্বীকার করতে হয় তা নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

val client: BillingClient = ...
val acknowledgePurchaseResponseListener: AcknowledgePurchaseResponseListener = ...

suspend fun handlePurchase() {
    if (purchase.purchaseState === PurchaseState.PURCHASED) {
        if (!purchase.isAcknowledged) {
            val acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder()
                    .setPurchaseToken(purchase.purchaseToken)
            val ackPurchaseResult = withContext(Dispatchers.IO) {
               client.acknowledgePurchase(acknowledgePurchaseParams.build())
            }
        }
     }
}

জাভা

BillingClient client = ...
AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener = ...

void handlePurchase(Purchase purchase) {
    if (purchase.getPurchaseState() == PurchaseState.PURCHASED) {
        if (!purchase.isAcknowledged()) {
            AcknowledgePurchaseParams acknowledgePurchaseParams =
                AcknowledgePurchaseParams.newBuilder()
                    .setPurchaseToken(purchase.getPurchaseToken())
                    .build();
            client.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener);
        }
    }
}

সদস্যতা

সাবস্ক্রিপশনগুলি অ-ভোগযোগ্য জিনিসগুলির মতোই পরিচালনা করা হয়। যদি সম্ভব হয়, আপনার নিরাপদ ব্যাকএন্ড থেকে কেনাকাটা বিশ্বস্তভাবে স্বীকার করতে Google Play Developer API থেকে Purchases.subscriptions.acknowledge ব্যবহার করুন। Purchases.subscriptions:get থেকে ক্রয় সংস্থানে acknowledgementState চেক করে ক্রয়টি আগে স্বীকার করা হয়নি তা যাচাই করুন। অন্যথায়, আপনি isAcknowledged() চেক করার পরে Google Play বিলিং লাইব্রেরি থেকে BillingClient.acknowledgePurchase() ব্যবহার করে সদস্যতা স্বীকার করতে পারেন। সমস্ত প্রাথমিক সাবস্ক্রিপশন ক্রয় স্বীকার করা প্রয়োজন. সাবস্ক্রিপশন পুনর্নবীকরণ স্বীকার করতে হবে না. কখন সাবস্ক্রিপশন স্বীকার করতে হবে সে সম্পর্কে আরও তথ্যের জন্য, সাবস্ক্রিপশন বিক্রির বিষয় দেখুন।

কেনাকাটা করা হচ্ছে

একটি PurchasesUpdatedListener ব্যবহার করে ক্রয় আপডেটগুলি শোনার জন্য আপনার অ্যাপ সমস্ত কেনাকাটা প্রক্রিয়া করছে তা নিশ্চিত করার জন্য যথেষ্ট নয়৷ এটা সম্ভব যে আপনার অ্যাপ ব্যবহারকারীর করা সমস্ত কেনাকাটা সম্পর্কে সচেতন নাও হতে পারে। এখানে এমন কিছু পরিস্থিতি রয়েছে যেখানে আপনার অ্যাপটি ট্র্যাক হারাতে পারে বা কেনাকাটা সম্পর্কে অসচেতন হতে পারে:

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

এই পরিস্থিতিগুলি পরিচালনা করার জন্য, নিশ্চিত করুন যে আপনার অ্যাপটি আপনার onResume() পদ্ধতিতে BillingClient.queryPurchasesAsync() কে কল করে তা নিশ্চিত করুন যে সমস্ত কেনাকাটা সফলভাবে প্রক্রিয়াকরণ ক্রয় প্রক্রিয়ায় বর্ণিত হিসাবে প্রক্রিয়া করা হয়েছে৷

নিম্নলিখিত উদাহরণ দেখায় কিভাবে একজন ব্যবহারকারীর সাবস্ক্রিপশন ক্রয়ের জন্য আনতে হয়। মনে রাখবেন যে queryPurchasesAsync() শুধুমাত্র সক্রিয় সাবস্ক্রিপশন এবং অ-ব্যবহৃত ওয়ান-টাইম ক্রয় ফেরত দেয়।

কোটলিন

val params = QueryPurchasesParams.newBuilder()
               .setProductType(ProductType.SUBS)

// uses queryPurchasesAsync Kotlin extension function
val purchasesResult = billingClient.queryPurchasesAsync(params.build())

// check purchasesResult.billingResult
// process returned purchasesResult.purchasesList, e.g. display the plans user owns

জাভা

billingClient.queryPurchasesAsync(
    QueryPurchasesParams.newBuilder()
      .setProductType(ProductType.SUBS)
      .build(),
    new PurchasesResponseListener() {
      public void onQueryPurchasesResponse(BillingResult billingResult, List<Purchase> purchases) {
        // check billingResult
        // process returned purchase list, e.g. display the plans user owns

      }
    }
);

আপনার অ্যাপের বাইরে করা কেনাকাটা পরিচালনা করা

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

  • একটি ইন-অ্যাপ পপআপ দেখান।
  • একটি ইন-অ্যাপ মেসেজ বক্সে বার্তাটি ডেলিভার করুন এবং স্পষ্টভাবে উল্লেখ করুন যে অ্যাপ-মধ্যস্থ বার্তা বক্সে একটি নতুন বার্তা রয়েছে।
  • একটি OS বিজ্ঞপ্তি বার্তা ব্যবহার করুন।

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

কেনাকাটা করার সময় অ্যাপটি যে অবস্থায় থাকুক না কেন আপনাকে অবশ্যই কেনাকাটা শনাক্ত করতে হবে। যাইহোক, কিছু ব্যতিক্রম রয়েছে যেখানে ব্যবহারকারীকে অবিলম্বে আইটেমটি গৃহীত হয়েছে তা অবহিত না করা গ্রহণযোগ্য হতে পারে। যেমন:

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

কখন এবং কীভাবে আপনার অ্যাপের বাইরে করা কেনাকাটার বিষয়ে আপনার ব্যবহারকারীদের অবহিত করবেন তা নির্ধারণ করার সময় সর্বদা ব্যবহারকারীকে মনে রাখবেন। যে কোনো সময় একজন ব্যবহারকারী অবিলম্বে একটি বিজ্ঞপ্তি না পেলে, তারা বিভ্রান্ত হতে পারে, এবং আপনার অ্যাপ ব্যবহার করা বন্ধ করতে পারে, ব্যবহারকারীর সহায়তার সাথে যোগাযোগ করতে পারে বা সোশ্যাল মিডিয়াতে এটি সম্পর্কে অভিযোগ করতে পারে। দ্রষ্টব্য: PurchasesUpdatedListener আপনার অ্যাপের বাইরে শুরু করা ক্রয় সহ ক্রয়ের আপডেটগুলি পরিচালনা করতে আপনার অ্যাপ্লিকেশন প্রসঙ্গে নিবন্ধিত হয়েছে। এর মানে হল যে যদি আপনার আবেদনের প্রক্রিয়াটি বিদ্যমান না থাকে, তাহলে আপনার PurchasesUpdatedListener জানানো হবে না। এই কারণেই আপনার অ্যাপটিকে BillingClient.queryPurchasesAsync() onResume() পদ্ধতিতে কল করা উচিত যেমনটি Fetch Purchases- এ উল্লেখ করা হয়েছে।

মুলতুবি লেনদেন পরিচালনা করা

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

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

আপনার অ্যাপের জন্য মুলতুবি লেনদেন সক্ষম করতে BillingClient শুরু করার অংশ হিসাবে enablePendingPurchases() কল করুন। আপনার অ্যাপ্লিকেশানকে অবশ্যই সক্ষম এবং এককালীন পণ্যগুলির জন্য মুলতুবি লেনদেনগুলিকে সমর্থন করতে হবে৷ সমর্থন যোগ করার আগে, মুলতুবি লেনদেনের জন্য আপনি ক্রয়ের জীবনচক্র বুঝতে পেরেছেন তা নিশ্চিত করুন।

যখন আপনার অ্যাপ একটি নতুন কেনাকাটা পায়, হয় আপনার PurchasesUpdatedListener এর মাধ্যমে অথবা কলিং queryPurchasesAsync() এর ফলে, কেনার অবস্থা PURCHASED বা PENDING কিনা তা নির্ধারণ করতে getPurchaseState() পদ্ধতি ব্যবহার করুন। আপনার এনটাইটেলমেন্ট মঞ্জুর করা উচিত শুধুমাত্র যখন রাষ্ট্র PURCHASED হয়।

ব্যবহারকারী কেনাকাটা সম্পূর্ণ করার সময় আপনার অ্যাপটি চলমান থাকলে, আপনার PurchasesUpdatedListener আবার কল করা হবে এবং PurchaseState এখন PURCHASED । এই মুহুর্তে, আপনার অ্যাপ ক্রয় প্রক্রিয়াকরণের জন্য স্ট্যান্ডার্ড পদ্ধতি ব্যবহার করে ক্রয় প্রক্রিয়া করতে পারে। আপনার অ্যাপ্লিকেশানটি আপনার অ্যাপের onResume() পদ্ধতিতে queryPurchasesAsync() কল করা উচিত যাতে আপনার অ্যাপটি চলমান না থাকাকালীন ক্রয় PURCHASED অবস্থায় স্থানান্তরিত করা হয়।

যখন ক্রয়টি PENDING থেকে PURCHASED এ রূপান্তরিত হয়, তখন আপনার রিয়েল-টাইম বিকাশকারী বিজ্ঞপ্তি ক্লায়েন্ট একটি ONE_TIME_PRODUCT_PURCHASED বা SUBSCRIPTION_PURCHASED বিজ্ঞপ্তি পায়৷ কেনাকাটা বাতিল হলে, আপনি একটি ONE_TIME_PRODUCT_CANCELED বা SUBSCRIPTION_PENDING_PURCHASE_CANCELED বিজ্ঞপ্তি পাবেন৷ আপনার গ্রাহক প্রয়োজনীয় সময়সীমার মধ্যে অর্থপ্রদান সম্পূর্ণ না করলে এটি ঘটতে পারে। নোট করুন যে আপনি সর্বদা একটি ক্রয়ের বর্তমান অবস্থা পরীক্ষা করতে Google Play বিকাশকারী API ব্যবহার করতে পারেন৷

বহু-পরিমাণ কেনাকাটা পরিচালনা করা

Google Play বিলিং লাইব্রেরির 4.0 এবং উচ্চতর সংস্করণে সমর্থিত, Google Play গ্রাহকদের ক্রয় কার্ট থেকে একটি পরিমাণ নির্দিষ্ট করে একটি লেনদেনে একই অ্যাপ-মধ্যস্থ পণ্যের একাধিক ক্রয় করতে দেয়৷ আপনার অ্যাপটি বহু-পরিমাণ কেনাকাটা পরিচালনা করবে এবং নির্দিষ্ট ক্রয়ের পরিমাণের উপর ভিত্তি করে এনটাইটেলমেন্ট দেবে বলে আশা করা হচ্ছে।

বহু-পরিমাণ কেনাকাটার সম্মান জানাতে, আপনার অ্যাপের প্রভিশনিং লজিককে একটি আইটেমের পরিমাণ পরীক্ষা করতে হবে। আপনি নিম্নলিখিত APIগুলির একটি থেকে একটি quantity ক্ষেত্র অ্যাক্সেস করতে পারেন:

আপনি একাধিক-পরিমাণ কেনাকাটা পরিচালনা করার জন্য যুক্তি যোগ করার পরে, আপনাকে Google Play বিকাশকারী কনসোলে অ্যাপ-মধ্যস্থ পণ্য ব্যবস্থাপনা পৃষ্ঠায় সংশ্লিষ্ট পণ্যের জন্য বহু-পরিমাণ বৈশিষ্ট্য সক্ষম করতে হবে।

ব্যবহারকারীর বিলিং কনফিগারেশন জিজ্ঞাসা করুন

getBillingConfigAsync() Google Play-এর জন্য ব্যবহারকারী যে দেশ ব্যবহার করে তা প্রদান করে।

আপনি একটি BillingClient তৈরি করার পরে ব্যবহারকারীর বিলিং কনফিগারেশন জিজ্ঞাসা করতে পারেন। নিম্নলিখিত কোড স্নিপেট বর্ণনা করে কিভাবে getBillingConfigAsync() এ কল করতে হয়। BillingConfigResponseListener প্রয়োগ করে প্রতিক্রিয়া পরিচালনা করুন। এই শ্রোতা আপনার অ্যাপ্লিকেশান থেকে শুরু করা সমস্ত বিলিং কনফিগার প্রশ্নের জন্য আপডেট পায়৷

যদি ফেরত দেওয়া BillingResult কোনো ত্রুটি না থাকে, তাহলে আপনি ব্যবহারকারীর Play Country পেতে BillingConfig অবজেক্টের countryCode ক্ষেত্রটি পরীক্ষা করতে পারেন।

কোটলিন

// Use the default GetBillingConfigParams.
val getBillingConfigParams = GetBillingConfigParams.newBuilder().build()
billingClient.getBillingConfigAsync(getBillingConfigParams,
    object : BillingConfigResponseListener {
        override fun onBillingConfigResponse(
            billingResult: BillingResult,
            billingConfig: BillingConfig?
        ) {
            if (billingResult.responseCode == BillingResponseCode.OK
                && billingConfig != null) {
                val countryCode = billingConfig.countryCode
                ...
            } else {
                // TODO: Handle errors
            }
        }
    })

জাভা

// Use the default GetBillingConfigParams.
GetBillingConfigParams getBillingConfigParams = GetBillingConfigParams.newBuilder().build();
billingClient.getBillingConfigAsync(getBillingConfigParams,
    new BillingConfigResponseListener() {
      public void onBillingConfigResponse(
          BillingResult billingResult, BillingConfig billingConfig) {
        if (billingResult.getResponseCode() == BillingResponseCode.OK
            && billingConfig != null) {
            String countryCode = billingConfig.getCountryCode();
            ...
         } else {
            // TODO: Handle errors
        }
      }
    });