30

我已经浏览了 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();
                    }
                }
            });
        }
4

2 回答 2

42

它提到在该链接的一半附近确认购买。有不同的方式来确认购买取决于类型。

 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

首先,创建AcknowledgePurchaseParamsClass 对象。为此,您需要购买令牌,您应该能够轻松获得它,因为您应该在您的onPurchasesUpdated方法或您将购买传递给 after 的其他方法中调用它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);
于 2019-06-13T17:34:04.867 回答
0

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

利用:

purchase.getSkus.contains("sku here");

代替

purchase.getSku.equals("sku here");
于 2021-08-25T06:02:35.017 回答