サーバー側で Android アプリの購入を確認する方法 (Google Play アプリ内課金 v3) 質問する

サーバー側で Android アプリの購入を確認する方法 (Google Play アプリ内課金 v3) 質問する

シンプルなアプリがあります(アカウントによるユーザーログインが必要です)。有料ユーザーには、より多くのニュースコンテンツなどのプレミアム機能を提供しています。

ユーザーがこのアイテムを購入したかどうかをサーバー データベースに記録する必要があります。ユーザーのデバイスにデータ コンテンツを提供すると、ユーザーのステータスを確認し、有料ユーザーには異なるコンテンツを提供できます。

Google が提供する公式の Trivialdrive サンプルを確認しましたが、サーバー側検証用のサンプル コードは提供されていません。ここに質問があります。

  1. サンプルでは、​​アプリの公開キーを使用して購入を検証しているのが見つかりました。これは良くないようです。検証プロセスを自分のサーバーに移動し、ユーザーのログイン資格情報と組み合わせて、ユーザーの購入が完了したかどうかを確認してから、データベースを更新すればよいと思います。
  2. また、購入APIクエリを実行するには、ユーザーの purchaseToken をサーバーに渡す必要があります。

ユーザーの購入を確認し、データベースにユーザーのステータスをマークするには、どのような方法を取るべきかわかりません。あるいは、その両方でしょうか?

そして、ユーザーがGoogle Playからこのアイテムを購入した場合、何らかの理由で、ちょうどその時に私のアプリがサーバーへの検証を開始したときに、ネットワーク接続がダウンしているか、自分のサーバーがダウンしているユーザーが Google Play でお金を支払ったのですが、サーバーに購入が記録されていません。どうすればいいですか。この状況にどう対処すればよいですか。

ベストアンサー1

あなたが探しているのは、ユーザーのアカウントでプレミアム機能が有効になっているかどうかを確認する方法のようですので、ここから始めるのが良いと思います。

ユーザーがプレミアム機能を利用できるかどうかを示す何らかのフラグがデータベースにあることを確認し、アカウント情報をリクエストするときにそのフラグを API 応答ペイロードに含めます。このフラグは、「プレミアム機能」の主な権限になります。

ユーザーがアプリ内購入を行うと、詳細 (トークン、注文 ID、製品 ID) がクライアント (つまりアプリ) 上でローカルにキャッシュされ、API に送信されます。

APIは次にpurchaseTokenGoogle Play デベロッパー API検証のため。

ここからいくつかのことが起こるかもしれません:

  1. 領収書が有効であれば、APIは200 Okステータスコードでクライアントに応答します。
  2. 領収書が無効であるため、APIは400 Bad Requestステータスコードでクライアントに応答します。
  3. Google Play API がダウンしています。API は 502 Bad Gateway ステータス コードで応答します。

1. または 2. (2xx または 4xx ステータス コード) の場合、API が購入詳細を受信したことを示すため、クライアントは購入詳細のキャッシュをクリアします。

検証が成功したら (ケース 1)、premiumユーザーのフラグを true に設定する必要があります。

3. (5xx ステータス コード) またはネットワーク タイムアウトの場合、クライアントは API から 2xx または 4xx ステータス コードを受信するまで試行を続ける必要があります。

要件に応じて、再送信する前に数秒待機するように設定することも、購入の詳細がアプリ キャッシュに存在する場合は、アプリが再度起動されるかバックグラウンドから抜けるたびに詳細を API に送信するように設定することもできます。

このアプローチにより、ネットワークのタイムアウトやサーバーが利用できないなどの問題に対処できるはずです。

ここで、検討する必要がある質問がいくつかあります。

購入後すぐに何が起こるべきでしょうか? アプリは検証が成功するまで待ってからプレミアム コンテンツを提供するべきでしょうか、それとも暫定的にアクセスを許可して、検証が失敗した場合はアクセスを取り消すべきでしょうか?

プレミアム機能への暫定的なアクセスを許可すると、大多数のユーザーに対してプロセスがスムーズになりますが、API がを検証する間に、不正なユーザーにもアクセスを許可することになりますpurchaseToken

言い換えると、購入は不正であることが証明されるまで有効ですか、それとも有効であることが証明されるまで不正ですか?

サブスクリプション期間の更新時にユーザーがまだ有効なサブスクリプションを保持しているかどうかを確認するには、で返されたpurchaseTokenで実行される再検証をスケジュールする必要があります。expiryTimeMillis結果

expiryTimeMillis過去のものである場合は、premiumフラグを false に設定できます。 が将来のものである場合は、新しい に再度スケジュールを設定しますexpiryTimeMillis

最後に、ユーザーがプレミアム アクセスを持っているか (または持っていないか) を確認するには、アプリの起動時またはバックグラウンドから抜け出すときに、アプリで API に対してユーザーの詳細を照会する必要があります。

おすすめ記事