android - 如何在android中查询应用内购买的产品状态?
问题描述
我有一个问题,我尝试了很多方法,但结果并不像我预期的那样。
我想将应用内购买添加到我的应用中。假设,我有一个按钮,我可以通过直接通过应用程序购买列表中的东西来升级到从 1 到 10 的每个级别。
我已经到了购买和处理阶段,但是我无法让购买的产品知道当前购买的级别以显示当前级别信息。我尝试了多种方法,但我似乎无法弄清楚如何让购买的产品知道当前购买的级别以显示当前级别信息。
我把那些购买的产品的ID保存到了firebase实时数据库中,但是如果买家要求退款,我不知道,显示的信息会不正确。
那么,有没有办法直接从谷歌检索应用内购买历史以确定该产品的状态(用户购买、取消、确定、退款)?
我使用了计费版本 v4.0.0: implementation 'com.android.billingclient:billing:4.0.0'
产品清单:
private val skuListProduct = listOf(
"10000001", "10000002", "10000003", "10000004", "10000005",
"10000006", "10000007", "10000008", "10000009", "10000010"
)
计费客户:
private var mBillingClient: BillingClient? = null
mBillingClient =
BillingClient.newBuilder(this).enablePendingPurchases().setListener(this).build()
OnPurchaseUpdate:
override fun onPurchasesUpdated(result: BillingResult, purchases: MutableList<Purchase>?) {
if (result.responseCode == BillingClient.BillingResponseCode.OK && purchases != null) {
for (purchase in purchases) {
Logger.d("MainActivity", "onPurchasesUpdated ------ $purchases")
handlePurchase(purchase)
}
} else if (result.responseCode == BillingClient.BillingResponseCode.USER_CANCELED) {
// Handle an error caused by a user cancelling the purchase flow.
} else {
// Handle any other error codes.
}
}
private fun handlePurchase(purchase: Purchase) {
//For non-consumables
if (purchase.purchaseState === Purchase.PurchaseState.PURCHASED) {
if (!purchase.isAcknowledged) {
val param: AcknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder()
.setPurchaseToken(purchase.purchaseToken).build()
val acknowledgeListener =
AcknowledgePurchaseResponseListener { billingResult ->
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
Logger.d("Main_handlePurchase", "Purchase Acknowledged")
val productID = StringBuilder(purchase.skus.toString())
productID.deleteCharAt(productID.length - 1)
productID.deleteCharAt(0)
FirebaseDatabaseManager(keyId).pushData(productID.toString())
}
}
mBillingClient?.acknowledgePurchase(param, acknowledgeListener)
}
}
}
查询历史:
mBillingClient?.queryPurchaseHistoryAsync(BillingClient.SkuType.INAPP,
object : PurchaseHistoryResponseListener {
override fun onPurchaseHistoryResponse(
result: BillingResult, historyRecord: MutableList<PurchaseHistoryRecord>?
) {
if (historyRecord != null) {
for (record in historyRecord) {
Logger.d("Main_History", "Record --- $record")
}
}
}
})
谢谢你的帮助。!
解决方案
推荐阅读
- android - 为什么视图动画没有消失
- html - 为什么 transform: translateX 会影响移动设备上固定元素的高度?
- awk - 如何在awk中以十六进制格式输入和输出?
- angular - 什么是 autoTableHtmlToJson 以及在哪里转换 html 页面?
- c# - SelectPdf 仅在自定义页面上显示页脚
- python - S3 中的 SageMaker 估计器`source_dir`
- actionscript-3 - 如何在 Adobe Flex 中使用分组数据创建自定义下拉列表?
- android - 如何更新设备上已经存在的 SQLite 表?
- g1ant - 为什么 G1ANT 中的相同代码在不同的迭代中显示不同的结果?
- firebase - Firebase 身份验证如何生成默认为 15 个字符而不是 28 个字符的 UID?