Android 反复购买相同的商品,而不必消费应用内购买

Android 反复购买相同的商品,而不必消费应用内购买,android,in-app-purchase,in-app-billing,android-billing,android-inapp-purchase,Android,In App Purchase,In App Billing,Android Billing,Android Inapp Purchase,我有一个捐赠标签,想让用户反复购买这些物品。我已经实现了一个代码,但它允许用户只购买一次特定的物品。我在play console中为产品使用了托管产品 btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(billingClient.isReady()){ SkuDetailsParams par

我有一个捐赠标签,想让用户反复购买这些物品。我已经实现了一个代码,但它允许用户只购买一次特定的物品。我在play console中为产品使用了托管产品

 btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
           if(billingClient.isReady()){
             SkuDetailsParams params=SkuDetailsParams.newBuilder()
             .setSkusList(Arrays.asList("purchase_aaa","purchase_bbb","purchase_ccc","purchase_ddd"))
             .setType(BillingClient.SkuType.INAPP).build();

 billingClient.querySkuDetailsAsync(params, new SkuDetailsResponseListener() {
         @Override
          public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList) {
           if(responseCode==BillingClient.BillingResponse.OK)
        {
              loadProductToRecyclerView(skuDetailsList);
                  }
             else{
               Toast.makeText(Donate.this, "Cannot query product", Toast.LENGTH_SHORT).show();
                  }
                  }
                });
                }
                else
        {
                Toast.makeText(Donate.this, "Not ready", Toast.LENGTH_SHORT).show();
                }
            }
        });

  @Override
    public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) {
        if(purchases!=null){
        Toast.makeText(this, "Purchased"+purchases.size(), Toast.LENGTH_SHORT).show();
    }
    }
btn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(billingClient.isReady()){
SkuDetailsParams params=SkuDetailsParams.newBuilder()
.setSkusList(Arrays.asList(“采购aaa”、“采购bbb”、“采购ccc”、“采购ddd”))
.setType(BillingClient.SkuType.INAPP).build();
billingClient.querySkuDetailsAsync(参数,新SkuDetailsResponseListener(){
@凌驾
公共无效onSkuDetailsResponse(内部响应代码,列表skuDetailsList){
if(responseCode==BillingClient.BillingResponse.OK)
{
loadProductToRecyclerView(skuDetailsList);
}
否则{
Toast.makeText(捐赠.this,“无法查询产品”,Toast.LENGTH_SHORT.show();
}
}
});
}
其他的
{
Toast.makeText(捐赠.this,“Not ready”,Toast.LENGTH_SHORT).show();
}
}
});
@凌驾
公共无效onPurchasesUpdated(int responseCode,@Nullable List purchases){
如果(购买!=null){
Toast.makeText(这是“购买的”+purchases.size(),Toast.LENGTH_SHORT.show();
}
}

这是设计的,不能更改,应用内管理的产品只能购买一次

如果您希望支付更多费用的用户启用更多功能,则必须创建尽可能多的应用内管理产品

例如,如果这是一个游戏,其中用户正在消费物品,那么当他不再有任何物品时,您将消费应用内产品,以便他可以再次购买

或者,您也可以在购买后立即消费该产品,并跟踪他通过您自己的方式、自己的服务器或firebase购买了多少,但这已经意味着您必须为您的应用程序实施用户身份验证系统

消费购买:

ConsumeResponseListener consumeListener = new ConsumeResponseListener() {
            @Override
            public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {

            }
        };
 String token = purchase.getPurchaseToken();
            ConsumeParams consumeParams = ConsumeParams.newBuilder().setPurchaseToken(token).build();
            billingClient.consumeAsync(consumeParams, consumeListener);

我在stack上找到了一些答案,它写了一些方法来使用这个项目,但我无法理解。这是它的链接。你能检查一下吗@Lluis Felisartt链接使用不推荐的AIDL计费服务,新项目应使用计费库。我用一些代码编辑了我的答案,用于购买。我使用的是新版本,但有一些问题,然后返回到旧版本,该版本使用int responseCode而不是BillingResult BillingResult。我尝试了你的代码,但在字符串标记等之后出现错误。你能添加一个与我的版本兼容的答案吗@Lluis Felisarty您的代码使用计费库,与我的消费代码相同。