1

ユーザーが 1 つのアプリ内製品を購入して一部の機能のロックを解除できる Android アプリがあります。

https://developer.android.com/google/play/billing/billing_library_overview#javaのガイドをよく読みました。

ユーザーがアプリ内製品を購入できるようにするには、次のことを行う必要があることを理解しています。

  • 呼び出しを使用して、利用可能な SKU のリストを取得します (この場合、私の唯一のアプリ内製品です) querySkuDetailsAsync()。これは、ユーザーのデバイスがアプリ内アイテムを管理できるかどうかを再確認するためのものです。
  • 前回の呼び出しの結果に SKU が表示された場合は、[購入] ボタンを表示します (これは、ユーザーのデバイスのローカル Google Play インスタンスがアプリ内製品を処理できることを意味します)。
  • launchBillingFlow()アプリ内製品の SKU を渡して呼び出し、Google 支払いプロセス フローを開始します (Google UI、カードの詳細を尋ねるポップアップなど)。
  • コールバックをリッスンしてonPurchasesUpdated()リターン コード (基本的に、支払いが拒否された、支払いが成功した、または支払いがキャンセルされた) を取得し、それに応じて行動します。支払いが成功した場合は、購入トークンの署名をローカルで (Play 開発者の RSA 公開鍵のローカル コピーを使用して) 検証するか、同じ鍵を使用して安全なサーバーでリモートで検証します。
  • アプリの有料機能のロックを解除する

それが物事が混乱するところです。Google のドキュメントの観点から、ユーザーの支払いを取得/購入/確認する方法を説明しました。ただし、アプリの起動時に支払いを記憶し、有料機能のロックを解除する方法についてはどこにも説明されていません.

ドキュメントには次のように記載されています。

ユーザーがアプリから行った購入に関する情報を取得するには、queryPurchases() を呼び出します。

そのため、アプリは何も覚えておく必要がないようです。queryPurchases()起動時に を呼び出して、SKU が存在するか (ユーザーは既に支払い済み) かどうか (ユーザーはまだ有料版のアプリを購入していないか) を確認します。

したがって、私のアプリはまさにそれを行っており、queryPurchases()起動時に呼び出して、SKU が存在するかどうかを確認します。この方法は、アプリがオフラインで開始された場合でも非常にうまく機能します。ただし、一部のユーザーは、アプリが有料モードで起動しないことがあるという事実を嘆いています。これは、(コードをデバッグした)queryPurchases()デバイスがオフラインのときに関数が (時々) 失敗するためです。がqueryPurchases()何らかの理由で以前の購入を追跡できないローカルの Google Play キャッシュを呼び出している可能性がありますか? (キャッシュパージなど...)

ユーザーの購入を記憶し、アプリの起動時に有料機能を有効にする適切な方法は何ですか?

4

2 に答える 2

5

独自の「キャッシュ」(SharedPreferences または DB) を保持し、onPurchasesUpdatedおよび use の結果を保持できますqueryPurchaseHistoryAsync。アプリの最初の起動時に、キャッシュがユーザーが製品を購入したことを示している場合は有料コンテンツを表示queryPurchaseHistoryAsyncし、同時に各 SKU についてユーザーが行った最新の購入を取得するために呼び出しonPurchaseHistoryResponseます。キャッシュを更新して非表示にすることができます。購入期限が切れた場合の有料コンテンツ。

セキュリティ上の理由から、バックエンドで購入の確認を行うことが推奨されていることも考慮してください。

独自のサーバーを管理したくない場合は、購入/サブスクリプション バックエンド サービスを提供するRevenueCatなどのツールを使用する価値があります。

于 2019-01-25T19:11:51.010 に答える