এই ডকুমেন্টে আপনার এককালীন প্রোডাক্ট (OTP)-এর সাথে Play Billing Library-এর ইন্টিগ্রেশন সম্পর্কে বিস্তারিত বলা আছে। এছাড়াও, এটি ব্যাখ্যা করে যে কীভাবে আপনার এককালীন প্রোডাক্টের সাথে সম্পর্কিত বিভিন্ন কেনাকাটার বিকল্প এবং অফার ইন্টিগ্রেট করতে হয়।
আপনার একবার কেনা যায় এমন প্রোডাক্টের জন্য একাধিক কেনাকাটার বিকল্প এবং অফার কনফিগার করতে পারবেন। যেমন, আপনি একই একবার কেনা যাবে এমন প্রোডাক্টের জন্য একটি কেনার বিকল্প এবং একটি প্রি-অর্ডার অফার কনফিগার করতে পারেন।
পূর্বশর্ত
এককালীন প্রোডাক্টের জন্য একাধিক অফার কনফিগার করতে, আপনাকে অবশ্যই
queryProductDetailsAsync() API ব্যবহার করতে হবে। পুরনো হয়ে যাওয়া querySkuDetailsAsync()
API কাজ করে না। queryProductDetailsAsync() কীভাবে ব্যবহার করতে হয় এবং launchBillingFlow()
এর কোন ভার্সন ProductDetailsParams ইনপুট হিসেবে নেয়, সেই সম্পর্কে জানতে মাইগ্রেশন ধাপ দেখুন।
প্রোডাক্টের বিবরণ সম্পর্কে প্রশ্ন করুন
আপনার এককালীন
প্রোডাক্টের জন্য একাধিক অফার বা কেনার বিকল্প কনফিগার করে থাকলে, queryProductDetailsAsync() মেথড দ্বারা রিটার্ন করা
ProductDetails অবজেক্টে এককালীন প্রোডাক্ট পিছু একাধিক উপলভ্য কেনার
ও (বা) ভাড়া নেওয়ার বিকল্প থাকতে পারে। প্রতিটি ProductDetails অবজেক্টের জন্য উপযুক্ত অফারের
তালিকা পেতে, getOneTimePurchaseOfferDetailsList() মেথড ব্যবহার করুন। এই তালিকার অংশ হিসেবে শুধুমাত্র সেইসব অফার ও কেনাকাটার বিকল্প
ফেরত দেওয়া হবে যেগুলির জন্য ব্যবহারকারী উপযুক্ত। onProductDetailsResponse() পদ্ধতিতে আপনার কোডকে রিটার্ন করা
অফার ম্যানেজ করতে হবে।
বিলিং ফ্লো লঞ্চ করা
আপনার অ্যাপ থেকে কেনাকাটার অনুরোধ শুরু করতে, আপনার অ্যাপের মূল থ্রেড থেকে launchBillingFlow()
মেথড কল করুন। এই পদ্ধতিটি queryProductDetailsAsync() কল করার মাধ্যমে পাওয়া প্রাসঙ্গিক ProductDetails অবজেক্ট সহ
BillingFlowParams অবজেক্টের রেফারেন্স নেয়। 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);
OneTimePurchaseOfferDetails-এর অংশ হিসেবে offerToken খুঁজে পাওয়া যাবে। আপনি
ব্যবহারকারীকে অফার দেখানোর সময়, নিশ্চিত করুন যে আপনি সঠিক অফার টোকেন সহ বিলিং ফ্লো
প্যারামিটার কনফিগার করেছেন, যা আপনি
oneTimePurchaseOfferDetails.getOfferToken() পদ্ধতি থেকে পেতে পারেন।
কেনাকাটার বিকল্প ও অফার
কেনাকাটার বিকল্পের মাধ্যমে আপনি নির্ধারণ করতে পারবেন যে কীভাবে কোনও ব্যবহারকারীকে এনটাইটেলমেন্ট দেওয়া হবে, এর দাম কত এবং কোন অঞ্চলে প্রোডাক্টটি উপলভ্য। একটি প্রোডাক্টের একাধিক কেনাকাটার বিকল্প থাকতে পারে, যা থেকে বোঝা যায় আপনি কোথায় এবং কীভাবে আপনার প্রোডাক্ট বিক্রি করেন।
এককালীন প্রোডাক্টের জন্য Google Play-তে নিম্নলিখিত কেনাকাটার বিকল্প কাজ করে:
- কেনাকাটার বিকল্প কেনা
- ভাড়া নেওয়ার পরে কেনার বিকল্প
অফার হল এমন একটি প্রাইসিং স্কিম যা আপনি নিজের একবার কেনা যাবে এমন প্রোডাক্টের জন্য তৈরি করতে পারেন। যেমন, আপনার এককালীন প্রোডাক্টের জন্য ছাড়ের অফার তৈরি করতে পারেন।
একবার কেনা যাবে এমন প্রোডাক্টের জন্য Google Play নিম্নলিখিত কেনাকাটার অফার কাজ করে:
- প্রি-অর্ডার অফার (শুধু কেনার বিকল্পের জন্য কাজ করে)
- ছাড়ের অফার (কেনা ও ভাড়া নেওয়া, উভয় বিকল্পের ক্ষেত্রে কাজ করে)
কেনাকাটার বিকল্প কিনুন
'কেনাকাটা' বিকল্পের মাধ্যমে এককালীন প্রোডাক্টের স্ট্যান্ডার্ড, সরাসরি কেনাকাটা বোঝায়। এতে একটি ঐচ্ছিক legacyCompatible ফিল্ড আছে, যা ইঙ্গিত করে যে এই কেনাকাটার বিকল্পটি পুরনো Play Billing Library (ভার্সন ৭ বা এর আগের) ফ্লোতে উপলভ্য হবে কিনা যা নতুন মডেলকে সাপোর্ট করে না। ব্যাকওয়ার্ড কম্প্যাটিবিলিটির জন্য, অন্তত একটি কেনাকাটার বিকল্প পুরনো ভার্সনের সাথে মানানসই হিসেবে চিহ্নিত করতে হবে।
PBL-এর সাথে কেনা ও ভাড়া নেওয়া, এই দুটি বিকল্প ইন্টিগ্রেট করার ধাপগুলি একই। PBL-এর সাথে কেনাকাটার বিকল্প কীভাবে ইন্টিগ্রেট করতে হয় তা বুঝতে, PBL-এর সাথে ভাড়া নেওয়ার বিকল্প ইন্টিগ্রেট করুন দেখুন।
ভাড়া কেনার বিকল্প
ভাড়া দিয়ে কেনার বিকল্প ব্যবহারকারীদের নির্দিষ্ট সময়সীমার জন্য এককালীন প্রোডাক্ট অ্যাক্সেস করতে দেয়। আপনি ভাড়ার সময়সীমা ও মেয়াদ শেষ হওয়ার তারিখ নির্দিষ্ট করতে পারবেন। এই ডকুমেন্টে, Play Billing Library (PBL)-এর সাথে ভাড়া নেওয়া বা কেনার বিকল্প ইন্টিগ্রেট করার ধাপগুলি বর্ণনা করা হয়েছে।
PBL-এর সাথে ভাড়া কেনার বিকল্প ইন্টিগ্রেট করা
এই বিভাগে, Play Billing Library (PBL)-এর সাথে ভাড়া কেনার বিকল্প কীভাবে ইন্টিগ্রেট করতে হয় তা বর্ণনা করা হয়েছে। এটি ধরে নেয় যে আপনি প্রাথমিক PBL ইন্টিগ্রেশন ধাপগুলি সম্পর্কে পরিচিত, যেমন, আপনার অ্যাপে PBL ডিপেন্ডেন্সি যোগ করা, BillingClient শুরু করা এবং Google Play-তে কানেক্ট করা। এই বিভাগে, PBL ইন্টিগ্রেশনের সেইসব দিকগুলি তুলে ধরা হয়েছে যেগুলি ভাড়া নেওয়ার বিকল্পের ক্ষেত্রে নির্দিষ্ট।
ভাড়ার জন্য উপলভ্য প্রোডাক্ট কনফিগার করতে, আপনাকে নতুন
monetization.onetimeproducts Play Developer API পরিষেবা অথবা Play
Developer Console UI ব্যবহার করতে হবে। পরিষেবা ব্যবহার করতে, আপনি সরাসরি REST API কল করতে পারেন অথবা
Java ক্লায়েন্ট লাইব্রেরি ব্যবহার করতে পারেন।
ভাড়ার বিকল্পের জন্য কেনাকাটার প্রসেস চালু করা
ভাড়া সংক্রান্ত অফারের জন্য পারচেজ ফ্লো চালু করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:
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(); } } } } } });
বিলিং ফ্লো লঞ্চ করুন।
আপনার অ্যাপ থেকে কেনাকাটার অনুরোধ শুরু করতে, আপনার অ্যাপের মূল থ্রেড থেকে
launchBillingFlow()মেথড কল করুন। এই পদ্ধতিBillingFlowParamsঅবজেক্টের রেফারেন্স নেয়, যার মধ্যেqueryProductDetailsAsync()কল করে পাওয়া প্রাসঙ্গিকProductDetailsঅবজেক্ট থাকে।BillingFlowParamsঅবজেক্ট তৈরি করতে,BillingFlowParams.Builderক্লাস ব্যবহার করুন। মনে রাখবেন যেBillingFlowParamsঅবজেক্ট তৈরি করার সময় ব্যবহারকারীর বেছে নেওয়া অফারের সাথে সম্পর্কিত অফার টোকেন আপনাকে অবশ্যই সেট করতে হবে। কোনও ব্যবহারকারী যদি ভাড়া নেওয়া বা কেনার বিকল্পের জন্য উপযুক্ত হন, তাহলে তিনি RentalDetails ও offerId সহqueryProductDetailsAsync()-এ একটি অফার পাবেন।বিলিং ফ্লো কীভাবে লঞ্চ করতে হয় তা নিম্নলিখিত নমুনা থেকে জানতে পারবেন:
Kotlin
// 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);
OneTimePurchaseOfferDetails-এর অংশ হিসেবেofferTokenখুঁজে পাওয়া যাবে। ব্যবহারকারীকে অফার দেখানোর সময়, আপনি যে সঠিক অফার টোকেন ব্যবহার করছেন তা নিশ্চিত করুন। এই টোকেনটি আপনিoneTimePurchaseOfferDetails.getOfferToken()পদ্ধতি থেকে পেতে পারেন।
প্রি-অর্ডার অফার
প্রি-অর্ডার আপনাকে একবার কেনা যাবে এমন প্রোডাক্ট সেট-আপ করতে দেয় যা আইটেম রিলিজ হওয়ার আগে কেনা যাবে। কোনও ব্যবহারকারী আপনার প্রোডাক্টের প্রি-অর্ডার করলে, প্রোডাক্ট রিলিজ হওয়ার পরে সেটির জন্য পেমেন্ট করতে তিনি সম্মতি জানান। তবে, রিলিজ হওয়ার তারিখের আগে তিনি প্রি-অর্ডার বাতিল করলে পেমেন্ট করতে হবে না। রিলিজের তারিখে ক্রেতাকে চার্জ করা হয় এবং আইটেমটি রিলিজ করা হয়েছে বলে Play তাকে ইমেলের মাধ্যমে বিজ্ঞপ্তি পাঠাবে।
এই ডকুমেন্টে Play Billing Library (PBL)-এর সাথে প্রি-অর্ডার কেনাকাটার অফার ইন্টিগ্রেট করার ধাপগুলি বর্ণনা করা হয়েছে।
PBL-এর সাথে প্রি-অর্ডার অফার ইন্টিগ্রেট করা
এই বিভাগে Play Billing Library (PBL)-এর সাথে প্রি-অর্ডার অফার কীভাবে ইন্টিগ্রেট করতে হয় তা বর্ণনা করা হয়েছে। এটি ধরে নেয় যে আপনি প্রাথমিক PBL ইন্টিগ্রেশন ধাপগুলি সম্পর্কে পরিচিত, যেমন, আপনার অ্যাপে PBL ডিপেন্ডেন্সি যোগ করা, BillingClient শুরু করা এবং Google Play-তে কানেক্ট করা। এই বিভাগে, প্রি-অর্ডার অফারের জন্য নির্দিষ্ট PBL ইন্টিগ্রেশন সংক্রান্ত বিষয়গুলির উপর ফোকাস করা হয়েছে।
প্রি-অর্ডার অফারের জন্য পারচেজ ফ্লো চালু করা
প্রি-অর্ডার অফারের জন্য পারচেজ ফ্লো চালু করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:
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(); } } } } } });
বিলিং ফ্লো চালু করুন।
আপনার অ্যাপ থেকে কেনাকাটার অনুরোধ শুরু করতে, আপনার অ্যাপের মূল থ্রেড থেকে
launchBillingFlow()মেথড কল করুন। এই পদ্ধতিতেBillingFlowParamsঅবজেক্টের রেফারেন্স নেওয়া হয়, যাতে প্রাসঙ্গিকProductDetailsঅবজেক্ট থাকে। এটি queryProductDetailsAsync() কল করে পাওয়া যায়।BillingFlowParamsঅবজেক্ট তৈরি করতে,BillingFlowParams.Builder classব্যবহার করুন। মনে রাখবেন,BillingFlowParamsঅবজেক্ট তৈরি করার সময় ব্যবহারকারীর বেছে নেওয়া অফারের সাথে সম্পর্কিত অফার টোকেন আপনাকে সেট করতে হবে। কোনও ব্যবহারকারী প্রি-অর্ডার অফারের জন্য উপযুক্ত হলে, তিনি PreorderDetails এবং offerId সহ একটি অফারqueryProductDetailsAsync()পদ্ধতিতে পাবেন।বিলিং ফ্লো কীভাবে লঞ্চ করতে হয় তা নিম্নলিখিত নমুনা থেকে জানতে পারবেন:
জাভা
// 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(); // … } } } } });
ছাড়ের অফার লেভেলে সীমিত পরিমাণ
আপনি ছাড়ের অফার লেভেলে সর্বাধিক কোয়ান্টির সীমা নির্দিষ্ট করতে পারবেন, অর্থাৎ এটি শুধুমাত্র অফার লেভেলে প্রযোজ্য হবে। এখানে একটি উদাহরণ দেওয়া হল:
- Super screensavers-এ স্ক্রিনসেভার প্রোডাক্টের জন্য ২টি অফার আছে: স্ক্রিনসেভার কেনার বিকল্প
এবং ডিসকাউন্ট স্ক্রিনসেভার।
- কেনাকাটার বিকল্পের স্ক্রিনসেভারে সীমিত পরিমাণ সেট-আপ করা নেই।
- ছাড়ের স্ক্রিনসেভারে অফার লেভেল সর্বাধিক অনুমোদিত কোয়ান্টিটি ৩ হিসেবে সেট করা আছে।
- স্ক্রিনসেভার প্রোডাক্টে প্রোডাক্ট লেভেল সর্বাধিক অনুমোদিত পরিমাণ নেই, তাই ব্যবহারকারীরা এই প্রোডাক্টের আনলিমিটেড পরিমাণ কিনতে পারবেন।
- ব্যবহারকারীর কাছে ১টি ডিসকাউন্ট স্ক্রিনসেভার আছে এবং তিনি ডিসকাউন্ট স্ক্রিনসেভার ব্যবহার করে আরেকটি কেনার পরিকল্পনা করেছেন।
- উপলভ্য অফারগুলি ফিরিয়ে আনার সময়, কেনাকাটার বিকল্প স্ক্রিনসেভারের জন্য LimitedQuantityInfo শূন্য এবং ডিসকাউন্ট স্ক্রিনসেভারের জন্য অবশিষ্ট পরিমাণের মান ২।
নিচের নমুনা থেকে কীভাবে ছাড়ের অফার লেভেলে সীমিত সংখ্যায় আইটেম পাওয়া যায় তা দেখুন:
জাভা
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, ব্যবহার করা হয়ে গেছে এমন কেনাকাটা বা বাকি থাকা কেনাকাটা বিবেচনা করে। বাতিল, রিফান্ড বা চার্জব্যাক করা কেনাকাটা ব্যবহারকারীর মালিকানাধীন পরিমাণের মধ্যে গণনা করা হয় না। যেমন:
সুপার স্ক্রিনসেভার একটি ডিসকাউন্ট অফার সেট-আপ করে যার সর্বাধিক অনুমোদিত পরিমাণ এক, তাই ব্যবহারকারীরা সর্বাধিক একটি ডিসকাউন্টযুক্ত স্ক্রিনসেভার কিনতে পারবেন।
ব্যবহারকারী ছাড়প্রাপ্ত স্ক্রিনসেভারগুলির মধ্যে একটি কেনেন। ব্যবহারকারী যদি তারপরে দ্বিতীয় ডিসকাউন্ট স্ক্রিনসেভার কেনার চেষ্টা করেন, তাহলে সমস্যা হবে এবং
PurchasesUpdatedListenerITEM_UNAVAILABLE রেসপন্স কোড পাবে।ব্যবহারকারী প্রথমে কেনা স্ক্রিন সেভারের রিফান্ড চান এবং রিফান্ড পেয়ে যান। ব্যবহারকারী ছাড় দেওয়া স্ক্রিনসেভারের মধ্যে একটি কেনার চেষ্টা করলে, কেনাকাটা সম্পূর্ণ হবে।
দেশ ও অঞ্চল অনুযায়ী যোগ্যতা
আপনি সেইসব দেশ বা অঞ্চল বেছে নিতে পারবেন যেখানে ব্যবহারকারীদের জন্য কেনার বিকল্প অফার বা ডিসকাউন্ট
অফার উপলভ্য থাকবে। 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(); // … } } } });
অফার ট্যাগ ইনহেরিট করা
আপনি প্রোডাক্ট, কেনাকাটার বিকল্প বা ডিসকাউন্ট অফারের জন্য অফার ট্যাগ সেট করতে পারবেন। ছাড়ের অফার তার কেনাকাটার বিকল্প অফার থেকে অফার ট্যাগ ইনহেরিট করে। একইভাবে, প্রোডাক্ট লেভেলে অফার ট্যাগ নির্দিষ্ট করা থাকলে, 'কেনাকাটার বিকল্প অফার' এবং ডিসকাউন্ট অফার, দু'টিই প্রোডাক্ট অফার ট্যাগ ইনহেরিট করে।
যেমন, Super screensavers-এর স্ক্রিনসেভার প্রোডাক্টের জন্য দুটি অফার আছে; স্ক্রিনসেভার কেনার বিকল্প এবং ডিসকাউন্ট স্ক্রিনসেভার।
- Super screensaver-এ প্রোডাক্ট অফার ট্যাগ
SSProductTagআছে। - কেনাকাটার বিকল্প স্ক্রিনসেভারে
SSPurchaseOptionTagঅফার ট্যাগ আছে। - ডিসকাউন্ট স্ক্রিনসেভারে অফার ট্যাগ
SSDiscountOfferTagআছে।
এই উদাহরণে, কেনাকাটার বিকল্পের অফারের জন্য oneTimePurchaseOfferDetails.getOfferTagsList() পদ্ধতি SSProductTag এবং SSPurchaseOptionTag রিটার্ন করে।
ছাড়ের অফারের জন্য, পদ্ধতিটি SSProductTag, SSPurchaseOptionTag,
এবং SSDiscountOfferTag রিটার্ন করে।