在应用程序内购买。无法再次购买。物品回复:“7 件物品已拥有”
In-app purchase. Unable to buy again. Item response: "7 Item Already Owned"
当我第二次尝试使用相同的消耗品时,我正在解决这个问题。
第一次工作完美,但我不能再买了。
我正在测试计费,我没有真正支付,但我使用的是测试卡。
谁能帮我解决这个问题?谢谢
这是我的代码:
private fun setupBillingClient() {
billingClient = BillingClient.newBuilder(Dodgers.context!!)
.enablePendingPurchases()
.setListener(this@ShopFragment)
.build()
billingClient.startConnection(object : BillingClientStateListener {
override fun onBillingSetupFinished(billingResult: BillingResult) {
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
// The BillingClient is setup successfully
loadAllSKUs()
}
}
override fun onBillingServiceDisconnected() {
// Try to restart the connection on the next request to
// Google Play by calling the startConnection() method.
Log.e("billing", "error")
}
})
}
private fun loadAllSKUs() = if (billingClient.isReady) {
val params = SkuDetailsParams
.newBuilder()
.setSkusList(skuList)
.setType(BillingClient.SkuType.INAPP)
.build()
billingClient.querySkuDetailsAsync(params) { billingResult, skuDetailsList ->
// Process the result.
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && skuDetailsList!!.isNotEmpty()) {
this.skuDetailsList = skuDetailsList
}
}
} else {
println("Billing Client not ready")
}
单击项目:
private fun startBillingAction(shop: Shop) {
if (skuDetailsList.isNotEmpty()) {
val skuDetails = skuDetailsList.first { it.sku == shop.sku }
val billingFlowParams = BillingFlowParams
.newBuilder()
.setSkuDetails(skuDetails)
.build()
billingClient.launchBillingFlow(requireActivity(), billingFlowParams)
} else {
showSnackBar(shop.unit)
}
}
override fun onPurchasesUpdated(
billingResult: BillingResult,
purchases: MutableList<Purchase>?
) {
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && purchases != null) {
for (purchase in purchases) {
acknowledgePurchase(purchase.purchaseToken, purchase.sku) <==================== HERE FIRST TIME
}
} else if (billingResult.responseCode == BillingClient.BillingResponseCode.USER_CANCELED) {
// Handle an error caused by a user cancelling the purchase flow.
Log.e("billing", "error")
} else {
// Handle any other error codes.
Log.e("billing", "error") <==================== HERE SECOND TIME WITH RESPONCE CODE 7
}
}
private fun acknowledgePurchase(purchaseToken: String, sku: String) {
val params = AcknowledgePurchaseParams.newBuilder()
.setPurchaseToken(purchaseToken)
.build()
billingClient.acknowledgePurchase(params) { billingResult ->
val responseCode = billingResult.responseCode
val debugMessage = billingResult.debugMessage
//STUFF IF CORRECT
}
}
我有 6 件商品。我第一次可以正确购买每件商品,但如果我再次尝试,我总是遇到同样的问题,而且文档也无济于事!
编辑:
根据建议,我需要消耗物品。所以我必须将 acknowledgePurchase 函数修改为:
private fun acknowledgePurchase(purchase: Purchase, sku: String) {
val params = AcknowledgePurchaseParams.newBuilder()
.setPurchaseToken(purchase.purchaseToken)
.build()
billingClient.acknowledgePurchase(params) { billingResult ->
val responseCode = billingResult.responseCode
val debugMessage = billingResult.debugMessage
CoroutineScope(Dispatchers.Main + exceptionHandler).launch {
val gemItem = Gem.values().find { it.sku == sku }
DataManager.instance.user.value!!.gems += gemItem!!.reward
// TODO add gem animations
gem_value.text = DataManager.instance.user.value!!.gems.toString()
}
// Verify the purchase.
// Ensure entitlement was not already granted for this purchaseToken.
// Grant entitlement to the user.
val consumeParams =
ConsumeParams.newBuilder()
.setPurchaseToken(purchase.purchaseToken)
.build()
billingClient.consumeAsync(consumeParams) { billingResult, outToken ->
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
// Handle the success of the consume operation.
LogHelper.log(TAG, "Item Consumed!!!")
}
}
}
}
就是这样:-)。谢谢!!!
购买商品后,您应该consume it再次启用购买
当我第二次尝试使用相同的消耗品时,我正在解决这个问题。 第一次工作完美,但我不能再买了。 我正在测试计费,我没有真正支付,但我使用的是测试卡。 谁能帮我解决这个问题?谢谢
这是我的代码:
private fun setupBillingClient() {
billingClient = BillingClient.newBuilder(Dodgers.context!!)
.enablePendingPurchases()
.setListener(this@ShopFragment)
.build()
billingClient.startConnection(object : BillingClientStateListener {
override fun onBillingSetupFinished(billingResult: BillingResult) {
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
// The BillingClient is setup successfully
loadAllSKUs()
}
}
override fun onBillingServiceDisconnected() {
// Try to restart the connection on the next request to
// Google Play by calling the startConnection() method.
Log.e("billing", "error")
}
})
}
private fun loadAllSKUs() = if (billingClient.isReady) {
val params = SkuDetailsParams
.newBuilder()
.setSkusList(skuList)
.setType(BillingClient.SkuType.INAPP)
.build()
billingClient.querySkuDetailsAsync(params) { billingResult, skuDetailsList ->
// Process the result.
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && skuDetailsList!!.isNotEmpty()) {
this.skuDetailsList = skuDetailsList
}
}
} else {
println("Billing Client not ready")
}
单击项目:
private fun startBillingAction(shop: Shop) {
if (skuDetailsList.isNotEmpty()) {
val skuDetails = skuDetailsList.first { it.sku == shop.sku }
val billingFlowParams = BillingFlowParams
.newBuilder()
.setSkuDetails(skuDetails)
.build()
billingClient.launchBillingFlow(requireActivity(), billingFlowParams)
} else {
showSnackBar(shop.unit)
}
}
override fun onPurchasesUpdated(
billingResult: BillingResult,
purchases: MutableList<Purchase>?
) {
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && purchases != null) {
for (purchase in purchases) {
acknowledgePurchase(purchase.purchaseToken, purchase.sku) <==================== HERE FIRST TIME
}
} else if (billingResult.responseCode == BillingClient.BillingResponseCode.USER_CANCELED) {
// Handle an error caused by a user cancelling the purchase flow.
Log.e("billing", "error")
} else {
// Handle any other error codes.
Log.e("billing", "error") <==================== HERE SECOND TIME WITH RESPONCE CODE 7
}
}
private fun acknowledgePurchase(purchaseToken: String, sku: String) {
val params = AcknowledgePurchaseParams.newBuilder()
.setPurchaseToken(purchaseToken)
.build()
billingClient.acknowledgePurchase(params) { billingResult ->
val responseCode = billingResult.responseCode
val debugMessage = billingResult.debugMessage
//STUFF IF CORRECT
}
}
我有 6 件商品。我第一次可以正确购买每件商品,但如果我再次尝试,我总是遇到同样的问题,而且文档也无济于事!
编辑:
根据建议,我需要消耗物品。所以我必须将 acknowledgePurchase 函数修改为:
private fun acknowledgePurchase(purchase: Purchase, sku: String) {
val params = AcknowledgePurchaseParams.newBuilder()
.setPurchaseToken(purchase.purchaseToken)
.build()
billingClient.acknowledgePurchase(params) { billingResult ->
val responseCode = billingResult.responseCode
val debugMessage = billingResult.debugMessage
CoroutineScope(Dispatchers.Main + exceptionHandler).launch {
val gemItem = Gem.values().find { it.sku == sku }
DataManager.instance.user.value!!.gems += gemItem!!.reward
// TODO add gem animations
gem_value.text = DataManager.instance.user.value!!.gems.toString()
}
// Verify the purchase.
// Ensure entitlement was not already granted for this purchaseToken.
// Grant entitlement to the user.
val consumeParams =
ConsumeParams.newBuilder()
.setPurchaseToken(purchase.purchaseToken)
.build()
billingClient.consumeAsync(consumeParams) { billingResult, outToken ->
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
// Handle the success of the consume operation.
LogHelper.log(TAG, "Item Consumed!!!")
}
}
}
}
就是这样:-)。谢谢!!!
购买商品后,您应该consume it再次启用购买