Von Version 4 oder 5 zu Google Play Billing Library 6 migrieren

Hier wird die Migration von Google Play Billing Library 4 oder 5 zu Google Play Billing Library 6 und die Verwendung neuer Abofunktionen.

Eine vollständige Liste der Änderungen in Version 6.0.0 finden Sie im Release Notizen.

Übersicht

Google Play Billing Library 6 baut auf den neuen Abofunktionen auf in Version 5 verbessert und einige weitere Verbesserungen vorgenommen. Mit diesen Funktionen können Sie Abonnements zu erweitern und die Betriebskosten zu senken, um eine ständig wachsende Zahl von SKUs zu erstellen und zu verwalten.

Weitere Informationen zu den neuen Funktionen, die mit Play Billing Library eingeführt wurden 5 Siehe Kürzliche Änderungen an Abos bei Google Play Console

Abwärtskompatibles Upgrade der Play Billing Library

Alle vorhandenen Aboprodukte wurden automatisch auf das neue Abo umgestellt im Mai 2022 von Play Billing Library 5 und der neuen Version Aboplattform. Sie müssen also kein Abo abschließen, Änderungen an der Produktkonfiguration, um einen Katalog zu haben, der mit dem neuen der Play Billing Library. Weitere Informationen zum SKUs wurden in abwärtskompatible Abos umgewandelt, siehe Funktionierende mit älteren Abos in der Play Console-Hilfe Artikel

Ältere Versionen der App funktionieren weiterhin

Wenn Sie einen abwärtskompatiblen Abokatalog haben, werden alle bestehenden Versionen Ihrer App sollte weiterhin wie vorgesehen für diese Produkte funktionieren. Einmalkaufprodukt sollten auch in älteren Versionen weiterhin problemlos funktionieren.

Versionen Ihrer App, für die eingestellte Methoden verwendet werden (z. B. querySkuDetailsAsync()) können keine Basis-Abos oder Angebote verkauft werden, die nicht rückwirkend kompatibel sind. Informationen zu abwärtskompatiblen Angeboten finden Sie in den entsprechenden Google Play- Console-Hilfe

Upgrade auf Play Billing Library 5 oder 6 durchführen

Play Billing Library 5 und 6 enthalten die eingestellten Methoden Mit querySkuDetailsAsync und BillingFlowParams.Builder.setSkuDetails SkuDetails als Abrechnung Flow-Parameter. Du kannst also schrittweise zu Play Billing Library 6 wechseln. indem Sie verschiedene Migrationsphasen planen.

Als ersten Schritt der Migration können Sie einfach die Bibliothek aktualisieren Version, lassen Sie Katalog und Back-End unverändert und testen Sie die nicht mehr unterstützt werden, während sie noch die eingestellten Methoden verwendet. Wenn Sie nicht queryPurchases, launchPriceChangeFlow oder setVrPurchaseFlow sollte sie weiterhin wie vorgesehen funktionieren. Anschließend können Sie iterieren, um die neue Abofunktionen, die im Mai 2022 veröffentlicht wurden.

Wenn du diese Funktionen zuvor mit einer Google Play Billing Library verwendet hast 5 Migrationen verwenden, können Sie direkt zu den Abschnitten Google aktualisieren Play Billing Library und Abo eines Nutzers ändern Käufe. Wenn Sie mit einer früheren Version beginnen oder die neuen Funktionen noch nicht vollständig übernommen haben, lesen Sie die vollständige Migration die folgenden Schritte, um zu erfahren, wie Sie sie umsetzen können.

Vollständige Migrationsschritte

Neue Abos in Ihrem Backend-Produktkatalog erstellen

Mit der Play Developer Console oder der Play Developer API kannst du jetzt konfigurieren Sie ein einzelnes Abo mit mehreren Basis-Abos mit jeweils mehreren Angebote. Aboangebote haben flexible Preismodelle und Berechtigungsoptionen. Du kannst während des Abolebenszyklus Angebote mit einer Vielzahl von mit automatischer Verlängerung und Prepaid-Tarifen.

Wir empfehlen, neue Produkte gemäß der Entitätsstruktur in der neuen Aboplattform für die Integration von Play Billing Library 6 die Migration Ihrer App. Sie können doppelte Produkte in Ihrem alten Katalog zusammenfassen. die dieselben Berechtigungsvorteile im Rahmen eines einzelnen Abos und einer einzigen Nutzung darstellen Basis-Abo- und Angebotskonfigurationen für alle gewünschten Optionen zu bieten. Weitere Informationen zu dieser Empfehlung finden Sie im Artikel Zusammenarbeit mit „Ältere Abos“ in der Play Console-Hilfe Artikel

Wir empfehlen, die umgewandelten Aboprodukte nach dem Version Mai 2022: sollten Sie sie so belassen, wie sie mit den Versionen in Ihrer App nicht mehr unterstützte Methoden wie querySkuDetailsAsync() verwenden, ohne Änderungen vorzunehmen, ältere Builds beeinträchtigen könnten.

Durch die Umwandlung wurden die Aboprodukte aus Ihrem Katalog erstellt. vor Mai 2022 schreibgeschützt. So lassen sich versehentliche Änderungen vermeiden, die zu mit Ihrer bestehenden Integration. Änderungen an diesen Abos möglich, aber es würden Auswirkungen geben, die sich auf Ihr Front-End und Back-End-Integrationen:

  • Im Front-End werden Anwendungsversionen mit querySkuDetailsAsync() abgerufen, Über Aboproduktdetails können nur abwärtskompatible Basis-Abos verkauft werden und Angebote, und es kann nur ein abwärtskompatibles Basis-Abo und Angebot geben Wenn Sie den umgewandelten Abos neue Tarife oder Angebote hinzufügen, können die neuen zusätzlichen Basis-Abos oder Angebote nicht Versionen Ihrer App.

  • Wenn Sie im Backend Ihre umgewandelten Abos in der Play Console-UI kannst du sie nicht mit dem inappproducts verwalten. -Endpunkt angeben, wenn Sie den Endpunkt zu diesem Zweck aufrufen. Außerdem sollten Sie Zum neuen Endpunkt für den Abokaufstatus (purchases.subscriptionsv2.get) migrieren, um Käufe zu verwalten für diese Abos, da der alte Kaufstatus-Endpunkt (purchases.subscriptions.get) nur die Daten, die zur Verarbeitung abwärtskompatibler Basis-Abos und Angebote erforderlich sind Käufe. Weitere Informationen zum Verwalten des Abokaufstatus finden Sie weitere Informationen.

Backend-Abokatalog mit der neuen API verwalten

Wenn Sie Ihren Aboproduktkatalog automatisch mit dem Google Play Developer API, du musst das neue Aboprodukt verwenden Definieren von Endpunkten, um Abos, Basis-Abos und Angebote zu erstellen und zu verwalten. Abofunktionen für Mai 2022 lesen Leitfaden finden Sie weitere Informationen zu den Änderungen an der Product Catalog API für diesen Release.

So migrieren Sie ein Modul zur automatischen Produktkatalogverwaltung für Google Play Billing-Abos ersetzen, ersetzen Sie inappproducts API mit der neuen Subscription Publishing API zum Verwalten und Veröffentlichen in Ihrem Abokatalog. Es gibt drei neue Endpunkte:

Diese neuen Endpunkte bieten alle notwendigen Funktionen, um neue Funktionen in Ihrem Katalog: Basis-Abo- und Angebots-Tags, regionales Targeting, Prepaid-Tarife und mehr.

Sie sollten die Methode inappproducts API zur Verwaltung Ihres In-App-Produktkatalogs für Produkte mit Einmalkauf.

Über Versionen Ihrer App, für die eingestellte Methoden verwendet werden (z. B. querySkuDetailsAsync()), können keine Basis-Abos oder Angebote verkauft werden, die nicht abwärtskompatibel sind. Weitere Informationen zu abwärtskompatiblen Angeboten

Google Play Billing Library aktualisieren

Nachdem Sie Ihren neuen Aboproduktkatalog erstellt haben, können Sie Ihre Anwendung zu Google Billing Library 5 migrieren. Vorhandene Play Billing Library-Abhängigkeit mit der aktualisierten Version zu die Datei build.gradle Ihrer App.

dependencies {
    def billingVersion = "6.0.0"

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

Ihr Projekt sollte sofort erstellt werden, auch wenn Sie keine Aufrufe für -Methoden: Play Billing Library 6 ist abwärtskompatibel. Das Konzept einer Artikelnummer ist als veraltet betrachtet, aber dennoch vorhanden, um die Portierung von Apps zu vereinfachen schrittweisen Prozess.

Billing Client initialisieren und eine Verbindung zu Google Play herstellen

Die ersten Schritte zum Starten von Käufen über eine Android-App bleiben gleich:

Zum Kauf verfügbare Produkte anzeigen

So erhalten Sie alle Angebote, die ein Nutzer erwerben kann:

  • SkuDetailsParams durch QueryProductDetailsParams ersetzen
  • BillingClient.querySkuDetailsAsync()-Anruf wechseln um BillingClient.queryProductDetailsAsync() zu verwenden

Beachten Sie, dass die Abfrageergebnisse jetzt ProductDetails statt SkuDetails sind. Jeder ProductDetails-Artikel enthält Informationen zum Produkt (ID, Titel, Typ usw.). Für Aboprodukte: ProductDetails enthält ein List<ProductDetails.SubscriptionOfferDetails>. Dies ist die Liste der Details zum Aboangebot. Bei Einmalkaufprodukten ProductDetails enthält einen ProductDetails.OneTimePurchaseOfferDetails. Diese können verwendet werden, um zu entscheiden, welche Angebote den Nutzern angezeigt werden.

Das folgende Beispiel zeigt, wie Ihre App vorher und nachher aussehen könnte diese Änderungen vornehmen:

Vorher

Kotlin

val skuList = ArrayList<String>()

skuList.add("up_basic_sub")

val params = SkuDetailsParams.newBuilder()

params.setSkusList(skuList).setType(BillingClient.SkuType.SUBS).build()

billingClient.querySkuDetailsAsync(params) {
    billingResult,
    skuDetailsList ->
    // Process the result
}

Java

List<String> skuList = new ArrayList<>();

skuList.add("up_basic_sub");

SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();

params.setSkusList(skuList).setType(SkuType.SUBS).build();

billingClient.querySkuDetailsAsync(params,
    new SkuDetailsResponseListener() {
        @Override
        public void onSkuDetailsResponse(BillingResult billingResult,
                List<SkuDetails> skuDetailsList) {
            // Process the result.
        }
    }
);

Nachher

Kotlin

val productList =
    listOf(
        QueryProductDetailsParams.Product.newBuilder()
            .setProductId("up_basic_sub")
            .setProductType(BillingClient.ProductType.SUBS)
            .build()
    )

val params = QueryProductDetailsParams.newBuilder().setProductList(productList).build()

billingClient.queryProductDetailsAsync(params) {
    billingResult,
    productDetailsList ->
    // Process the result
}

Java

ImmutableList<Product> productList = ImmutableList.of(Product.newBuilder()
                                            .setProductId("up_basic_sub")
                                            .setProductType(ProductType.SUBS)
                                            .build());

QueryProductDetailsParams params = QueryProductDetailsParams.newBuilder()
    .setProductList(productList)
    .build();

billingClient.queryProductDetailsAsync(
        params,
        new ProductDetailsResponseListener() {
                public void onProductDetailsResponse(BillingResult billingResult, List<ProductDetails> productDetailsList) {
                    // Process the result
                }
        }
);

Der Callback für queryProductDetailsAsync gibt List<ProductDetails> zurück. Jeder ProductDetails-Artikel enthält Informationen zum Produkt (ID, Titel, Typ usw.). Der Hauptunterschied ist, dass ein Abo Produkte enthalten jetzt auch ein List<ProductDetails.SubscriptionOfferDetails> die alle für den Nutzer verfügbaren Angebote enthält.

Da frühere Versionen der Play Billing Library das neue Objekte (Abos, Basis-Abos, Angebote usw.) und das neue System wandelt jede Abo-Artikelnummer in eine einzige abwärtskompatible Basis-Abo und Angebot. Verfügbare Produkte mit einmaligem Kauf sind auch in ein ProductDetails-Objekt portiert wurden. Die Angebotsdetails einer einmaligen kann über die getOneTimePurchaseOfferDetails()-Methode.

In seltenen Fällen können ProductDetails und queryProductDetailsAsync() von einigen Geräten nicht unterstützt werden. ist meist auf veraltete Versionen Google Play-Dienste. Um sicherzustellen, Unterstützung für dieses Szenario erhalten, rufen Sie uns unter isFeatureSupported() für PRODUCT_DETAILS bevor queryProductDetailsAsync aufgerufen wird. Wenn die Antwort OK, das Gerät die Funktion unterstützt und du kannst mit dem Aufrufen von queryProductDetailsAsync() fortfahren. Wenn die Antwort FEATURE_NOT_SUPPORTED ist, können Sie stattdessen die Liste der verfügbaren abwärtskompatiblen Produkte querySkuDetailsAsync() Weitere Informationen zur Verwendung der Abwärtskompatibilität finden Sie im Leitfaden zu den Abofunktionen für Mai 2022.

Kaufvorgang für das Angebot starten

Das Starten eines Kaufvorgangs für ein Angebot ist dem Starten eines Ablaufs sehr ähnlich. für eine Artikelnummer. So starten Sie eine Kaufanfrage in Version 6:

  • Anstatt SkuDetails für BillingFlowParams zu verwenden, Verwenden Sie ProductDetailsParams.
  • Angebotsdetails wie Angebots-ID, Basis-Abo-ID und mehr können über die SubscriptionOfferDetails abgerufen werden -Objekt enthält.

Hol dir die offerToken, um ein Produkt mit dem ausgewählten Angebot des Nutzers zu kaufen des ausgewählten Angebots und übergeben es an das ProductDetailsParams-Objekt.

Sobald du ein BillingFlowParams-Objekt erstellt hast, wird der Abrechnungsablauf gestartet. mit BillingClient bleibt gleich.

Das folgende Beispiel zeigt, wie Ihre App vorher und nachher aussehen könnte diese Änderungen vornehmen:

Vorher

Kotlin

// An activity reference from which the billing flow will be launched.
val activity : Activity = ...
// Retrieve a value for "skuDetails" by calling querySkuDetailsAsync().
val billingFlowParams = BillingFlowParams.newBuilder()
                            .setSkuDetails(skuDetails)
                            .build()

val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)

Java

// An activity reference from which the billing flow will be launched.
Activity activity = ...;
// Retrieve a value for "skuDetails" by calling querySkuDetailsAsync().
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(skuDetails)
        .build();

BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)

Nachher

Kotlin

// An activity reference from which the billing flow will be launched.
val activity : Activity = ...;

val productDetailsParamsList = listOf(
    BillingFlowParams.ProductDetailsParams.newBuilder()
        // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
        .setProductDetails(productDetails)
        // For One-time product, "setOfferToken" method shouldn't be called.
        // For subscriptions, to get the offer token corresponding to the selected
        // offer call productDetails.subscriptionOfferDetails?.get(selectedOfferIndex)?.offerToken
        .setOfferToken(selectedOfferToken)
        .build()
)

val billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .build()

// Launch the billing flow
val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)

Java

// An activity reference from which the billing flow will be launched.
Activity activity = ...;

ImmutableList<ProductDetailsParams> productDetailsParamsList =
    ImmutableList.of(
        ProductDetailsParams.newBuilder()
             // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // For one-time products, "setOfferToken" method shouldn't be called.
            // For subscriptions, to get the offer token corresponding to the selected
            // offer call productDetails.getSubscriptionOfferDetails().get(selectedOfferIndex).getOfferToken()
            .setOfferToken(selectedOfferToken)
            .build()
    );

BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .build();

// Launch the billing flow
BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

Käufe verarbeiten

Die Verarbeitung von Käufen mit Google Play Billing Library 6 bleibt ähnlich vorherigen Versionen.

Um alle aktiven Käufe des Nutzers abzurufen und nach neuen zu suchen Käufe gehen Sie so vor:

  • Anstatt einen BillingClient.SkuType-Wert an queryPurchasesAsync(), übergeben Sie ein QueryPurchasesParams-Objekt die einen BillingClient.ProductType-Wert enthält.

Das folgende Beispiel zeigt, wie Ihre App aussehen könnte, nachdem Sie diese Änderungen vorgenommen haben:

Vorher

Kotlin

billingClient.queryPurchasesAsync(BillingClient.SkuType.SUBS) {
    billingResult,
    purchaseList -> {
        // Process the result
    }
}

Java

billingClient.queryPurchasesAsync(
    BillingClient.SkuType.SUBS,
    new PurchasesResponseListener() {
        public void onQueryPurchasesResponse(
                BillingResult billingResult,
                ListP<urchase >purchases) {
            // process the result
        }
    }
);

Nachher

Kotlin

billingClient.queryPurchasesAsync(
    QueryPurchasesParams.newBuilder()
        .setProductType(BillingClient.ProductType.SUBS)
        .build()
) { billingResult, purchaseList ->
    // Process the result
}

Java

billingClient.queryPurchasesAsync(
    QueryPurchasesParams.newBuilder().setProductType(ProductType.SUBS).build(),
    new PurchasesResponseListener() {
        public void onQueryPurchasesResponse(
                BillingResult billingResult,
                List<Purchase> purchases) {
            // Process the result
        }
    }
);

So verwaltest du Käufe außerhalb der App und ausstehenden Transaktionen nicht verändert haben.

Verwalte den Abokaufstatus mit der neuen API in deinem Backend

Sie sollten Ihre Komponente zur Verwaltung des Kaufstatus von Abos migrieren in Ihrem Backend, um den Kauf der neu erstellten Produkte in den vorherigen Schritten. Verwaltung des Kaufstatus deiner aktuellen Abos wie gewohnt für die umgestellten Aboprodukte funktionieren. vor der Einführung im Mai 2022 definiert wurden und ausreichen, von abwärtskompatiblen Angeboten, unterstützt jedoch keine der neuen Funktionen.

Du musst die neue Subscription Purchases API für deine Verwaltungsmodul für den Kaufstatus von Abos, das den Kauf und verwaltet Play Billing-Aboberechtigungen in deinem Backend. In der alten Version der API werden nicht alle für die Verwaltung erforderlichen Details zurückgegeben. auf der neuen Plattform. Details zu den Änderungen gegenüber früheren Versionen Weitere Informationen zu den neuen Abofunktionen im Mai 2022

Normalerweise würdest du die Subscription Purchases API jedes Mal aufrufen, wenn du eine SubscriptionNotification Real Time Developer Notification zum Abrufen der aktuelle Informationen zum Abostatus. Du musst dein Gerät purchases.subscriptions.get-Aufrufe mit der neuen Version von die Subscription Purchases API, purchases.subscriptionsv2.get. Es gibt eine neue Ressource namens SubscriptionPurchaseV2 die genügend Informationen liefern, Informationen zum Verwalten der Kaufberechtigung für Abos im neuen Modell.

Dieser neue Endpunkt gibt den Status für alle Ihre Aboprodukte und und zwar unabhängig von der Version der App, über die sie verkauft wurden, und wann das Produkt definiert wurde (vor oder nach dem Release vom Mai 2022), Nach der Migration benötigen Sie also nur diese Version Ihres Abos Kaufstatus-Verwaltungsmodul.

Abokäufe eines Nutzers ändern

In Play Billing Library 5 und niedriger ProrationMode wurde verwendet, um Änderungen an den Abokäufen eines Nutzers vorzunehmen, z. B. Upgrades oder Downgrades. Diese Funktion wurde eingestellt und ersetzt durch: ReplacementMode in Version 6.

Umgang mit Änderungen der Abopreise

Die zuvor verworfene launchPriceConfirmationFlow API wurde entfernt in Play Billing Library 6. Alternativen findest du in den Preisänderungen .

Fehler bei der Play Billing Library beheben

In Play Billing Library 6 wurde ein neuer NETWORK_ERROR-Code hinzugefügt, um anzugeben, Probleme mit der Netzwerkverbindung zwischen dem Gerät des Nutzers und dem Play-System. Auch die Codes SERVICE_TIMEOUT und SERVICE_UNAVAILABLE. Weitere Informationen findest du unter BillingResult-Antwort verarbeiten Codes.

Ausstehende Transaktionen verarbeiten

Ab Version 6.0.0 wird von der Play Billing Library keine Bestellung erstellt ID für ausstehende Käufe. Bei diesen Käufen wird die Bestell-ID nach dem wird der Kauf in den PURCHASED Bundesstaat. Achten Sie darauf, dass Ihre Integration erst nach einer Transaktion vollständig abgeschlossen ist. Du kannst das Kauftoken weiterhin für dein Datensätze. Weitere Informationen zum Umgang mit ausstehenden Käufen findest du in der Google Play- Integrationsleitfaden für Billing Library und Leitfaden zur Verwaltung des Kauflebenszyklus.