Android 应用内计费:isn';不能撤消购买吗?

Android 应用内计费:isn';不能撤消购买吗?,android,in-app-purchase,in-app-billing,Android,In App Purchase,In App Billing,我实现了android应用内计费,将其上传到开发者控制台进行alpha测试,创建了一个项目(高级版本的一次性产品),并在我的设备上进行了测试。一切正常,但我想用同一台设备进行第二次测试——难道不可能撤销购买吗 我尝试的是: 我在开发人员控制台-->中取消了购买的项目,但我的设备没有发生任何问题,BillingClient.getPurchaseList仍然返回了我的高级购买 我用ad命令“adb shell pm clear com.android.vending”-->清除了缓存,现在它变得

我实现了android应用内计费,将其上传到开发者控制台进行alpha测试,创建了一个项目(高级版本的一次性产品),并在我的设备上进行了测试。一切正常,但我想用同一台设备进行第二次测试——难道不可能撤销购买吗

我尝试的是:

  • 我在开发人员控制台-->中取消了购买的项目,但我的设备没有发生任何问题,BillingClient.getPurchaseList仍然返回了我的高级购买
  • 我用ad命令“adb shell pm clear com.android.vending”-->清除了缓存,现在它变得很奇怪:
首先,我认为它可以工作,BillingClient.queryPurchases().getPurchaseList没有返回任何购买,我的应用程序行为正确地更改为基本版本。但如果我再次尝试购买该物品以再次测试购买流程,它会显示“物品已拥有”。有没有可能再测试一次

另一件我完全不明白的奇怪事情是:我什么也没做,几个小时后再次打开我的应用程序,它又被标记为premium。这是什么意思?在测试帐户中出现问题,或者在实际(取消)购买中也会出现问题


非常感谢你的帮助

如果您想允许一件物品被多次购买(即游戏内货币),您应该在再次购买之前消费它,否则IAB库将返回
“物品已拥有”
错误

要重置购买,您可以使用
BillingClient#consumerasync(字符串purchaseToken)

要获取购买的
purchaseToken
,请使用
BillingClient#queryPurchaseHistoryAsync
,这将返回当前购买的列表

如果您想使用所有购买的产品进行调试,只需使用以下代码:

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
                                        }
                                    }
                                });
                            }
                        }
                    }
                });
client.queryPurchaseHistoryAsync(BillingClient.SkuType.INAPP,new PurchaseHistoryResponseListener(){
@凌驾
public void onPurchaseHistoryResponse(int responseCode,List purchasesList){
if(purchasesList!=null&&!purchasesList.isEmpty()){
用于(采购:采购清单){
client.ConsumeSync(purchase.getPurchaseToken(),new ConsumerResponseListener()){
@凌驾
ConsumerResponse(int-responseCode,字符串purchaseToken)上的public void{
if(responseCode==BillingResponse.OK){
//已消费物品,您现在可以重新购买
}否则{
//错误,项目未使用。有关详细信息,请参阅响应代码
}
}
});
}
}
}
});

尝试清除缓存不会解决问题,因为IAP库一旦与GPlay重新同步,它就会记住与当前用户帐户相关的购买信息。

Samuel,谢谢您的回答。正如官方文档“BillingClient.queryPurchases()”中所述,应该只返回活动购买,但在我的示例中,取消中的项目。。。如果用户取消购买,在现实生活中会发生什么?如果我使用queryPurchases检查用户是否可以使用高级功能,是否仍然作为活动项返回?client.consumerasync解决了我的问题。该商品已被“消费”-尽管它是一个托管产品,我可以再次购买并测试购买工作流。谢谢你的帮助。也许有人可以回答为什么“BillingClient.queryPurchases()”返回取消的项目的问题。我仍然对此感到困惑。。。