এককালীন পণ্যের জন্য একাধিক ক্রয়ের বিকল্প এবং অফার

এই নথিতে আপনার এককালীন পণ্য (OTP) Play Billing Library-এর সাথে একীভূতকরণের বিশদ বিবরণ দেওয়া হয়েছে। এটি আরও ব্যাখ্যা করে যে কীভাবে আপনার এককালীন পণ্যের সাথে সম্পর্কিত বিভিন্ন ক্রয় বিকল্প এবং অফারগুলিকে একীভূত করবেন।

আপনার এককালীন পণ্যের জন্য আপনি একাধিক ক্রয় বিকল্প এবং অফার কনফিগার করতে পারেন। উদাহরণস্বরূপ, আপনি একই এককালীন পণ্যের জন্য একটি ক্রয় ক্রয় বিকল্প এবং একটি প্রি-অর্ডার অফার কনফিগার করতে পারেন।

পূর্বশর্ত

এককালীন পণ্যের জন্য একাধিক অফার কনফিগার করতে, আপনাকে queryProductDetailsAsync() API ব্যবহার করতে হবে। অপ্রচলিত querySkuDetailsAsync() API সমর্থিত নয়। queryProductDetailsAsync() এবং launchBillingFlow() এর সংস্করণ যা ProductDetailsParams ইনপুট হিসেবে নেয়, সে সম্পর্কে তথ্যের জন্য, মাইগ্রেশন ধাপগুলি দেখুন।

পণ্যের বিবরণ জিজ্ঞাসা করুন

যদি আপনি আপনার এককালীন পণ্যের জন্য একাধিক অফার বা ক্রয়ের বিকল্প কনফিগার করে থাকেন, তাহলে queryProductDetailsAsync() পদ্ধতি দ্বারা ফেরত আসা ProductDetails অবজেক্টে প্রতি এককালীন পণ্যের জন্য একাধিক উপলব্ধ ক্রয় এবং (অথবা) ভাড়া ক্রয়ের বিকল্প থাকতে পারে। প্রতিটি ProductDetails অবজেক্টের জন্য সমস্ত যোগ্য অফারের তালিকা পেতে, getOneTimePurchaseOfferDetailsList() পদ্ধতিটি ব্যবহার করুন। শুধুমাত্র ব্যবহারকারী যে অফার এবং ক্রয়ের বিকল্পগুলির জন্য যোগ্য সেগুলি এই তালিকার অংশ হিসাবে ফেরত পাঠানো হবে। onProductDetailsResponse() পদ্ধতিতে আপনার কোডটি ফেরত আসা অফারগুলি পরিচালনা করবে।

বিলিং ফ্লো চালু করুন

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

একাধিক অফার সহ এককালীন পণ্যের জন্য ক্রয় প্রবাহ কীভাবে চালু করবেন তা নিম্নলিখিত নমুনায় দেখানো হয়েছে:

জাভা

    
// An activity reference from which the billing flow will launch.
Activity activity = ...;
ImmutableList<ProductDetailsParams> productDetailsParamsList =
    ImmutableList.of(
        ProductDetailsParams.newBuilder()
             // retrieve a value for productDetails by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // to get an offer token, call
            // ProductDetails.getOneTimePurchaseOfferDetailsList() 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);
    
    

offerToken OneTimePurchaseOfferDetails এর অংশ হিসেবে পাওয়া যাবে। ব্যবহারকারীকে অফারটি দেখানোর সময়, নিশ্চিত করুন যে আপনি সঠিক অফার টোকেন দিয়ে বিলিং ফ্লো প্যারামিটারগুলি কনফিগার করেছেন যা আপনি oneTimePurchaseOfferDetails.getOfferToken() পদ্ধতি থেকে পেতে পারেন।

ক্রয়ের বিকল্প এবং অফার

একটি ক্রয় বিকল্প আপনাকে কীভাবে একজন ব্যবহারকারীকে এনটাইটেলমেন্ট প্রদান করা হবে, তার দাম এবং কোন অঞ্চলে পণ্যটি পাওয়া যাবে তা নির্ধারণ করতে দেয়। একটি একক পণ্যের একাধিক ক্রয় বিকল্প থাকতে পারে, যা আপনি কোথায় এবং কীভাবে আপনার পণ্য বিক্রি করবেন তা উপস্থাপন করতে পারে।

গুগল প্লে এককালীন পণ্যের জন্য নিম্নলিখিত ক্রয়ের বিকল্পগুলি সমর্থন করে:

  • ক্রয় বিকল্প কিনুন
  • ভাড়া কেনার বিকল্প

অফার বলতে এমন একটি মূল্য পরিকল্পনা বোঝায় যা আপনি আপনার এককালীন পণ্যের জন্য তৈরি করতে পারেন। উদাহরণস্বরূপ, আপনি আপনার এককালীন পণ্যের জন্য একটি ছাড় অফার তৈরি করতে পারেন।

গুগল প্লে এককালীন পণ্যের জন্য নিম্নলিখিত ক্রয় অফারগুলি সমর্থন করে:

  • প্রি-অর্ডার অফার (শুধুমাত্র ক্রয় বিকল্পের জন্য সমর্থিত)
  • ছাড়ের অফার (ক্রয় এবং ভাড়া উভয় ক্রয়ের বিকল্পের জন্য সমর্থিত)

ক্রয় বিকল্প কিনুন

একটি বাই ক্রয় অপশন হল এককালীন পণ্যের একটি স্ট্যান্ডার্ড, সরাসরি ক্রয়। এর একটি ঐচ্ছিক legacy Compatible ফিল্ড রয়েছে, যা নির্দেশ করে যে এই ক্রয় অপশনটি পুরোনো Play Billing Library (সংস্করণ ৭ বা তার বেশি) ফ্লোতে উপলব্ধ হবে কিনা যা নতুন মডেল সমর্থন করে না। ব্যাকওয়ার্ড সামঞ্জস্যের জন্য, কমপক্ষে একটি বাই ক্রয় অপশনকে legacy compatible হিসেবে চিহ্নিত করা উচিত।

PBL-এর সাথে বাই এবং রেন্ট ক্রয় উভয় বিকল্পকে একীভূত করার ধাপগুলি একই। PBL-এর সাথে বাই ক্রয় বিকল্পকে কীভাবে একীভূত করবেন তা বোঝার জন্য, PBL-এর সাথে ইন্টিগ্রেট রেন্ট ক্রয় বিকল্পটি দেখুন।

ভাড়া কেনার বিকল্প

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

PBL-এর সাথে ভাড়া ক্রয়ের বিকল্পটি একীভূত করুন

এই বিভাগটি বর্ণনা করে কিভাবে ভাড়া ক্রয় বিকল্পটি Play Billing Library (PBL) এর সাথে একীভূত করতে হয়। এটি ধরে নেয় যে আপনি প্রাথমিক PBL ইন্টিগ্রেশন ধাপগুলির সাথে পরিচিত, যেমন, আপনার অ্যাপে PBL নির্ভরতা যোগ করা , BillingClient শুরু করা এবং Google Play এর সাথে সংযোগ করা । এই বিভাগটি ভাড়া ক্রয় বিকল্পের সাথে সম্পর্কিত PBL ইন্টিগ্রেশন দিকগুলির উপর আলোকপাত করে।

ভাড়ার জন্য উপলব্ধ পণ্যগুলি কনফিগার করতে, আপনাকে Play Developer API অথবা Play Developer Console UI এর নতুন monetization.onetimeproducts পরিষেবা ব্যবহার করতে হবে। পরিষেবাটি ব্যবহার করতে, আপনি সরাসরি REST API-তে কল করতে পারেন, অথবা Java ক্লায়েন্ট লাইব্রেরি ব্যবহার করতে পারেন।

ভাড়া বিকল্পের জন্য একটি ক্রয় প্রবাহ চালু করুন

ভাড়া অফারের জন্য ক্রয় প্রবাহ চালু করতে, নিম্নলিখিত পদক্ষেপগুলি অনুসরণ করুন:

  1. ProductDetails.oneTimePurchaseOfferDetails.getRentalDetails() পদ্ধতি ব্যবহার করে ভাড়া ক্রয় বিকল্পের মেটাডেটা আনুন।

    ভাড়া ক্রয়ের মেটাডেটা কীভাবে পাবেন তা নিম্নলিখিত নমুনায় দেখানো হয়েছে:

    জাভা

    billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            // Checks if the offer is a rent purchase option.
            if (oneTimePurchaseOfferDetails.getRentalDetails() != null) {
              // process the returned RentalDetails
              OneTimePurchaseOfferDetails.RentalDetails rentalDetails =
                  oneTimePurchaseOfferDetails.getRentalDetails();
              // Get rental period in ISO 8601 format.
              String rentalPeriod = rentalDetails.getRentalPeriod();
              // Get rental expiration period in ISO 8601 format, if present.
              if (rentalDetails.getRentalExpirationPeriod() != null) {
                String rentalExpirationPeriod = rentalDetails.getRentalExpirationPeriod();
              }
              // Get offer token
                String offerToken = oneTimePurchaseOfferDetails.getOfferToken();
              // Get the associated purchase option ID
              if (oneTimePurchaseOfferDetails.getPurchaseOptionId() != null) {
                String purchaseOptionId = oneTimePurchaseOfferDetails.getPurchaseOptionId();
              }
            }
          }
        }
      }
    });
  2. বিলিং ফ্লো চালু করুন।

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

    নিম্নলিখিত নমুনাটি বিলিং প্রবাহ কীভাবে চালু করবেন তা দেখায়:

    কোটলিন

    // 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)
            // Get the offer token:
            // a. For one-time products, call ProductDetails.getOneTimePurchaseOfferDetailsList()
            // for a list of offers that are available to the user.
            // b. For subscriptions, 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)
                // Get the offer token:
                // a. For one-time products, call ProductDetails.getOneTimePurchaseOfferDetailsList()
                // for a list of offers that are available to the user.
                // b. For subscriptions, 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);

    offerToken OneTimePurchaseOfferDetails এর অংশ হিসেবে পাওয়া যাবে। ব্যবহারকারীকে অফারটি দেখানোর সময়, নিশ্চিত করুন যে আপনি সঠিক অফার টোকেন দিয়ে বিলিং ফ্লো প্যারামিটারগুলি কনফিগার করেছেন যা আপনি oneTimePurchaseOfferDetails.getOfferToken() পদ্ধতি থেকে পেতে পারেন।

প্রি-অর্ডার অফার

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

এই ডকুমেন্টে প্লে বিলিং লাইব্রেরি (PBL) এর সাথে প্রি-অর্ডার ক্রয় অফার সংহত করার পদক্ষেপগুলি বর্ণনা করা হয়েছে।

PBL-এর সাথে প্রি-অর্ডার অফার একীভূত করুন

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

প্রি-অর্ডার অফারের জন্য একটি ক্রয় প্রবাহ চালু করুন

প্রি-অর্ডার অফারের জন্য ক্রয় প্রবাহ চালু করতে, নিম্নলিখিত পদক্ষেপগুলি অনুসরণ করুন:

  1. ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails() পদ্ধতি ব্যবহার করে প্রি-অর্ডার অফার মেটাডেটা আনুন। প্রি-অর্ডার অফার মেটাডেটা কীভাবে পাবেন তা নিম্নলিখিত নমুনায় দেখানো হয়েছে:

    জাভা

    billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            // Checks if the offer is a preorder offer.
            if (oneTimePurchaseOfferDetails.getPreorderDetails() != null) {
              // process the returned PreorderDetails
              OneTimePurchaseOfferDetails.PreorderDetails preorderDetails =
                  oneTimePurchaseOfferDetails.getPreorderDetails();
              // Get preorder release time in millis.
              long preorderReleaseTimeMillis = preorderDetails.getPreorderReleaseTimeMillis();
              // Get preorder presale end time in millis.
              long preorderPresaleEndTimeMillis = preorderDetails.getPreorderPresaleEndTimeMillis();
              // Get offer ID
                String offerId = oneTimePurchaseOfferDetails.getOfferId();
              // Get the associated purchase option ID
              if (oneTimePurchaseOfferDetails.getPurchaseOptionId() != null) {
                String purchaseOptionId = oneTimePurchaseOfferDetails.getPurchaseOptionId();
              }
            }
          }
        }
      }
    });

  2. বিলিং ফ্লো চালু করুন।

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

    নিম্নলিখিত নমুনাটি বিলিং প্রবাহ কীভাবে চালু করবেন তা দেখায়:

    জাভা

    // An activity reference from which the billing flow will launch.
    Activity activity = ...;
    ImmutableList productDetailsParamsList =
        ImmutableList.of(
        ProductDetailsParams.newBuilder()
             // retrieve a value for productDetails by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // to get an offer token, call
            // ProductDetails.getOneTimePurchaseOfferDetailsList() 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);

    offerToken OneTimePurchaseOfferDetails এর অংশ হিসেবে পাওয়া যাবে। ব্যবহারকারীকে অফারটি দেখানোর সময়, নিশ্চিত করুন যে আপনি সঠিক অফার টোকেন দিয়ে বিলিং ফ্লো প্যারামিটারগুলি কনফিগার করেছেন যা আপনি oneTimePurchaseOfferDetails.getOfferToken() পদ্ধতি থেকে পেতে পারেন।

ছাড়ের অফার

এই বিভাগটি বর্ণনা করে যে কীভাবে আপনি আপনার এককালীন পণ্যের জন্য ছাড়ের অফারগুলি কনফিগার করতে পারেন।

এককালীন পণ্য ছাড় অফারে আপনি চারটি ভিন্ন প্যারামিটার কনফিগার করতে পারেন:

  • ছাড় দেওয়া অফার মূল্য: মূল মূল্যের উপর কত শতাংশ ছাড় দেওয়া হয়েছে অথবা সম্পূর্ণ মূল্য দেওয়া হয়েছে তার বিশদ বিবরণ উল্লেখ করে।

  • দেশ বা অঞ্চলের জন্য যোগ্যতা: একটি দেশ বা অঞ্চলে এককালীন পণ্য অফারগুলির প্রাপ্যতা নির্দিষ্ট করে।

  • ক্রয়ের সীমা (ঐচ্ছিক): একজন ব্যবহারকারী একই অফার কতবার রিডিম করতে পারবেন তা নির্ধারণ করতে আপনাকে সাহায্য করে। যদি একজন ব্যবহারকারী ক্রয়ের সীমা অতিক্রম করে, তাহলে ব্যবহারকারী অফারের জন্য অযোগ্য বলে বিবেচিত হবেন।

  • সীমিত সময় (ঐচ্ছিক): অফারটি কোন সময়কালে উপলব্ধ থাকবে তা নির্দিষ্ট করে। সময়কালের বাইরে, অফারটি কেনার জন্য অযোগ্য।

ছাড়ের অফার মূল্যের তথ্য পুনরুদ্ধার করুন

ছাড়ের অফারের জন্য, আপনি ছাড়ের শতাংশ অথবা প্রদত্ত সম্পূর্ণ ছাড় পুনরুদ্ধার করতে পারেন।

উদাহরণ ১: ছাড়কৃত অফারের শতাংশ ছাড় পুনরুদ্ধার করুন

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

জাভা

billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult){
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            long discountedOfferPriceMicros =
                oneTimePurchaseOfferDetails.getPriceAmountMicros();
            // process the returned fullPriceMicros and percentageDiscount.
            if (oneTimePurchaseOfferDetails.getFullPriceMicros() != null) {
              long fullPriceMicros = oneTimePurchaseOfferDetails.getFullPriceMicros();
            }
            if (oneTimePurchaseOfferDetails.getDiscountDisplayInfo() != null) {
              long percentageDiscount =
                  oneTimePurchaseOfferDetails
                      .getDiscountDisplayInfo()
                      .getPercentageDiscount();
            }
            // …
          }
        }
      }
    });
    
উদাহরণ ২: ছাড়কৃত অফারের সম্পূর্ণ ছাড় পুনরুদ্ধার করুন

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

জাভা

billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            long discountedOfferPriceMicros =
                oneTimePurchaseOfferDetails.getPriceAmountMicros();
            // process the returned fullPriceMicros and absolute DiscountAmountMicros.
            if (oneTimePurchaseOfferDetails.getFullPriceMicros() != null) {
              long fullPriceMicros = oneTimePurchaseOfferDetails.getFullPriceMicros();
            }
            if (oneTimePurchaseOfferDetails.getDiscountDisplayInfo() != null) {
              long discountAmountMicros =
                  oneTimePurchaseOfferDetails
                      .getDiscountDisplayInfo()
                      .getDiscountAmount()
                      .getDiscountAmountMicros();
            }
            // …
          }
        }
      }
    });
    

অফারের বৈধ সময়সীমা পান

একটি অফারের জন্য বৈধ সময় উইন্ডো পেতে আপনি OneTimePurchaseOfferDetails.getValidTimeWindow() পদ্ধতি ব্যবহার করতে পারেন। এই অবজেক্টে মিলিসেকেন্ডে সময় উইন্ডো শুরু এবং শেষ সময় থাকে।

নিম্নলিখিত নমুনাটি দেখায় কিভাবে একটি অফারের বৈধ সময়সীমা পেতে হয়:

জাভা

billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            if (oneTimePurchaseOfferDetails.getValidTimeWindow() != null) {
              // process the returned startTimeMillis and endTimeMillis.
              ValidTimeWindow validTimeWindow =
                  oneTimePurchaseOfferDetails.getValidTimeWindow();
              long startTimeMillis = validTimeWindow.getStartTimeMillis();
              long endTimeMillis = validTimeWindow.getEndTimeMillis();
              // …
            }
          }
        }
      }
    });
    

ডিসকাউন্ট অফার স্তরে সীমিত পরিমাণে

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

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

ডিসকাউন্ট অফার স্তরে সীমিত পরিমাণে কীভাবে পাবেন তা নিম্নলিখিত নমুনায় দেখানো হয়েছে:

জাভা

billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            if (oneTimePurchaseOfferDetails.getLimitedQuantityInfo() != null) {
              // process the returned maximumQuantity and remainingQuantity.
              LimitedQuantityInfo limitedQuantityInfo =
                  oneTimePurchaseOfferDetails.getLimitedQuantityInfo();
              int maximumQuantity = limitedQuantityInfo.getMaximumQuantity();
              int remainingQuantity = limitedQuantityInfo.getRemainingQuantity();
              // …
            }
          }
        }
      }
    });
    

যখন ব্যবহারকারীরা কোনও অফারের জন্য সর্বাধিক পরিমাণ রিডেম্পশন ব্যবহার করে, getOneTimePurchaseOfferDetailsList() পদ্ধতি দ্বারা অফারটি ফেরত পাঠানো হয় না।

রিডেম্পশন সীমা গণনা করুন

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

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

  1. সুপার স্ক্রিনসেভারগুলি সর্বাধিক অনুমোদিত পরিমাণের সাথে একটি ছাড় অফার সেট করে, যাতে ব্যবহারকারীরা একটি পর্যন্ত ছাড়যুক্ত স্ক্রিনসেভার কিনতে পারেন।

  2. ব্যবহারকারী ছাড়ের স্ক্রিনসেভারগুলির মধ্যে একটি কিনবেন। ব্যবহারকারী যদি দ্বিতীয় ছাড়ের স্ক্রিনসেভারটি কেনার চেষ্টা করেন, তাহলে এটি ত্রুটিপূর্ণ হবে এবং PurchasesUpdatedListener একটি ITEM_UNAVAILABLE প্রতিক্রিয়া কোড পাবে।

  3. ব্যবহারকারী প্রথমে কেনা ছাড়ের স্ক্রিনসেভারের টাকা ফেরত চান এবং সফলভাবে টাকা ফেরত পান। ব্যবহারকারী ছাড়ের স্ক্রিনসেভারের একটি কেনার চেষ্টা করেন, এবং ক্রয়টি সফল হবে।

দেশ এবং অঞ্চলের যোগ্যতা

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

অফার ট্যাগ

নিম্নলিখিত নমুনাটি দেখায় কিভাবে একটি অফারের সাথে সম্পর্কিত অফার ট্যাগগুলি পুনরুদ্ধার করতে হয়।

জাভা

    
billingClient.queryProductDetailsAsync(
    queryProductDetailsParams,
    new ProductDetailsResponseListener() {
      public void onProductDetailsResponse(
          BillingResult billingResult, QueryProductDetailsResult productDetailsResult) {
        // check billingResult
        // …
        // process productDetailsList returned by QueryProductDetailsResult
        for (ProductDetails productDetails : productDetailsResult.getProductDetailsList()) {
          for (OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails :
              productDetails.getOneTimePurchaseOfferDetailsList()) {
            // process the returned offer tags.
            ImmutableList<String> offerTags =
                oneTimePurchaseOfferDetails.getOfferTagsList();
            // …
          }
        }
      }
    });
    
    

অফার ট্যাগের উত্তরাধিকার

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

উদাহরণস্বরূপ, সুপার স্ক্রিনসেভারের স্ক্রিনসেভার পণ্যের জন্য দুটি অফার রয়েছে; ক্রয় বিকল্প স্ক্রিনসেভার এবং একটি ছাড় স্ক্রিনসেভার।

  • সুপার স্ক্রিনসেভারে পণ্য অফার ট্যাগ SSProductTag রয়েছে।
  • ক্রয় বিকল্প স্ক্রিনসেভারে অফার ট্যাগ SSPurchaseOptionTag রয়েছে।
  • ডিসকাউন্ট স্ক্রিনসেভারটিতে অফার ট্যাগ SSDiscountOfferTag রয়েছে।

এই উদাহরণে, ক্রয় বিকল্প অফারের জন্য oneTimePurchaseOfferDetails.getOfferTagsList() পদ্ধতিটি SSProductTag এবং SSPurchaseOptionTag প্রদান করে। ডিসকাউন্ট অফারের জন্য, পদ্ধতিটি SSProductTag , SSPurchaseOptionTag এবং SSDiscountOfferTag প্রদান করে।