BillingFlowParams.Builder setSkuDetails для тестирования статических ответов Google Play Billing.


person Ping    schedule 27.10.2018    source источник


Ответы (2)


вы должны получить SkuDetails из BillingClient.querySkuDetailsAsync, пример кода может выглядеть так:

private BillingClient mBillingClient;

// ....

mBillingClient = BillingClient.newBuilder(this).setListener(new PurchasesUpdatedListener() {
    @Override
    public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) {
        if (responseCode == BillingClient.BillingResponse.OK
                && purchases != null) {

            // do something you want

        } else if (responseCode == BillingClient.BillingResponse.USER_CANCELED) {
        } else {
        }
    }
}).build();


mBillingClient.startConnection(new BillingClientStateListener() {
    @Override
    public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) {        

if (billingResponseCode == BillingClient.BillingResponse.OK) {
        // The billing client is ready. You can query purchases here.

List<String> skuList = new ArrayList<>();
        skuList.add("android.test.purchased");

SkuDetailsParams skuDetailsParams = SkuDetailsParams.newBuilder()
                    .setSkusList(skuList).setType(BillingClient.SkuType.INAPP).build();
mBillingClient.querySkuDetailsAsync(skuDetailsParams,
                    new SkuDetailsResponseListener() {
 @Override
  public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList) {

  BillingFlowParams flowParams = BillingFlowParams.newBuilder()
                                    .setSkuDetails(skuDetailsList.get(0))
                                    .build();
  int billingResponseCode = billingClient.launchBillingFlow(SkuActivity.this, flowParams);
  if (billingResponseCode == BillingClient.BillingResponse.OK) {
                                // do something you want
                            }
                        }
                    });
                 }
               }


@Override
    public void onBillingServiceDisconnected() {
        // Try to restart the connection on the next request to
        // Google Play by calling the startConnection() method.
    }
});

Вы также можете ознакомиться с https://developer.android.com/google/play/billing/billing_library_overview

person Renkuei    schedule 28.10.2018
comment
@Ping, будьте осторожны, Google обновил пример кода. Приведенный выше код МОЖЕТ работать некорректно, вам следует обратиться к последней версии. - person Renkuei; 30.10.2018
comment
@Renkuei +1 за краткий ответ, однако предоставленная вами ссылка (по крайней мере, на момент публикации этого комментария) также использует устаревший setSku вместо setSkuDetails, что, я считаю, является сутью всего вопроса. - person Ben; 10.11.2018
comment
Упомянутый пример из Google (Link von Renkuei) все еще не актуален. Не могли бы Google проверить все примеры, когда они меняют библиотеку? - person chksr; 26.05.2019
comment
Выйти из исправления в коде enablePendingPurchases(). надо будет. - person Hardy; 08.06.2019
comment
не забудьте добавить .enablePendingPurchases() при создании экземпляра billingClient - person Kirill Karmazin; 24.06.2019
comment
@KirillKarmazin есть ли что-то особенное, что нужно реализовать для поддержки этого .enablePendingPurchases()? Я ничего не видел, так что просто проверяю... - person Someone Somewhere; 09.04.2020
comment
Я думаю, что .enablePendingPurchases() не требуется для подписки. Кто-нибудь может подтвердить? - person Prince; 29.08.2020
comment
Я получаю сообщение об ошибке: Ожидается 2 параметра типов Int, (Mutable)List‹SkuDetails!›! в SkuDetailsResponseListener начинаются фигурные скобки. а сам SkuDetailsResponseListener() говорит: Избыточный SAM-конструктор. Я также пробовал страницу разработчика, но withContext, Dispatchers и querySkuDetails становятся неразрешенными ссылками. - person mystack; 14.11.2020
comment
как использовать getIntroductoryPrice() с этим образцом, нужна помощь!!! - person Tushar Pandey; 10.06.2021

Я публикую пошаговый процесс выставления счетов в приложении, который я недавно протестировал после выпуска Billing Library версии 4.0.

Справочный ресурс Google можно найти здесь

Сначала: обновите build.gradle

dependencies {
    def billing_version = "4.0.0"

    implementation "com.android.billingclient:billing:$billing_version"
}

Ресурс не говорит включать разрешение в файл манифеста, но я все же включил его.

<uses-permission android:name="com.android.vending.BILLING" />

Теперь идет часть кодирования: BillingActivity.java

private BillingClient mBillingClient;

// ...


submitButton.setOnClickListener(v -> {
    mBillingClient = BillingClient.newBuilder(this).enablePendingPurchases().setListener(new PurchasesUpdatedListener() {
        @Override
        public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
            if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK
                    && purchases != null) {
                for (Purchase purchase : purchases) {
                    handlePurchase(purchase);
                }
                // Perform your Successful Purchase Task here 
                
                Snackbar.make(findViewById(android.R.id.content), "Great!! Purchase Flow Successful! :)", Snackbar.LENGTH_LONG).show();
                dismiss();
            } else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) {
                // Handle an error caused by a user cancelling the purchase flow.
                Snackbar.make(findViewById(android.R.id.content), "User Cancelled the Purchase Flow!", Snackbar.LENGTH_LONG).show();
            } else {
                // Handle any other error codes.
                Snackbar.make(findViewById(android.R.id.content), "Error! Purchase Task was not performed!", Snackbar.LENGTH_LONG).show();
            }
        }
    }).build();

    mBillingClient.startConnection(new BillingClientStateListener() {

        @Override
        public void onBillingSetupFinished(@NonNull BillingResult billingResult) {

            if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                // The BillingClient is ready. You can query purchases here.

                List<String> skuList = new ArrayList<>();
                skuList.add("billing_template_1");
                skuList.add("billing_template_2");
                SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
                params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
                mBillingClient.querySkuDetailsAsync(params.build(),
                        new SkuDetailsResponseListener() {
                            @Override
                            public void onSkuDetailsResponse(BillingResult billingResult,
                                                             List<SkuDetails> skuDetailsList) {
                                // Process the result.
                                // Retrieve a value for "skuDetails" by calling querySkuDetailsAsync().
                                BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
                                        .setSkuDetails(skuDetailsList.get(0))
                                        .build();
                                int responseCode = mBillingClient.launchBillingFlow(activity, billingFlowParams).getResponseCode();
                            }
                        });
            }
        }

        @Override
        public void onBillingServiceDisconnected() {
            // Try to restart the connection on the next request to Google Play by calling the startConnection() method.
            Toast.makeText(BillingActivity.this, "Service Disconnected!", Toast.LENGTH_SHORT).show();
        }
    });
});
        
void handlePurchase(Purchase purchase) {
    ConsumeParams consumeParams =
            ConsumeParams.newBuilder()
                    .setPurchaseToken(purchase.getPurchaseToken())
                    .build();

    ConsumeResponseListener listener = new ConsumeResponseListener() {
        @Override
        public void onConsumeResponse(BillingResult billingResult, @NonNull String purchaseToken) {
            if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                // Handle the success of the consume operation.
            }
        }
    };
    mBillingClient.consumeAsync(consumeParams, listener);
}
    
    
private void dismiss() {
        Intent intent = new Intent();
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        finish();
    }

К вашему сведению:

  • Это всего лишь обновленная версия опубликованного ответа @Renkuei.
  • Не забудьте .enablePendingPurchase()
  • Не забудьте skuList.add("billing_template_1"), который нужно сделать из консоли разработчика. Таким образом, billing_template_1 – это название вашего Монетизация › Продукты › Внутренние продукты › Идентификатор продукта.
person Rohit Sharma    schedule 27.07.2021