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

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

কোটলিন

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 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()
)

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) {
           // Process the purchase as described in the next section.
       }
   } else if (billingResult.responseCode == BillingResponseCode.USER_CANCELED) {
       // Handle an error caused by a user canceling 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) {
            // Process the purchase as described in the next section.
        }
    } else if (billingResult.getResponseCode() == BillingResponseCode.USER_CANCELED) {
        // Handle an error caused by a user canceling the purchase flow.
    } else {
        // Handle any other error codes.
    }
}

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

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

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

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

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

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

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

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

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

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

ব্যবহারকারী শনাক্তকারী সংযুক্ত করুন

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

ক্রয় সনাক্ত করুন এবং প্রক্রিয়া করুন

এই বিভাগে বর্ণিত একটি ক্রয়ের সনাক্তকরণ এবং প্রক্রিয়াকরণ সমস্ত ধরণের কেনাকাটার ক্ষেত্রে প্রযোজ্য যার মধ্যে অ্যাপের বাইরে কেনাকাটা যেমন প্রচার রিডিমশন।

আপনার অ্যাপ নতুন কেনাকাটা শনাক্ত করে এবং নিচের যেকোনো একটি উপায়ে মুলতুবি কেনাকাটা সম্পূর্ণ করে:

  1. যখন আপনার অ্যাপ কলিং launchBillingFlow (আগের বিভাগে আলোচনা করা হয়েছে) এর ফলে onPurchasesUpdated কল করা হয় বা আপনার অ্যাপের বাইরে কোনো কেনাকাটা করা হলে বা একটি মুলতুবি কেনাকাটা সম্পন্ন হলে আপনার অ্যাপটি একটি সক্রিয় বিলিং লাইব্রেরি সংযোগের সাথে চলছে। উদাহরণস্বরূপ, পরিবারের একজন সদস্য অন্য ডিভাইসে একটি মুলতুবি ক্রয় অনুমোদন করেন।
  2. যখন আপনার অ্যাপ ব্যবহারকারীর কেনাকাটা সম্পর্কে জিজ্ঞাসা করতে queryPurchasesAsync-কে কল করে।

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

#2 এর জন্য আপনাকে অবশ্যই BillingClient.queryPurchasesAsync() কল করতে হবে যাতে আপনার অ্যাপ সমস্ত কেনাকাটা প্রক্রিয়া করে। যখন আপনার অ্যাপটি Google Play বিলিং লাইব্রেরির সাথে সফলভাবে একটি সংযোগ স্থাপন করে তখন এটি করার পরামর্শ দেওয়া হয় (যেটি প্রস্তাবিত হয় যখন আপনার অ্যাপটি চালু হয় বা অগ্রভাগে আসে যেমনটি একটি BillingClient শুরু করার বিষয়ে আলোচনা করা হয়েছে। এটি পাওয়ার সময় queryPurchasesAsync কল করে সম্পন্ন করা যেতে পারে। onServiceConnected- এর একটি সফল ফলাফল এই সুপারিশ অনুসরণ করা ইভেন্ট এবং পরিস্থিতি যেমন:

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

একবার আপনার অ্যাপ একটি নতুন বা সম্পূর্ণ কেনাকাটা শনাক্ত করলে আপনার অ্যাপটি করা উচিত:

  • ক্রয় যাচাই করুন.
  • সম্পূর্ণ কেনাকাটার জন্য ব্যবহারকারীকে সামগ্রী প্রদান করুন।
  • ব্যবহারকারীকে অবহিত করুন।
  • Google কে জানান যে আপনার অ্যাপ কেনাকাটা সম্পূর্ণ করেছে।

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

ক্রয় যাচাই করুন

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

ব্যবহারকারীকে এনটাইটেলমেন্ট প্রদান করুন

একবার আপনার অ্যাপ একটি ক্রয় যাচাই করে নিলে এটি ব্যবহারকারীকে এনটাইটেলমেন্ট দেওয়া চালিয়ে যেতে পারে এবং ব্যবহারকারীকে অবহিত করতে পারে। এনটাইটেলমেন্ট মঞ্জুর করার আগে, নিশ্চিত করুন যে আপনার অ্যাপ ক্রয় অবস্থা PURCHASED হয়েছে কিনা তা পরীক্ষা করছে। যদি ক্রয়টি মুলতুবি অবস্থায় থাকে, তাহলে আপনার অ্যাপটি ব্যবহারকারীকে অবহিত করবে যে এনটাইটেলমেন্ট মঞ্জুর করার আগে ক্রয়টি সম্পূর্ণ করার জন্য তাদের এখনও পদক্ষেপগুলি সম্পূর্ণ করতে হবে। শুধুমাত্র এনটাইটেলমেন্ট মঞ্জুর করুন যখন ক্রয় PENDING থেকে SUCCESS-এ রূপান্তরিত হয়। মুলতুবি লেনদেন পরিচালনায় অতিরিক্ত তথ্য পাওয়া যাবে।

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

ব্যবহারকারীকে অবহিত করুন

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

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

একটি ক্রয় সম্পর্কে ব্যবহারকারীকে অবহিত করার সময়, Google Play নিম্নলিখিত প্রক্রিয়াগুলি সুপারিশ করে:

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

বিজ্ঞপ্তিটি ব্যবহারকারীকে তাদের প্রাপ্ত সুবিধা সম্পর্কে অবহিত করা উচিত। উদাহরণস্বরূপ, "আপনি 100টি সোনার কয়েন কিনেছেন!"। অতিরিক্তভাবে, যদি ক্রয়টি Play Pass-এর মতো কোনো প্রোগ্রামের সুবিধার ফলে হয় তাহলে আপনার অ্যাপ ব্যবহারকারীর কাছে এটি যোগাযোগ করে। যেমন "আইটেম গৃহীত হয়েছে! আপনি Play Pass সহ 100টি রত্ন পেয়েছেন। চালিয়ে যান।" প্রতিটি প্রোগ্রাম ব্যবহারকারীদের সুবিধার যোগাযোগের জন্য প্রদর্শন করার জন্য প্রস্তাবিত পাঠ্যের উপর নির্দেশিকা থাকতে পারে।

Google কে জানান যে কেনাকাটা প্রক্রিয়া করা হয়েছে

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

ভোগ্য পণ্য

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

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

কোটলিন

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

জাভা

    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 = ...

val acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder()
    .setPurchaseToken(purchase.purchaseToken)
val ackPurchaseResult = withContext(Dispatchers.IO) {
     client.acknowledgePurchase(acknowledgePurchaseParams.build())
}

জাভা

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

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() ব্যবহার করে সদস্যতা স্বীকার করতে পারেন। সমস্ত প্রাথমিক সাবস্ক্রিপশন ক্রয় স্বীকার করা প্রয়োজন. সাবস্ক্রিপশন পুনর্নবীকরণ স্বীকার করতে হবে না. কখন সাবস্ক্রিপশন স্বীকার করতে হবে সে সম্পর্কে আরও তথ্যের জন্য, সাবস্ক্রিপশন বিক্রির বিষয় দেখুন।

রিক্যাপ

নিম্নলিখিত কোড স্নিপেট এই পদক্ষেপগুলির একটি সংক্ষিপ্ত বিবরণ দেখায়।

কোটলিন

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

    // Step 1: Send the purchase to your secure backend to verify the purchase
    // following
    // https://developer.android.com/google/play/billing/security#verify
.
    // Step 2: Update your entitlement storage with the purchase. If purchase is
    // in PENDING state then ensure the entitlement is marked as pending and the
    // user does not receive benefits yet. It is recommended that this step is
    // done on your secure backend and can combine in the API call to your
    // backend in step 1.

    // Step 3: Notify the user using appropriate messaging (delaying
    // notification if needed as discussed above).

    // Step 4: Notify Google the purchase was processed using the steps
    // discussed in the processing purchases section.
}

জাভা

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

    // Step 1: Send the purchase to your secure backend to verify the purchase
    // following
    // https://developer.android.com/google/play/billing/security#verify

    // Step 2: Update your entitlement storage with the purchase. If purchase is
    // in PENDING state then ensure the entitlement is marked as pending and the
    // user does not receive benefits yet. It is recommended that this step is
    // done on your secure backend and can combine in the API call to your
    // backend in step 1.

    // Step 3: Notify the user using appropriate messaging (delaying
    // notification if needed as discussed above).

    // Step 4: Notify Google the purchase was processed using the steps
    // discussed in the processing purchases section.
}

আপনার অ্যাপটি সঠিকভাবে এই পদক্ষেপগুলি প্রয়োগ করেছে তা যাচাই করতে আপনি পরীক্ষার নির্দেশিকা অনুসরণ করতে পারেন।

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

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

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

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

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

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

যখন ক্রয় PENDING থেকে PURCHASED তে রূপান্তরিত হয়, তখন আপনার real_time_developer_notifications ক্লায়েন্ট একটি 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
        }
      }
    });

Google Play Games হোমে কার্ট পরিত্যাগের অনুস্মারক (ডিফল্টরূপে সক্ষম)

IAP-এর মাধ্যমে নগদীকরণকারী গেমস ডেভেলপারদের জন্য, Google Play Console-এ সক্রিয় থাকা স্টক-কিপিং ইউনিট (SKUs) আপনার অ্যাপের বাইরে বিক্রি করার একটি উপায় হল কার্ট অ্যাবন্ডনমেন্ট রিমাইন্ডার বৈশিষ্ট্য, যা ব্যবহারকারীদের তাদের পূর্বে পরিত্যক্ত কেনাকাটা সম্পূর্ণ করতে বাধ্য করে গুগল প্লে স্টোর ব্রাউজিং। এই কেনাকাটাগুলি আপনার অ্যাপের বাইরে, Google Play Store-এর Google Play Games হোম থেকে হয়।

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

নিম্নলিখিত চিত্রগুলি দেখায় যে কার্ট পরিত্যাগের অনুস্মারকটি Google Play স্টোরে প্রদর্শিত হচ্ছে:

Google Play Store স্ক্রীন দেখায় a     একটি পূর্বে পরিত্যক্ত ক্রয়ের জন্য ক্রয় প্রম্পট
চিত্র 2. Google Play Store স্ক্রীনটি পূর্বে পরিত্যক্ত ক্রয়ের জন্য একটি ক্রয় প্রম্পট দেখায়৷

Google Play Store স্ক্রীন দেখায় a     একটি পূর্বে পরিত্যক্ত ক্রয়ের জন্য ক্রয় প্রম্পট
চিত্র 3. Google Play Store স্ক্রীনটি পূর্বে পরিত্যক্ত ক্রয়ের জন্য একটি ক্রয় প্রম্পট দেখায়৷