应用内计费:是否可以撤消购买?
In app billing: isn't it possible to undo purchase?
我在应用计费中实施了 android,将其上传到开发人员控制台以进行 alpha 测试,创建了一个项目(高级版本的一次性产品)并在我的设备上进行了测试。一切正常,但我想用同一台设备进行第二次测试 - 是否可以撤消购买?
我尝试了什么:
- 我在开发者控制台中取消了购买的项目 --> 我的设备上没有任何反应,BillingClient.getPurchaseList 仍然 return 我的高级购买
- 我用广告命令 "adb shell pm clear com.android.vending" 清除了缓存 --> 现在它变得很奇怪:
首先,我认为它有效并且 BillingClient.queryPurchases().getPurchaseList 没有 return 任何购买并且我的应用行为正确地更改为基本版本。但是,如果我尝试再次购买该商品以再次测试购买流程,它会显示 "item already owned"。有没有可能再测试一下??
另一件我完全不明白的奇怪事情:我什么都没做,几个小时后再次打开我的应用程序,它又被标记为高级。那是什么意思?测试帐户有问题还是真实(已取消)购买也会发生这种情况?
非常感谢您的帮助!
如果你想允许多次购买一个项目(即 in-game 货币),你应该在再次购买之前消耗它,否则 IAB 库将 return "Item already owned"
错误。
要重置购买,您可以使用 BillingClient#consumeAsync(String purchaseToken)
。
要获得购买的 purchaseToken
,请使用 BillingClient#queryPurchaseHistoryAsync
,这将 return 当前购买的列表。
如果你想消费所有购买用于调试目的,你可以使用以下代码:
client.queryPurchaseHistoryAsync(BillingClient.SkuType.INAPP, new PurchaseHistoryResponseListener() {
@Override
public void onPurchaseHistoryResponse(int responseCode, List<Purchase> purchasesList) {
if (purchasesList != null && !purchasesList.isEmpty()) {
for (Purchase purchase : purchasesList) {
client.consumeAsync(purchase.getPurchaseToken(), new ConsumeResponseListener() {
@Override
public void onConsumeResponse(int responseCode, String purchaseToken) {
if (responseCode == BillingResponse.OK) {
//Item consumed, you may repurchase it now
} else {
// Error, item not consumed. See responseCode for more info
}
}
});
}
}
}
});
尝试清除缓存无法解决问题,因为一旦 IAP 库与 GPlay 重新同步,它就会记住与当前用户帐户关联的购买。
我在应用计费中实施了 android,将其上传到开发人员控制台以进行 alpha 测试,创建了一个项目(高级版本的一次性产品)并在我的设备上进行了测试。一切正常,但我想用同一台设备进行第二次测试 - 是否可以撤消购买?
我尝试了什么:
- 我在开发者控制台中取消了购买的项目 --> 我的设备上没有任何反应,BillingClient.getPurchaseList 仍然 return 我的高级购买
- 我用广告命令 "adb shell pm clear com.android.vending" 清除了缓存 --> 现在它变得很奇怪:
首先,我认为它有效并且 BillingClient.queryPurchases().getPurchaseList 没有 return 任何购买并且我的应用行为正确地更改为基本版本。但是,如果我尝试再次购买该商品以再次测试购买流程,它会显示 "item already owned"。有没有可能再测试一下??
另一件我完全不明白的奇怪事情:我什么都没做,几个小时后再次打开我的应用程序,它又被标记为高级。那是什么意思?测试帐户有问题还是真实(已取消)购买也会发生这种情况?
非常感谢您的帮助!
如果你想允许多次购买一个项目(即 in-game 货币),你应该在再次购买之前消耗它,否则 IAB 库将 return "Item already owned"
错误。
要重置购买,您可以使用 BillingClient#consumeAsync(String purchaseToken)
。
要获得购买的 purchaseToken
,请使用 BillingClient#queryPurchaseHistoryAsync
,这将 return 当前购买的列表。
如果你想消费所有购买用于调试目的,你可以使用以下代码:
client.queryPurchaseHistoryAsync(BillingClient.SkuType.INAPP, new PurchaseHistoryResponseListener() {
@Override
public void onPurchaseHistoryResponse(int responseCode, List<Purchase> purchasesList) {
if (purchasesList != null && !purchasesList.isEmpty()) {
for (Purchase purchase : purchasesList) {
client.consumeAsync(purchase.getPurchaseToken(), new ConsumeResponseListener() {
@Override
public void onConsumeResponse(int responseCode, String purchaseToken) {
if (responseCode == BillingResponse.OK) {
//Item consumed, you may repurchase it now
} else {
// Error, item not consumed. See responseCode for more info
}
}
});
}
}
}
});
尝试清除缓存无法解决问题,因为一旦 IAP 库与 GPlay 重新同步,它就会记住与当前用户帐户关联的购买。