Play Billing লাইব্রেরি কল কোনও অ্যাকশন ট্রিগার করলে, লাইব্রেরি একটি
BillingResult
উত্তর রিটার্ন করে ডেভেলপারদের ফলাফল সম্পর্কে জানায়। যেমন, আপনি যদি ব্যবহারকারীর জন্য উপলভ্য অফার পেতে
queryProductDetailsAsync
ব্যবহার করেন, তাহলে উত্তর কোডে হয়
OK কোড থাকে এবং সঠিক ProductDetails
অবজেক্ট প্রদান করা হয় অথবা এতে অন্য একটি উত্তর থাকে যা
ProductDetails
অবজেক্ট প্রদান করা যায়নি তার কারণ নির্দেশ করে।
সব রেসপন্স কোডই সমস্যা নয়। BillingResponseCode
রেফারেন্স পৃষ্ঠায় এই নির্দেশিকায় আলোচনা করা
প্রতিটি উত্তরের বিস্তারিত বিবরণ দেওয়া আছে।
ভুল নির্দেশ করে না এমন রেসপন্স কোডের কিছু উদাহরণ হল:
BillingClient.BillingResponseCode.OK: কলের মাধ্যমে ট্রিগার করা অ্যাকশন সফলভাবে সম্পূর্ণ হয়েছে।BillingClient.BillingResponseCode.USER_CANCELED: ব্যবহারকারীকে Play Store UI ফ্লো দেখানো অ্যাকশনের ক্ষেত্রে, এই উত্তর থেকে বোঝা যায় যে ব্যবহারকারী প্রসেস সম্পূর্ণ না করেই UI ফ্লো থেকে বেরিয়ে গেছেন।
রেসপন্স কোড কোনও সমস্যার ইঙ্গিত দিলে, সেটির কারণ কখনও কখনও
ক্ষণস্থায়ী পরিস্থিতি হয় এবং তাই রিকভারি সম্ভব। Play
Billing Library-র কোনও পদ্ধতিতে কল করলে, যদি BillingResponseCode
এমন ভ্যালু রিটার্ন করে যা থেকে বোঝা যায় যে সমস্যাটি সমাধান করা যাবে, তাহলে আপনাকে আবার কল করতে হবে। অন্যান্য
ক্ষেত্রে, পরিস্থিতিকে ক্ষণস্থায়ী হিসেবে বিবেচনা করা হয় না এবং তাই আবার চেষ্টা করার
সুপারিশ করা হয় না।
ব্যবহারকারী সেশনে থাকাকালীন সমস্যা হলে—যেমন, ব্যবহারকারী
কেনাকাটার প্রসেস সম্পূর্ণ করার সময়—অথবা ব্যাকগ্রাউন্ডে সমস্যা হলে—যেমন, onResume চলাকালীন ব্যবহারকারীর আগে করা কেনাকাটা কোয়েরি করার সময়—
এই ধরনের বিভিন্ন ফ্যাক্টরের উপর নির্ভর করে সাময়িক সমস্যার জন্য আলাদা আলাদা রিট্রাই স্ট্র্যাটেজি প্রয়োজন হয়।
নিচে দেওয়া আবার চেষ্টা করার কৌশল বিভাগে
এইসব আলাদা আলাদা কৌশল এবং আবার চেষ্টা করা যায় এমন BillingResult
উত্তর বিভাগ
সম্পর্কিত উদাহরণ দেওয়া আছে। এই বিভাগ থেকে কোন উত্তর কোডের জন্য কোন কৌশল সবচেয়ে ভালো কাজ করে সেই বিষয়ে পরামর্শ পাওয়া যায়।
রেসপন্স কোড ছাড়াও, কিছু সমস্যার উত্তরে ডিবাগিং ও লগিং সংক্রান্ত মেসেজ থাকে।
আবার চেষ্টা করার স্ট্র্যাটেজি
সহজ রিট্রাই
ব্যবহারকারী সেশনে থাকলে, একটি সাধারণ আবার চেষ্টা করার স্ট্র্যাটেজি প্রয়োগ করা ভাল, যাতে সমস্যাটি ব্যবহারকারীর অভিজ্ঞতাকে যতটা সম্ভব কম ব্যাহত করে। সেই ক্ষেত্রে, আমরা একটি সাধারণ আবার চেষ্টা করার কৌশল সাজেস্ট করি, যেখানে সর্বাধিক বার চেষ্টা করার পরে প্রসেসটি বন্ধ করে দেওয়া হয়।
BillingClient
কানেকশন স্থাপন করার সময়
error
হ্যান্ডেল করার জন্য নিম্নলিখিত উদাহরণে একটি সাধারণ আবার চেষ্টা করার স্ট্র্যাটেজি দেখানো হয়েছে:
// Initialize the BillingClient. private val billingClient = BillingClient.newBuilder(context) .setListener(this) .enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build()) .build() private val coroutineScope = kotlinx.coroutines.CoroutineScope( kotlinx.coroutines.SupervisorJob() + kotlinx.coroutines.Dispatchers.Main.immediate ) private var connectionJob: kotlinx.coroutines.Job? = null // Establish a connection to Google Play. fun startBillingConnection() { connectionJob?.cancel() connectionJob = coroutineScope.launch { connectWithRetry() } } // Suspended helper to perform a single connection attempt private suspend fun connectBilling(): BillingResult = kotlinx.coroutines.suspendCancellableCoroutine { continuation -> billingClient.startConnection(object : BillingClientStateListener { override fun onBillingSetupFinished(billingResult: BillingResult) { if (continuation.isActive) { continuation.resume(billingResult) } } override fun onBillingServiceDisconnected() { Log.e(TAG, "Google Play Billing Service disconnected") if (continuation.isActive) { continuation.resume( BillingResult.newBuilder() .setResponseCode(BillingClient.BillingResponseCode.SERVICE_DISCONNECTED) .setDebugMessage("Service disconnected during connection setup") .build() ) } else { startBillingConnection() } } }) } // Billing connection retry logic. This is a simple max retry pattern private suspend fun connectWithRetry() { val maxTries = 3 var tries = 1 var isConnectionEstablished = false while (tries <= maxTries && !isConnectionEstablished) { val billingResult = connectBilling() if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) { isConnectionEstablished = true Log.d(TAG, "Billing response OK") } else { Log.e(TAG, "Billing connection retry failed: ${billingResult.debugMessage}") tries++ if (tries <= maxTries) { delay(2000L) // Wait 2 seconds before retrying } } } } fun cleanUp() { coroutineScope.cancel() } // ...
এক্সপোনেনশিয়াল ব্যাকঅফ রিট্রাই
আমরা Play Billing Library অপারেশনের জন্য এক্সপোনেনশিয়াল ব্যাকঅফ ব্যবহার করার সাজেশন দিই যা ব্যাকগ্রাউন্ডে হয় এবং ব্যবহারকারী সেশনে থাকাকালীন ব্যবহারকারীর অভিজ্ঞতাকে প্রভাবিত করে না।
যেমন, নতুন কেনাকাটা কনফার্ম করার সময় এটি প্রয়োগ করা উপযুক্ত হবে, কারণ এই অপারেশন ব্যাকগ্রাউন্ডে হতে পারে এবং কোনও সমস্যা হলে রিয়েল-টাইমে কনফার্ম করার প্রয়োজন নেই।
private suspend fun acknowledge(purchaseToken: String): BillingResult = kotlinx.coroutines.suspendCancellableCoroutine { continuation -> val params = AcknowledgePurchaseParams.newBuilder() .setPurchaseToken(purchaseToken) .build() billingClient.acknowledgePurchase(params) { billingResult -> continuation.resumeWith(Result.success(billingResult)) } } private suspend fun queryPurchases(productType: String): Pair<BillingResult, List<Purchase>> = kotlinx.coroutines.suspendCancellableCoroutine { continuation -> val params = QueryPurchasesParams.newBuilder() .setProductType(productType) .build() billingClient.queryPurchasesAsync(params) { billingResult, purchaseList -> continuation.resumeWith(Result.success(Pair(billingResult, purchaseList))) } } suspend fun acknowledgePurchase(purchaseToken: String) { val retryDelayMs = 2000L val retryFactor = 2 val maxTries = 3 var tries = 1 var currentDelay = retryDelayMs var acknowledgePurchaseResult: BillingResult do { acknowledgePurchaseResult = acknowledge(purchaseToken) val playBillingResponseCode = acknowledgePurchaseResult.responseCode when (playBillingResponseCode) { BillingClient.BillingResponseCode.OK -> { Log.i(TAG, "Acknowledgement was successful") return } BillingClient.BillingResponseCode.ITEM_NOT_OWNED -> { Log.d(TAG, "Acknowledgement failed with ITEM_NOT_OWNED") val (billingResult, purchaseList) = queryPurchases(BillingClient.ProductType.SUBS) if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) { purchaseList.forEach { purchase -> acknowledge(purchase.purchaseToken) } } return } in setOf( BillingClient.BillingResponseCode.ERROR, BillingClient.BillingResponseCode.SERVICE_DISCONNECTED, BillingClient.BillingResponseCode.SERVICE_UNAVAILABLE, ) -> { Log.d( TAG, "Acknowledgement failed, but can be retried -- " + "Response Code: ${acknowledgePurchaseResult.responseCode} -- " + "Debug Message: ${acknowledgePurchaseResult.debugMessage}" ) if (tries < maxTries) { delay(currentDelay) currentDelay *= retryFactor tries++ } else { break } } else -> { Log.e( TAG, "Acknowledgement failed and cannot be retried -- " + "Response Code: ${acknowledgePurchaseResult.responseCode} -- " + "Debug Message: ${acknowledgePurchaseResult.debugMessage}" ) throw Exception("Failed to acknowledge the purchase!") } } } while (tries <= maxTries) throw Exception("Failed to acknowledge the purchase after $maxTries attempts!") }
আবার চেষ্টা করা যায় এমন BillingResult উত্তর
NETWORK_ERROR (সমস্যার কোড 12)
সমস্যা
এই সমস্যার অর্থ হল, ডিভাইস ও Play সিস্টেমের মধ্যে নেটওয়ার্ক কানেকশনে সমস্যা হয়েছে।
সম্ভাব্য সমাধান
রিকভার করতে, কোন অ্যাকশন সমস্যার কারণ হয়েছে তার উপর নির্ভর করে সাধারণ রিট্রাই বা এক্সপোনেনশিয়াল ব্যাকঅফ ব্যবহার করুন।
SERVICE_TIMEOUT (সমস্যার কোড -৩)
সমস্যা
এই সমস্যার অর্থ হল, Google Play উত্তর দেওয়ার আগেই অনুরোধটি সর্বাধিক টাইম-আউটে পৌঁছে গেছে। Play Billing লাইব্রেরি কলের মাধ্যমে অনুরোধ করা অ্যাকশন সম্পন্ন করতে দেরি হলে, এটি হতে পারে।
সম্ভাব্য সমাধান
এটি সাধারণত সাময়িক সমস্যা। কোন অ্যাকশন থেকে এরর ফিরে এসেছে তার উপর নির্ভর করে, সাধারণ বা এক্সপোনেনশিয়াল ব্যাকঅফ স্ট্র্যাটেজি ব্যবহার করে অনুরোধটি আবার করার চেষ্টা করুন।
SERVICE_DISCONNECTED
নিচে উল্লেখ করা ঘটনার মতো, Google Play বিলিং পরিষেবার সাথে কানেকশন বিচ্ছিন্ন হয় না এবং আপনাকে
শুধুমাত্র Play Billing Library-এর যে অপারেশনটি করার চেষ্টা করা হয়েছিল সেটি আবার চেষ্টা করতে হবে।
SERVICE_DISCONNECTED (Error Code -1)
সমস্যা
এই মারাত্মক সমস্যাটি ইঙ্গিত করে যে ক্লায়েন্ট অ্যাপের কানেকশন BillingClient
এর মাধ্যমে Google Play
Store পরিষেবার সাথে বিচ্ছিন্ন হয়ে গেছে।
সম্ভাব্য সমাধান
খুবই সাজেস্ট করা হয়: অটোমেটিক পরিষেবা আবার কানেক্ট করা চালু করুন
Play Billing Library-এর 8.0.0 ভার্সনে
enableAutoServiceReconnection() ফিচারটি যোগ করা হয়েছে।
আপনার
BillingClient তৈরি করার সময় এই ফিচার চালু করার জন্য অত্যন্ত সাজেস্ট করা হয়। এর ফলে, পরিষেবা ডিসকানেক্ট করা অবস্থায় বিলিং API কল করা হলে, লাইব্রেরি অটোমেটিক কানেকশন আবার
স্থাপন করার চেষ্টা করতে পারে। এর ফলে এই সমস্যার ঘটনা উল্লেখযোগ্যভাবে কমে যায়।
Kotlin
val billingClient = BillingClient.newBuilder(context) .setListener(listener) .enablePendingPurchases( PendingPurchasesParams.newBuilder().enableOneTimeProducts().build() ) .enableAutoServiceReconnection() // Enable automatic service reconnection .build()
জাভা
BillingClient billingClient = BillingClient.newBuilder(context)
.setListener(listener)
.enablePendingPurchases()
.enableAutoServiceReconnection() // Enable automatic service reconnection
.build();
আপনি যদি অটোমেটিক পরিষেবা আবার কানেক্ট করার সুবিধা চালু করে থাকেন
Play Billing Library অটোমেটিক আবার কানেক্ট করার চেষ্টা করবে। আপনি যদি এখনও API কল করার সময় SERVICE_DISCONNECTED রেসপন্স কোড পান, তাহলে
বুঝতে হবে যে অটোমেটিক চেষ্টা করার পরেও লাইব্রেরি আবার কানেক্ট করতে পারেনি।
এই পরিস্থিতিতে, আপনার অ্যাপে আবার চেষ্টা করার লজিক প্রয়োগ করা উচিত:
- ব্যবহারকারীর দ্বারা শুরু করা অ্যাকশনের (ইন-সেশন) ক্ষেত্রে: API কলের সাধারণ রিট্রাই ব্যবহার করুন। অন্তর্নিহিত সমস্যাটি সাময়িক হতে পারে।
- ব্যাকগ্রাউন্ড অনুরোধের জন্য: ডিসকানেকশন দীর্ঘস্থায়ী হলে সিস্টেমকে ওভারলোড করা এড়াতে এক্সপোনেনশিয়াল ব্যাকঅফ সহ আবার চেষ্টা করার সুবিধা প্রয়োগ করুন।
আপনি অটোমেটিক পরিষেবা আবার কানেক্ট করার সুবিধা চালু না করে থাকলে
এই সমস্যা যতটা সম্ভব এড়াতে, Play Billing Library-এর মাধ্যমে কল করার আগে, সবসময় Google
Play পরিষেবার সাথে কানেকশন চেক করে নিন। এটি করার জন্য
BillingClient.isReady() কল করুন।
SERVICE_DISCONNECTED থেকে রিকভার করার চেষ্টা করতে
, আপনার ক্লায়েন্ট অ্যাপকেBillingClient.startConnection ব্যবহার করে কানেকশন আবার স্থাপন করার চেষ্টা করতে হবে।
SERVICE_TIMEOUT-এর মতো, কোন অ্যাকশন সমস্যার
কারণ হয়েছে তার উপর নির্ভর করে, সাধারণ রিট্রাই বা এক্সপোনেনশিয়াল ব্যাকঅফ ব্যবহার করুন।
SERVICE_UNAVAILABLE (সমস্যার কোড ২)
গুরুত্বপূর্ণ নোট:
Google Play Billing Library 6.0.0 থেকে শুরু করে, নেটওয়ার্ক সংক্রান্ত সমস্যার জন্য SERVICE_UNAVAILABLE আর
ফেরত দেওয়া হয় না। বিলিং পরিষেবা
উপলভ্য না থাকলে এবং SERVICE_TIMEOUT কেস সিনারিও বাতিল করা হলে এটি ফেরত দেওয়া হয়।
সমস্যা
এই সাময়িক সমস্যাটি ইঙ্গিত করে যে Google Play বিলিং পরিষেবা বর্তমানে উপলভ্য নেই। বেশিরভাগ ক্ষেত্রে, এর অর্থ হল ক্লায়েন্ট ডিভাইস এবং Google Play বিলিং পরিষেবার মধ্যে কোথাও নেটওয়ার্ক কানেকশন সংক্রান্ত সমস্যা রয়েছে।
সম্ভাব্য সমাধান
এটি সাধারণত সাময়িক সমস্যা। কোন অ্যাকশন থেকে এরর ফিরে এসেছে তার উপর নির্ভর করে, সাধারণ বা এক্সপোনেনশিয়াল ব্যাকঅফ স্ট্র্যাটেজি ব্যবহার করে অনুরোধটি আবার করার চেষ্টা করুন।
SERVICE_DISCONNECTED-এর মতো নয়, Google Play বিলিং পরিষেবার সাথে কানেকশন বিচ্ছিন্ন হয় না এবং যে অপারেশন চেষ্টা করা হচ্ছে সেটি
আপনাকে আবার চেষ্টা করতে হবে।
BILLING_UNAVAILABLE (সমস্যার কোড 3)
সমস্যা
এই সমস্যাটি ইঙ্গিত করে যে কেনাকাটা করার প্রক্রিয়া চলাকালীন ব্যবহারকারীর বিলিং সংক্রান্ত সমস্যা হয়েছে। এটি কখন ঘটতে পারে তার উদাহরণ:
- ব্যবহারকারীর ডিভাইসে থাকা Play Store অ্যাপ পুরনো ভার্সনের।
- ব্যবহারকারী এমন দেশে থাকেন যেখানে এই সুবিধা উপলভ্য নেই।
- ব্যবহারকারী একজন এন্টারপ্রাইজ ব্যবহারকারী এবং তার এন্টারপ্রাইজ অ্যাডমিন ব্যবহারকারীদের কেনাকাটা করার সুবিধা বন্ধ করে দিয়েছেন।
- Google Play ব্যবহারকারীর পেমেন্ট পদ্ধতিতে চার্জ করতে পারছে না। যেমন, ব্যবহারকারীর ক্রেডিট কার্ডের মেয়াদ শেষ হয়ে যেতে পারে।
- সিস্টেমের মাধ্যমে Play Store অ্যাপ ব্লক করা আছে (যেমন, OEM-কাস্টমাইজ করা
কিড মোডে)। এই ক্ষেত্রে,
BillingResult-এ Play Store ব্লক করা হয়েছে ডিবাগ মেসেজ অন্তর্ভুক্ত থাকে।
সম্ভাব্য সমাধান
এই ক্ষেত্রে অটোমেটিক আবার চেষ্টা করা কোনও কাজে লাগবে না। তবে, ব্যবহারকারী যদি সমস্যার কারণ হওয়া শর্তটি পূরণ করেন, তাহলে ম্যানুয়াল রিট্রাই সাহায্য করতে পারে। যেমন, ব্যবহারকারী যদি Play Store ভার্সন আপডেট করে কাজ করে এমন ভার্সন করেন, তাহলে প্রাথমিক অপারেশন ম্যানুয়ালি আবার চেষ্টা করলে কাজ হতে পারে।
ব্যবহারকারী সেশনে না থাকাকালীন এই সমস্যা হলে, আবার চেষ্টা করে কোনও লাভ নাও হতে পারে। কেনাকাটার ফ্লোর ফলে আপনি
BILLING_UNAVAILABLEসমস্যা সংক্রান্ত মেসেজ পেলে, খুব সম্ভবত ব্যবহারকারী কেনাকাটা করার সময় Google Play থেকে মতামত পেয়েছেন এবং কী ভুল হয়েছে তা তিনি জানেন। এই ক্ষেত্রে, আপনি একটি সমস্যার মেসেজ দেখাতে পারেন যেখানে উল্লেখ করা হয়েছে যে কিছু ঠিকমতো কাজ করেনি এবং ব্যবহারকারীকে সমস্যা সমাধান করার পরে ম্যানুয়ালি আবার চেষ্টা করার বিকল্প দিতে আবার চেষ্টা করুন বোতাম অফার করতে পারেন।
সমস্যা (সমস্যার কোড 6)
সমস্যা
এটি একটি গুরুতর সমস্যা যা Google Play-এর অভ্যন্তরীণ সমস্যার দিকে ইঙ্গিত করে।
সম্ভাব্য সমাধান
ERROR-এর কারণ হওয়া Google Play-এর অভ্যন্তরীণ সমস্যাগুলি কখনও কখনও সাময়িক হয় এবং
হ্রাসমান বিলম্বের সাথে আবার চেষ্টা করলে তা সমাধান করা যেতে পারে। ব্যবহারকারীরা সেশনে থাকলে, আবার চেষ্টা করা ভাল।
ITEM_ALREADY_OWNED
সমস্যা
এই উত্তর থেকে বোঝা যায় যে Google Play ব্যবহারকারী যে সাবস্ক্রিপশন বা এককালীন কেনাকাটার প্রোডাক্ট কেনার চেষ্টা করছেন, সেটি তার কাছে আগে থেকেই আছে। বেশিরভাগ ক্ষেত্রে, এটি ক্ষণস্থায়ী সমস্যা নয়, তবে এটি পুরনো Google Play-এর ক্যাশের কারণে হলে তা আলাদা কথা।
সম্ভাব্য সমাধান
ক্যাশে সংক্রান্ত সমস্যা না হলে, এই সমস্যা এড়াতে, ব্যবহারকারীর কাছে আগে থেকেই থাকা কোনও
প্রোডাক্ট কেনার বিকল্প অফার করবেন না। নিশ্চিত করুন যে কেনার জন্য উপলভ্য প্রোডাক্ট দেখানোর সময় আপনি
ব্যবহারকারীর এনটাইটেলমেন্ট চেক করেছেন এবং
সেই অনুযায়ী ব্যবহারকারী কী কিনতে পারবেন তা ফিল্টার করেছেন।
ক্যাশে সংক্রান্ত সমস্যার কারণে ক্লায়েন্ট অ্যাপ এই সমস্যাটি পেলে, Play-এর ব্যাকএন্ড থেকে লেটেস্ট ডেটা দিয়ে আপডেট করার জন্য
Google Play-এর ক্যাশে ট্রিগার করে।
সমস্যা হওয়ার পরে আবার চেষ্টা করলে, এই নির্দিষ্ট সাময়িক ইনস্ট্যান্সের ক্ষেত্রে সমস্যার সমাধান হয়ে
যাবে। ITEM_ALREADY_OWNED
পাওয়ার পরে BillingClient.queryPurchasesAsync()
কল করে চেক করুন যে ব্যবহারকারী প্রোডাক্ট পেয়েছেন কিনা এবং যদি না পেয়ে থাকেন
তাহলে আবার কেনার চেষ্টা করার জন্য একটি সাধারণ রিট্রাই লজিক প্রয়োগ করুন।
ITEM_NOT_OWNED
সমস্যা
এই কেনাকাটা সংক্রান্ত উত্তর থেকে বোঝা যায় যে Google Play ব্যবহারকারীর কাছে সেই সাবস্ক্রিপশন বা একবার পেমেন্ট করতে হয় এমন প্রোডাক্ট নেই যেটি ব্যবহারকারী পরিবর্তন করতে, স্বীকার করতে বা ব্যবহার করতে চাইছেন। এটি বেশিরভাগ ক্ষেত্রেই ক্ষণস্থায়ী সমস্যা নয়, তবে Google Play-এর ক্যাশে পুরনো হয়ে গেলে এটি হতে পারে।
সম্ভাব্য সমাধান
ক্যাশে সংক্রান্ত সমস্যার কারণে কোনও সমস্যা হলে, Play-এর ব্যাকএন্ড থেকে লেটেস্ট ডেটা নিয়ে Google
Play-এর ক্যাশে আপডেট করার জন্য সমস্যাটি ট্রিগার করে। এই নির্দিষ্ট
অস্থায়ী ইনস্ট্যান্সের ক্ষেত্রে, ত্রুটি হওয়ার পরে একটি সাধারণ রিট্রাই কৌশল
ব্যবহার করে আবার চেষ্টা করলে সমস্যার সমাধান হয়ে যাবে। ব্যবহারকারী প্রোডাক্ট পেয়েছেন কিনা তা চেক করতে ITEM_NOT_OWNED পাওয়ার পরে BillingClient.queryPurchasesAsync()-এ কল করুন।
যদি না থাকে, তাহলে কেনাকাটা আবার করার জন্য সাধারণ রিট্রাই লজিক ব্যবহার করুন।
আবার চেষ্টা করা যায় না এমন BillingResult উত্তর
আবার চেষ্টা করার লজিক ব্যবহার করে আপনি এইসব সমস্যা থেকে রিকভার করতে পারবেন না।
FEATURE_NOT_SUPPORTED
সমস্যা
এই নন-রিট্রায়েবল এরর থেকে বোঝা যায় যে ব্যবহারকারীর ডিভাইসে Google Play বিলিং ফিচার কাজ করে না। এর কারণ সম্ভবত Play Store-এর পুরনো ভার্সন।
যেমন, হয়ত আপনার কিছু ব্যবহারকারীর ডিভাইসে অ্যাপ-মধ্যস্থ মেসেজিং কাজ করে না।
সম্ভাব্য প্রশমন
Play Billing
লাইব্রেরিতে কল করার আগে ফিচার কাজ করে কিনা তা চেক করতে BillingClient.isFeatureSupported() ব্যবহার করুন।
when { billingClient.isReady -> { val billingResult = billingClient.isFeatureSupported(BillingClient.FeatureType.IN_APP_MESSAGING) if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) { // use Feature } } }
USER_CANCELED
সমস্যা
ব্যবহারকারী বিলিং ফ্লো UI থেকে বেরিয়ে এসেছেন।
সম্ভাব্য সমাধান
এটি শুধুমাত্র তথ্যমূলক এবং এটি কাজ না করলেও কোনও সমস্যা নেই।
ITEM_UNAVAILABLE
সমস্যা
এই ব্যবহারকারীর জন্য Google Play Billing সাবস্ক্রিপশন বা এককালীন কেনাকাটার প্রোডাক্ট উপলভ্য নেই।
সম্ভাব্য প্রশমন
সাজেস্ট করা পদ্ধতি অনুযায়ী, আপনার অ্যাপ যেন queryProductDetailsAsync-এর মাধ্যমে প্রোডাক্টের বিবরণ রিফ্রেশ করে, তা নিশ্চিত করুন। প্রয়োজন হলে অতিরিক্ত রিফ্রেশ প্রয়োগ করতে,
Play Console কনফিগারেশনে আপনার প্রোডাক্ট ক্যাটালগ কত ঘনঘন
পরিবর্তিত হয় তা বিবেচনা করুন।
Google Play Billing-এ শুধুমাত্র সেইসব প্রোডাক্ট বিক্রি করার চেষ্টা করুন যেগুলি queryProductDetailsAsync-এর মাধ্যমে সঠিক
তথ্য প্রদান করে।
কোনও অসঙ্গতি আছে কিনা তা জানতে প্রোডাক্টের উপযুক্ততা কনফিগারেশন চেক করুন।
যেমন, আপনি এমন কোনও প্রোডাক্টের ব্যাপারে কোয়েরি করতে পারেন যা ব্যবহারকারী যে অঞ্চল থেকে কেনার চেষ্টা করছেন সেটি ছাড়া অন্য কোনও অঞ্চলে
উপলভ্য।
কেনাকাটার জন্য উপলভ্য হতে, কোনও প্রোডাক্টকে অ্যাক্টিভ হতে হবে, সেটির অ্যাপকে
প্রকাশিত হতে হবে এবং সেটির অ্যাপকে ব্যবহারকারীর দেশে উপলভ্য হতে হবে।
কখনও কখনও, বিশেষ করে পরীক্ষার সময়, প্রোডাক্ট কনফিগারেশনে সবকিছু সঠিক থাকে, কিন্তু ব্যবহারকারীরা তারপরেও এই সমস্যাটি দেখতে পান। Google-এর সার্ভারে প্রোডাক্টের বিবরণ প্রোপাগেশন ডিলে হওয়ার কারণে এটি হতে পারে। পরে আবার চেষ্টা করুন।
DEVELOPER_ERROR
সমস্যা
এটি একটি গুরুতর সমস্যা যা ইঙ্গিত করে যে আপনি কোনও API ভুলভাবে ব্যবহার করছেন।
যেমন, BillingClient.launchBillingFlow-এ ভুল প্যারামিটার দিলে
এই সমস্যা হতে পারে।
সম্ভাব্য সমাধান
আপনি বিভিন্ন Play Billing Library কল সঠিকভাবে ব্যবহার করছেন কিনা তা নিশ্চিত করুন। এছাড়াও, সমস্যার ব্যাপারে আরও তথ্য পেতে, ডিবাগ মেসেজ চেক করুন।