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

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

আপনি আপনার ওয়ান-টাইম প্রোডাক্টগুলোর জন্য একাধিক ক্রয়ের বিকল্প এবং অফার কনফিগার করতে পারেন। উদাহরণস্বরূপ, আপনি একই ওয়ান-টাইম প্রোডাক্টের জন্য একটি ‘বাই’ (buy) ক্রয়ের বিকল্প এবং একটি প্রি-অর্ডার অফার কনফিগার করতে পারেন।

পূর্বশর্ত

এককালীন প্রোডাক্টের জন্য একাধিক অফার কনফিগার করতে, আপনাকে অবশ্যই 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() মেথড থেকে পেতে পারেন।

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

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

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

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

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

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

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

ক্রয় বিকল্প

একটি 'বাই' ক্রয় বিকল্প এককালীন পণ্যটির একটি সাধারণ, সরাসরি ক্রয়কে বোঝায়। এতে একটি ঐচ্ছিক 'লেগ্যাসিকম্প্যাটিবল' ফিল্ড রয়েছে, যা নির্দেশ করে যে এই ক্রয় বিকল্পটি পুরোনো প্লে বিলিং লাইব্রেরি (সংস্করণ ৭ বা তার পুরোনো) ফ্লো-গুলিতে উপলব্ধ হবে কি না, যেগুলো নতুন মডেলটি সমর্থন করে না। পূর্ববর্তী সংস্করণের সাথে সামঞ্জস্যতা বজায় রাখার জন্য, অন্তত একটি 'বাই' ক্রয় বিকল্পকে 'লেগ্যাসি কম্প্যাটিবল' হিসেবে চিহ্নিত করা উচিত।

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

ভাড়া ক্রয় বিকল্প

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

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

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

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

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

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

  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.getSubscriptionOfferDetails()
            // 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<BillingFlowParams.ProductDetailsParams> productDetailsParamsList =
        ImmutableList.of(
            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.getSubscriptionOfferDetails()
                // 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 ইনিশিয়ালাইজ করা এবং গুগল প্লে-এর সাথে সংযোগ স্থাপন করা । এই বিভাগটি প্রি-অর্ডার অফারের জন্য নির্দিষ্ট 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. উপলব্ধ অফারগুলো পুনরুদ্ধার করার সময়, ক্রয় বিকল্প স্ক্রিনসেভারের জন্য LimitedQuantityInfo-এর মান null এবং ডিসকাউন্ট স্ক্রিনসেভারের জন্য অবশিষ্ট পরিমাণের মান ২।

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

জাভা

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() মেথডটি দ্বারা অফারটি আর ফেরত দেওয়া হয় না।

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

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

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

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

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

  3. ব্যবহারকারী প্রথমে কেনা ছাড়যুক্ত স্ক্রিনসেভারটির মূল্য ফেরত চান এবং সফলভাবে সেই অর্থ ফেরত পান। ব্যবহারকারী ছাড়যুক্ত স্ক্রিনসেভারগুলোর মধ্যে একটি কেনার চেষ্টা করেন এবং তার কেনাকাটা সফল হয়।

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

আপনি সেই দেশ বা অঞ্চলগুলি বেছে নিতে পারেন যেখানে ব্যবহারকারীরা ক্রয়ের বিকল্প অফার বা ছাড়ের অফার পাবেন। Google 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 রিটার্ন করে।