如何在android中确认应用内购买?

Posted

技术标签:

【中文标题】如何在android中确认应用内购买?【英文标题】:How to acknowledge in-app purchases in android? 【发布时间】:2019-10-28 08:25:00 【问题描述】:

我浏览了 Play 结算库 https://developer.android.com/google/play/billing/billing_library_overview 您必须在三天内确认所有购买。未能正确确认购买会导致这些购买被退款。 该过程没有明确说明如何确认购买。 这是我试过的 这是正确的方法吗。 提前致谢

@Override


 public void onPurchasesUpdated(BillingResult billingResult, @Nullable List<Purchase> purchases) 
        if(billingResult.getResponseCode()== BillingClient.BillingResponseCode.OK&&purchases!=null)
            Toast.makeText(this, "Purchase Successful", Toast.LENGTH_SHORT).show();
            for(Purchase purchase:purchases)
                handlePurchase(purchase);
            
        else if(billingResult.getResponseCode()== BillingClient.BillingResponseCode.USER_CANCELED)
            Toast.makeText(this, "Purchase Cancelled", Toast.LENGTH_SHORT).show();
        else if(billingResult.getResponseCode()== BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED)
            Toast.makeText(this, "Already Purchased", Toast.LENGTH_SHORT).show();
         else
            Toast.makeText(this, billingResult.getDebugMessage(), Toast.LENGTH_SHORT).show();
        



    //in handlePurchase()
 if(!purchase.isAcknowledged())
 
          AcknowledgePurchaseParams acknowledgePurchaseParams
                    = AcknowledgePurchaseParams.newBuilder()
                    .setPurchaseToken(purchase.getPurchaseToken())
                    .setDeveloperPayload(purchase.getDeveloperPayload())
                    .build();

            client.acknowledgePurchase(acknowledgePurchaseParams, new AcknowledgePurchaseResponseListener() 
                @Override
                public void onAcknowledgePurchaseResponse(BillingResult billingResult) 
                    if(billingResult.getResponseCode()== BillingClient.BillingResponseCode.OK)
                        Toast.makeText(RemoveAdsActivity.this, "Purchase Acknowledged", Toast.LENGTH_SHORT).show();
                    
                
            );
        

【问题讨论】:

嘿苏利亚!我正在应用购买中实施。但无法这样做。您能否提供一个仅在应用内购买的工作代码。只是一个计费经理,您如何调用 launchBillingFlow 以及您如何确认它 【参考方案1】:

它提到在link 的一半附近确认购买。根据类型的不同,有不同的方式来确认购买。

 private BillingClient mBillingClient = BillingClient.newBuilder(mActivity).setListener(this).build();

//For non-consumables:
mBillingClient.acknowledgePurchase(acknowledgePurchaseParams, new AcknowledgePurchaseResponseListener());

//For Consumables: 
client.consumeAsync(acknowledgePurchaseParams, acknowledgePurchaseResponseListener);

我发布的链接包含一个关于如何处理订阅的示例。

更新

以下是确认非消耗品和消耗品购买的方法,从 non-consumable 开始:

首先,创建AcknowledgePurchaseParams 类对象。为此,您需要购买令牌,因为您应该在 onPurchasesUpdated 方法或在 onPurchasesUpdated 之后将购买传递给的其他方法中调用它,因此您应该能够轻松获得它:

AcknowledgePurchaseParams acknowledgePurchaseParams =
            AcknowledgePurchaseParams.newBuilder()
                    .setPurchaseToken(purchase.getPurchaseToken())
                    .build();

接下来创建将用作第二个参数的侦听器。这将允许您在确认购买后执行某些操作。我在此示例中显示了一条小吃栏消息(根据 worbel 的评论,您可以并且可能应该检查此 billingResult 的结果):

AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener = new AcknowledgePurchaseResponseListener() 
        @Override
        public void onAcknowledgePurchaseResponse(BillingResult billingResult)               

            getMessage("Purchase acknowledged");               
        

    ;

创建这些后,使用您的 BillingClient 调用 acknowledgePurchase 方法:

mBillingClient.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener);

应成功确认购买。

这将acknowledgePurchase 用于非消耗品。

消耗品购买

这与它们的名称相似,只是它们被更改了 - 请参阅上面示例中对它们的解释:

第一个参数 - 参数 - 设置:

ConsumeParams consumeParams = ConsumeParams.newBuilder()
            .setPurchaseToken(purchase.getPurchaseToken())
            .build();

第二个参数——监听器——设置

    ConsumeResponseListener consumeResponseListener = new ConsumeResponseListener() 
        @Override
        public void onConsumeResponse(BillingResult billingResult, String purchaseToken) 
            getMessage("Purchase acknowledged");
        
    

现在使用您的 BillingClint 和 consumeAsync:

mBillingClient.consumeAsync(consumeParams, consumeResponseListener);

【讨论】:

谢谢它很有用。我能够购买并确认但 billingClient.queryPurchasesList().getPurchasesList();正在返回 null。你能帮我解决这个问题吗? 我看不到queryPurchasesList() 的方法,这不应该是BillingClient.queryPurchase(skuType).getPurchasesList(); 吗? 是的,你是对的。这可能是什么原因? onAcknowledgePurchaseResponse(BillingResult billingResult) 你应该检查结果OK 关于订阅,在Developer.android中有说明。但是,如何声明变量: BillingClient client = ... AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener = 是否与一个 Consumable 确认相同。或者它有另一种方法。 ?【参考方案2】:

如果您是新用户并使用 4.0.0 计费库,那么上述代码将不起作用,因为现在所有计费过程都已置于后台线程中,因此请确保您在计费过程中不要调用任何 ui 更新代码。 并使用

purchase.getSkus.contains("sku here");而不是 purchase.getSku.equals("sku here");

【讨论】:

您是否提到这需要在购买更新列表中添加

以上是关于如何在android中确认应用内购买?的主要内容,如果未能解决你的问题,请参考以下文章

如何在iOS和Android上使用硬件和服务进行应用内购买

应用内购买确认对话框的本地化

如何在 Android 中测试 Google Play 计费订阅(非应用内购买)

如何在 Android 上使用 Flutter 成功完成应用内购买?

如何创建应用内购买以从免费版升级到付费版 android

如何在没有 Mac 的情况下启用应用内购买