应用内计费:是否可以撤消购买?

In app billing: isn't it possible to undo purchase?

我在应用计费中实施了 android,将其上传到开发人员控制台以进行 alpha 测试,创建了一个项目(高级版本的一次性产品)并在我的设备上进行了测试。一切正常,但我想用同一台设备进行第二次测试 - 是否可以撤消购买?

我尝试了什么:

首先,我认为它有效并且 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 重新同步,它就会记住与当前用户帐户关联的购买。