web-dev-qa-db-fra.com

queryPurchases () vs queryPurchaseHistoryAsync () afin de «restaurer» la fonctionnalité?

J'utilise la bibliothèque de facturation Play pour déclencher et gérer des achats qui, à leur tour, ont déverrouillé des fonctionnalités supplémentaires dans une application. Cette partie fonctionne.

Cependant, quelle est la meilleure façon de "restaurer" les achats. Disons par exemple qu'une personne qui a acheté l'application achète un nouveau téléphone. Se connecte au Play Store, télécharge mon application, puis constate que l'écran de paiement à "mettre à niveau" s'affiche. iOS a une méthode spécifique pour cela, mais je n'en connais pas pour Android.

Mes pensées sont d'interroger le Play Store et de confirmer si le compte a déjà réussi à acheter l'article, si c'est le cas, j'appellerai la fonction de mise à niveau locale dans l'application.

Il semble qu'il existe deux méthodes similaires. Mais lequel dois-je utiliser dans ce scénario? Lorsqu'un utilisateur a essuyé son téléphone ou en a acheté un nouveau?

queryPurchases()? Ou queryPurchaseHistoryAsync()?

17
laurie

Selon la documentation, queryPurchases utilise le cache de l'application Play Store pour obtenir les résultats tandis que queryPurchaseHistoryAsync vérifie en fait l'AP d'achat pour les achats les plus récents. Donc, dans votre cas, vous devriez vérifier la méthode Async.

queryPurchases

Obtenez les détails des achats pour tous les articles achetés dans votre application. Cette méthode utilise un cache de l'application Google Play Store sans lancer de demande réseau.

queryPurchaseHistoryAsync

Renvoie le dernier achat effectué par l'utilisateur pour chaque SKU, même si cet achat est expiré, annulé ou consommé.

Assurez-vous également de vérifier la documentation. Il recommande de Cache purchase details on your servers. https://developer.Android.com/google/play/developer-api.html#practices

8
daniribalbert

Vous devez utiliser queryPurchases. Cela vous donne tous les achats actifs actuels (non consommés, non annulés, non expirés) pour chaque SKU.

queryPurchaseHistoryAsync ne fera pas ce dont vous avez besoin car il ne vous donnera qu'une liste des achats les plus récents pour chaque SKU. Ils peuvent avoir expiré, été annulés ou consommés, et il n'y a aucun moyen de le savoir. Par conséquent, cette réponse ne peut pas être utilisée pour indiquer les achats à appliquer dans votre application.

Pour autant que je puisse voir, la seule utilisation valide de queryPurchaseHistoryAsync est de fournir à un utilisateur une liste de son historique d'achat. C'est un peu bizarre.

Notez également: queryPurchases est synchrone, donc dans la plupart des cas, il doit être exécuté dans une sorte de thread de travail en arrière-plan. Je lance le mien dans un AsyncTask.

12
HughHughTeotl

Mettez ce qui suit dans votre méthode onBillingSetupFinished().

billingClient.querySkuDetailsAsync(params.build(), (responseCodeQuery, skuDetailsList) ->
{
    if (responseCodeQuery == BillingClient.BillingResponse.OK && skuDetailsList != null)
    {
        SkuDetails skuDetails = skuDetailsList.get(0);
        BillingFlowParams flowParams = BillingFlowParams.newBuilder()
                .setSkuDetails(skuDetails)
                .build();
        billingClient.launchBillingFlow(MainActivity.this, flowParams);
    }
});

Si l'utilisateur avait déjà effectué l'achat auparavant, alors dans votre méthode onPurchasesUpdated(), vous pouvez utiliser responseCode comme ceci:

@Override
public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases)
{
    if (responseCode == BillingClient.BillingResponse.ITEM_ALREADY_OWNED)
    {
        // already owns item
    }
}
0
CopsOnRoad