1. ホーム
  2. android

[解決済み] サーバーサイドでアンドロイドアプリの購入を確認する方法 (google play in app billing v3)

2022-06-26 06:47:02

質問

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

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

Googleが提供するTrivialdriveの公式サンプルを確認しましたが、サーバーサイドの検証のためのサンプルコードは提供されていませんので、質問させていただきます。

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

ユーザーの購入を確認し、データベースでユーザーのステータスをマークするために、どのような方法を取るべきか分かりませんが、おそらく両方でしょうか?

また、残念なことに、ユーザーがgoogle playからこの商品を購入した場合、何らかの理由で、ちょうどその時、私のアプリが私のサーバーに検証を起動したとき、状況があります。 ネットワーク接続がダウンしているか、自分のサーバーがダウンしています。 と表示され、ユーザーはgoogle playでお金を支払っただけなのに、私のサーバーに購入が記録されていない?このような場合、どのように対処すればよいのでしょうか?

どのように解決するのですか?

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

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

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

APIは purchaseToken Google 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 を照会する必要があります。