【问题标题】:version 2.0 of the Google Play Billing Library - .setSkuDetails(skuDetails)Google Play 结算库 2.0 版 - .setSkuDetails(skuDetails)
【发布时间】:2020-04-10 03:04:09
【问题描述】:

如何在调用时在 java 中设置 .setSkuDetails(skuDetails)

BillingFlowParams flowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(skuDetails)
        .build();
int responseCode = billingClient.launchBillingFlow(flowParams);

我搜索了整个谷歌,但没有找到任何正确和完整的实现,请有人通过提供具有所有必要功能的完整过程来帮助我,因为我只找到 library1.0 示例或 Kotlin 或不完整,我想要 java

请帮帮我

【问题讨论】:

标签: java android in-app-billing onskudetailsresponce


【解决方案1】:

这是完整的实现。

如需进一步参考,请参阅文档:https://developer.android.com/google/play/billing/billing_library_overview

String ITEM_SKU_diamond_500 = "diamond_500";
BillingClient billingClient;
AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener;
String premiumUpgradePrice = "";

1:必须使用BillingClient.Builder 创建计费客户端。

billingClient = BillingClient.newBuilder(this)
                .enablePendingPurchases()
                .setListener(this).build();

2:创建billingClient 后启动billingClient 连接


        billingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {

                    List<String> skuList = new ArrayList<>();
                    skuList.add(ITEM_SKU_diamond_500);
                    final SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
                    params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);

3:建立连接成功后,调用billingClientquerySkuDetailsAsync方法异步获取SKU的详细信息。

                    billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {
                        @Override
                        public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {
                            if (skuDetailsList != null && billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                                for (SkuDetails skuDetails : skuDetailsList) {
                                    String sku = skuDetails.getSku();
                                    String price = skuDetails.getPrice();

                                    final BillingFlowParams params = BillingFlowParams.newBuilder()
                                            .setSkuDetails(skuDetails)
                                            .build();

                                    if (ITEM_SKU_diamond_500.equals(sku)) {
                                        premiumUpgradePrice = price;

                                        firstBtn500(params);

                                    }

                                    
                                }
                            } else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.ERROR) {
                                Toast.makeText(DiamondsActivity.this, "Error", Toast.LENGTH_SHORT).show();
                            }
                        }

                    });

                } else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.SERVICE_TIMEOUT) {
                    Toast.makeText(DiamondsActivity.this, "Service timeout", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(DiamondsActivity.this, "Failed to connect to the billing client", Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onBillingServiceDisconnected() {
                Toast.makeText(DiamondsActivity.this, "Disconnected from the client", Toast.LENGTH_SHORT).show();
            }
        });

        acknowledgePurchaseResponseListener = new AcknowledgePurchaseResponseListener() {
            @Override
            public void onAcknowledgePurchaseResponse(BillingResult billingResult) {
                Toast.makeText(DiamondsActivity.this, "Purchase acknowledged", Toast.LENGTH_SHORT).show();
            }

        };

4:当用户尝试进行应用内购买或订阅产品订阅时,使用billngClient检查产品是否支持

isFeatureSupported(BillingClient.FeatureType```./* SUBSCRIPTIONS or other */)

方法并调用 billingClient 的 launchBillingFlow 方法

private void firstBtn500(final BillingFlowParams params) {

        firstPurchaseBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                billingClient.launchBillingFlow(DiamondsActivity.this, params);

            }
        });

    }

更新

在这里您可以检查该商品是否已经购买

 @Override
    public void onPurchasesUpdated(BillingResult billingResult, @Nullable List<Purchase> purchases) {

        if (purchases != null && billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {

            for (Purchase purchase : purchases) {
                handlePurchases(purchase);
            }

        } else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) {
            Toast.makeText(this, "Purchased Canceled", Toast.LENGTH_SHORT).show();
        }

else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED) {
            Toast.makeText(this, "Already Purchased", Toast.LENGTH_SHORT).show();
        }

    }

如果你想购买一次,你需要Acknowledge购买

private void handlePurchases(final Purchase purchase) {

        if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) {
            //Acknowledge the purchase if it hasn't already been acknowledged.
            if (!purchase.isAcknowledged()) {
                AcknowledgePurchaseParams acknowledgePurchaseParams =
                        AcknowledgePurchaseParams.newBuilder()
                                .setPurchaseToken(purchase.getPurchaseToken())
                                .build();
                billingClient.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener);

            }
            

如果您想一次又一次地购买相同的物品(例如应用内/游戏中的硬币或信用或类似的东西)。您需要消费购买 下面是消费购买的代码。

            // Todo: Consume the purchase async
            ConsumeParams consumeParams = ConsumeParams.newBuilder()
                    .setPurchaseToken(purchase.getPurchaseToken())
                    .build();

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

                    Toast.makeText(DiamondsActivity.this, "Purchase successful", Toast.LENGTH_SHORT).show();

                    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {

                        if (purchase.getSku().equalsIgnoreCase(ITEM_SKU_diamond_500)) {
                            Toast.makeText(DiamondsActivity.this, "Thank you for purchasing!", Toast.LENGTH_SHORT).show();
                        }

                    }

                }
            };

            billingClient.consumeAsync(consumeParams, consumeResponseListener);


        } else if (purchase.getPurchaseState() == Purchase.PurchaseState.PENDING) {

            Toast.makeText(this, "Purchase pending", Toast.LENGTH_SHORT).show();

        }

    }

【讨论】:

  • 嗨,我有几个问题 - 如何调用 billingClient.launchBillingFlow(MainActivity.this, params);从一个没有实现点击监听器的函数意味着如果我想从两个不同的按钮调用它,比如从 void buy(View view) 函数,第二个 - 如何确认每个项目的购买我们需要在这里再次使用 skudetails 以及如何在应用程序启动时查询购买的物品以设置已购买的物品,以及在哪个部分使用共享偏好来保存购买的物品,purchase.getSku().equalsIgnoreCase 是什么,我需要在其中保存还是在此之前保存
  • 请帮帮我,我在 2 天后问,因为我的应用程序处于待发布测试状态,请稍微修改您的答案以回答这些问题并尝试用 2 项来完成,我会感谢您的帮助。
  • 设置是否已购买需要确认购买不消费
猜你喜欢
  • 1970-01-01
  • 2023-01-30
  • 2021-05-06
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 2013-05-06
相关资源
最近更新 更多