এই দস্তাবেজটি প্লে বিলিং লাইব্রেরির সাথে আপনার এককালীন পণ্যের (OTPs) একীকরণের বিবরণ দেয়৷ এটি আরও ব্যাখ্যা করে যে কীভাবে আপনার এককালীন পণ্যগুলির সাথে সম্পর্কিত বিভিন্ন ক্রয়ের বিকল্প এবং অফারগুলিকে একীভূত করতে হয়৷
আপনি আপনার এককালীন পণ্যের জন্য একাধিক ক্রয় বিকল্প এবং অফার কনফিগার করতে পারেন। উদাহরণস্বরূপ, আপনি একই ওয়ান-টাইম পণ্যের জন্য একটি ক্রয় ক্রয়ের বিকল্প এবং একটি প্রি-অর্ডার অফার কনফিগার করতে পারেন।
পূর্বশর্ত
এককালীন পণ্যগুলির জন্য একাধিক অফার কনফিগার করতে, আপনাকে অবশ্যই 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()
পদ্ধতি থেকে পেতে পারেন৷
ক্রয় বিকল্প এবং অফার
একটি ক্রয় বিকল্প আপনাকে সংজ্ঞায়িত করতে দেয় কিভাবে একজন ব্যবহারকারীকে এনটাইটেলমেন্ট দেওয়া হয়, তার মূল্য এবং কোন অঞ্চলে পণ্যটি উপলব্ধ। একটি একক পণ্যের একাধিক ক্রয়ের বিকল্প থাকতে পারে, যা আপনি কোথায় এবং কীভাবে আপনার পণ্য বিক্রি করেন তা উপস্থাপন করতে পারে।
Google Play এককালীন পণ্যগুলির জন্য নিম্নলিখিত ক্রয়ের বিকল্পগুলিকে সমর্থন করে:
- ক্রয় বিকল্প কিনুন
- ভাড়া ক্রয় বিকল্প
অফারগুলি একটি মূল্য নির্ধারণের স্কিমকে নির্দেশ করে যা আপনি আপনার এককালীন পণ্যগুলির জন্য তৈরি করতে পারেন৷ উদাহরণস্বরূপ, আপনি আপনার এককালীন পণ্যের জন্য একটি ডিসকাউন্ট অফার তৈরি করতে পারেন৷
Google Play এককালীন পণ্যগুলির জন্য নিম্নলিখিত ক্রয়ের অফারগুলিকে সমর্থন করে:
- প্রি-অর্ডার অফার (কেবল ক্রয় ক্রয়ের বিকল্পের জন্য সমর্থিত)
- ডিসকাউন্ট অফার (ক্রয় এবং ভাড়া উভয় ক্রয় বিকল্পের জন্য সমর্থিত)
ক্রয় বিকল্প কিনুন
একটি ক্রয় ক্রয় বিকল্পটি এককালীন পণ্যের একটি আদর্শ, সরাসরি ক্রয়ের প্রতিনিধিত্ব করে। এটিতে একটি ঐচ্ছিক লিগ্যাসি-কম্প্যাটিবল ক্ষেত্র রয়েছে, যা নির্দেশ করে যে এই ক্রয়ের বিকল্পটি পুরানো প্লে বিলিং লাইব্রেরিতে (সংস্করণ 7 বা তার বেশি) ফ্লোতে উপলব্ধ হবে কিনা যা নতুন মডেলটিকে সমর্থন করে না৷ পিছনের সামঞ্জস্যের জন্য, অন্তত একটি ক্রয় ক্রয়ের বিকল্পকে লিগ্যাসি সামঞ্জস্যপূর্ণ হিসাবে চিহ্নিত করা উচিত।
PBL-এর সাথে ক্রয় এবং ভাড়া ক্রয়ের বিকল্প উভয়ই একীভূত করার পদক্ষেপগুলি একই। PBL এর সাথে ক্রয় ক্রয়ের বিকল্পটি কীভাবে একীভূত করা যায় তা বোঝার জন্য, PBL-এর সাথে একীভূত ভাড়া ক্রয় বিকল্প দেখুন।
ভাড়া ক্রয় বিকল্প
ভাড়া ক্রয়ের বিকল্প ব্যবহারকারীদের একটি নির্দিষ্ট সময়ের জন্য এককালীন পণ্য অ্যাক্সেস করতে দেয়। আপনি ভাড়ার সময়কাল এবং এর মেয়াদ শেষ হয়ে গেছে উল্লেখ করতে পারেন। এই দস্তাবেজটি প্লে বিলিং লাইব্রেরির (PBL) সাথে ভাড়া ক্রয়ের বিকল্পকে একীভূত করার পদক্ষেপগুলি বর্ণনা করে৷
ভাড়া ক্রয়ের বিকল্পটি PBL এর সাথে একত্রিত করুন
প্লে বিলিং লাইব্রেরি (PBL) এর সাথে ভাড়া ক্রয়ের বিকল্পটি কীভাবে সংহত করা যায় তা এই বিভাগে বর্ণনা করে। এটি অনুমান করে যে আপনি প্রাথমিক PBL ইন্টিগ্রেশন পদক্ষেপগুলির সাথে পরিচিত যেমন, আপনার অ্যাপে PBL নির্ভরতা যোগ করা , BillingClient শুরু করা এবং Google Play-তে সংযোগ করা । এই বিভাগটি PBL ইন্টিগ্রেশন দিকগুলির উপর ফোকাস করে যা ভাড়া ক্রয়ের বিকল্পের জন্য নির্দিষ্ট।
ভাড়ার জন্য উপলব্ধ পণ্যগুলি কনফিগার করার জন্য, আপনাকে Play Developer API বা Play Developer Console UI-এর নতুন monetization.onetimeproducts
পরিষেবা ব্যবহার করতে হবে৷ পরিষেবাটি ব্যবহার করতে, আপনি সরাসরি 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
অবজেক্ট তৈরি করার সময় আপনাকে অবশ্যই ব্যবহারকারীর দ্বারা নির্বাচিত অফারটির সাথে সম্পর্কিত অফার টোকেন সেট করতে হবে। যদি একজন ব্যবহারকারী ভাড়া ক্রয়ের বিকল্পের জন্য যোগ্য হন, তাহলে তারা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 ইন্টিগ্রেশন দিকগুলির উপর ফোকাস করে যা প্রি-অর্ডার অফারের জন্য নির্দিষ্ট।
একটি প্রি-অর্ডার অফারের জন্য একটি ক্রয় প্রবাহ চালু করুন
একটি প্রি-অর্ডার অফারের জন্য একটি ক্রয় প্রবাহ চালু করতে, নিম্নলিখিত পদক্ষেপগুলি করুন:
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
অবজেক্টের একটি রেফারেন্স নেয় যেখানে কলিং queryProductDetailsAsync() থেকে প্রাপ্ত প্রাসঙ্গিকProductDetails
অবজেক্ট রয়েছে। একটিBillingFlowParams
অবজেক্ট তৈরি করতে,BillingFlowParams.Builder class
ব্যবহার করুন। মনে রাখবেন যেBillingFlowParams
অবজেক্ট তৈরি করার সময় আপনাকে অবশ্যই ব্যবহারকারীর দ্বারা নির্বাচিত অফারটির সাথে সম্পর্কিত অফার টোকেন সেট করতে হবে। যদি কোনো ব্যবহারকারী প্রি-অর্ডার অফারের জন্য যোগ্য হন, তাহলে তারাqueryProductDetailsAsync()
পদ্ধতিতে Preorder Details এবং 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()
পদ্ধতি থেকে পেতে পারেন৷
ডিসকাউন্ট অফার
এই বিভাগটি বর্ণনা করে কিভাবে আপনি আপনার এককালীন পণ্যের জন্য ডিসকাউন্ট অফার কনফিগার করতে পারেন।
চারটি ভিন্ন প্যারামিটার আছে যা আপনি এক-কালীন পণ্য ছাড়ের অফারে কনফিগার করতে পারেন:
ডিসকাউন্টেড অফারের মূল্য: মূল মূল্য থেকে ছাড় দেওয়া শতাংশ বা পরম মূল্য সম্পর্কে বিশদ বিবরণ উল্লেখ করে।
দেশ বা অঞ্চলের যোগ্যতা: একটি দেশ বা অঞ্চলে এককালীন পণ্য অফারগুলির প্রাপ্যতা নির্দিষ্ট করে৷
ক্রয়ের সীমা (ঐচ্ছিক): একজন ব্যবহারকারী একই অফার কতবার রিডিম করতে পারবে তা নির্ধারণ করতে দেয়। যদি একজন ব্যবহারকারী ক্রয় সীমা অতিক্রম করে, তবে ব্যবহারকারী অফারটির জন্য অযোগ্য হবেন।
সীমিত সময় (ঐচ্ছিক): অফারটি উপলভ্য সময়কাল নির্দিষ্ট করে। সময়সীমার বাইরে, অফারটি কেনার জন্য অযোগ্য।
ডিসকাউন্ট অফার মূল্য তথ্য পুনরুদ্ধার করুন
একটি ডিসকাউন্ট অফারের জন্য, আপনি ডিসকাউন্টের শতাংশ বা সম্পূর্ণ ডিসকাউন্ট অফার করতে পারেন।
উদাহরণ 1: ডিসকাউন্ট করা অফারের শতাংশ ডিসকাউন্ট পুনরুদ্ধার করুন
নিচের নমুনাটি দেখায় কিভাবে ডিসকাউন্ট করা অফারের আসল পুরো মূল্য এবং শতাংশে ছাড় পেতে হয়। নোট করুন যে শতাংশ ডিসকাউন্ট তথ্য শুধুমাত্র ডিসকাউন্ট অফার জন্য ফেরত দেওয়া হয়.
জাভা
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(); } // … } } } });
উদাহরণ 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()) { 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(); // … } } } } });
ডিসকাউন্ট অফার স্তরে সীমিত পরিমাণ
আপনি ডিসকাউন্ট অফার স্তরে সর্বাধিক পরিমাণের সীমা নির্দিষ্ট করতে পারেন, যা শুধুমাত্র অফার স্তরে প্রয়োগ করা হয়। এখানে ব্যাখ্যা করার জন্য একটি উদাহরণ:
- সুপার স্ক্রিনসেভারের স্ক্রিনসেভার পণ্যের জন্য 2টি অফার রয়েছে: ক্রয় বিকল্প স্ক্রিনসেভার এবং ডিসকাউন্ট স্ক্রিনসেভার।
- ক্রয় বিকল্প স্ক্রিনসেভারের একটি সীমিত পরিমাণ সেট আপ নেই।
- ডিসকাউন্ট স্ক্রিনসেভারে অফারের মাত্রা সর্বোচ্চ অনুমোদিত পরিমাণ 3 এ সেট করা আছে।
- স্ক্রিনসেভার পণ্যটিতে পণ্য স্তরের সর্বাধিক অনুমোদিত পরিমাণ নেই, তাই ব্যবহারকারীরা এই পণ্যটির সীমাহীন পরিমাণ কিনতে পারেন।
- ব্যবহারকারীর কাছে 1টি ডিসকাউন্ট স্ক্রীনসেভার রয়েছে এবং তারা ডিসকাউন্ট স্ক্রিনসেভার সহ আরেকটি কেনার পরিকল্পনা করছে৷
- উপলব্ধ অফারগুলি পুনরুদ্ধার করার সময়, ক্রয় বিকল্প স্ক্রিনসেভারের জন্য LimitedQuantityInfo শূন্য থাকে এবং ডিসকাউন্ট স্ক্রিনসেভারের জন্য অবশিষ্ট পরিমাণের মান হল 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 ব্যবহার করা কেনাকাটা বা মুলতুবি কেনাকাটা বিবেচনা করে। যে কেনাকাটা বাতিল করা হয়েছে, ফেরত দেওয়া হয়েছে বা চার্জ-ব্যাক করা হয়েছে সেগুলি ব্যবহারকারীর মালিকানাধীন পরিমাণে গণনা করা হয় না। যেমন:
সুপার স্ক্রিনসেভারগুলি সর্বাধিক অনুমোদিত পরিমাণের সাথে একটি ডিসকাউন্ট অফার সেট আপ করে, যাতে ব্যবহারকারীরা একটি ছাড়যুক্ত স্ক্রিনসেভার কিনতে পারেন৷
ব্যবহারকারী ডিসকাউন্টেড স্ক্রিনসেভারের একটি ক্রয় করেন। ব্যবহারকারী যদি দ্বিতীয় ছাড়যুক্ত স্ক্রিনসেভার কেনার চেষ্টা করে, তবে এটি ত্রুটিপূর্ণ হবে এবং
PurchasesUpdatedListener
একটি ITEM_UNAVAILABLE প্রতিক্রিয়া কোড পাবে৷ব্যবহারকারী আসলভাবে কেনা ডিসকাউন্টেড স্ক্রিনসেভারের ফেরত চেয়েছেন এবং সফলভাবে ফেরত পাবেন। ব্যবহারকারী ডিসকাউন্টযুক্ত স্ক্রিনসেভারের একটি কেনার চেষ্টা করে এবং ক্রয়টি সফল হবে।
দেশ এবং অঞ্চলের যোগ্যতা
আপনি দেশ বা অঞ্চল বেছে নিতে পারেন যেখানে ক্রয় বিকল্প অফার বা ডিসকাউন্ট অফার ব্যবহারকারীদের জন্য উপলব্ধ হবে। 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
প্রদান করে।