[解決済み] サーバーサイドでアンドロイドアプリの購入を確認する方法 (google play in app billing v3)
質問
私はシンプルなアプリを持っています(アカウントでユーザログインが必要です)。私は、より多くのニュースコンテンツのような、有料ユーザー向けのいくつかのプレミアム機能を提供しています。
私は、ユーザーがこのアイテムを購入したかどうかをサーバーのデータベースに記録する必要があります。ユーザーのデバイスにデータコンテンツを提供する際に、ユーザーのステータスを確認し、有料ユーザー向けに異なるコンテンツを提供することができます。
Googleが提供するTrivialdriveの公式サンプルを確認しましたが、サーバーサイドの検証のためのサンプルコードは提供されていませんので、質問させていただきます。
- サンプルでは、アプリの公開鍵を内部で使用して購入を検証していますが、見た目が良くないので、検証プロセスを自分のサーバーに移動して、ユーザーのログイン情報を組み合わせて、ユーザーの購入が完了したかどうかを確認し、データベースを更新すれば良いと思います。
- また 購入 API を使用することができますが、私が必要とするのはユーザーの purchaseToken をサーバーに渡すことです。
ユーザーの購入を確認し、データベースでユーザーのステータスをマークするために、どのような方法を取るべきか分かりませんが、おそらく両方でしょうか?
また、残念なことに、ユーザーがgoogle playからこの商品を購入した場合、何らかの理由で、ちょうどその時、私のアプリが私のサーバーに検証を起動したとき、状況があります。 ネットワーク接続がダウンしているか、自分のサーバーがダウンしています。 と表示され、ユーザーはgoogle playでお金を支払っただけなのに、私のサーバーに購入が記録されていない?このような場合、どのように対処すればよいのでしょうか?
どのように解決するのですか?
あなたが探しているのは、ユーザーがプレミアム機能を有効にしているかどうかを確認する方法のようなので、ここから始めることにします。
データベースに、ユーザーがプレミアム機能を持つかどうかを示す何らかのフラグがあることを確認し、アカウント情報を要求するときに API 応答ペイロードにそれを含めます。このフラグは、「プレミアム機能」に対する主要な権限となります。
ユーザーがアプリ内購入を行ったとき、クライアント (アプリ) で詳細 (トークン、注文 ID、製品 ID) をローカルにキャッシュし、それを API に送信します。
APIは
purchaseToken
を
Google Play 開発者向け API
を使用して検証します。
ここからいくつかのことが起こるかもしれません。
- レシートが有効で、APIがクライアントに200 OKステータスコードで応答する。
- 領収書は無効であり、API は 400 Bad Request ステータス コードでクライアントに応答します。
- 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 を照会する必要があります。
関連
-
armeabi-v7a armeabi arm64-v8a パラメータの意味説明
-
cygwinのダウンロード、インストールチュートリアル、およびCDTの「makeプログラムがパスに見つからない」バグの解消
-
Android開発で「Attempt to invoke virtual method 'XXX()' on null object reference」というヌルポインター例外に遭遇する。
-
ActivityはOnFragmentInteractionListenerを実装しなければならないに関する質問
-
アンドロイドスタジオのエラーを解決する --> Error:(1, 0) id 'com.android.application' を持つプラグインが見つかりません。
-
Android Nで報告されたエラーを解決する: android.os.FileUriExposedException: file:///storage/emulated/0/
-
WeChatとQQは、他のアプリのオープンリストに自分のアプリを追加し、ファイルパスを取得することができます
-
Androidの美しいSeekBarスタイルのカスタマイズ
-
Android--shape--描画のコーナー、グラデーション、パディング、サイズ、ソリッド、ストロークのプロパティを指定する。
-
アンドロイドの遅延実行のいくつかの方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
aapt2エラー:ログを確認する(具体的な原因の探り方)
-
AndroidエミュレーターのADBサーバーがACKしない問題
-
Gradle の同期に失敗しました。com.android.tools.build:gradle が見つかりませんでした。
-
最新のandroidプロジェクトディレクトリにあるarmeabi-v7aとarmeabiの具体的な意味とその違いを教えてください。
-
ArrayAdapter は、リソース ID が TextView であることが必要です。
-
エラー:未宣言の識別子(AS)の使用
-
Android Nで報告されたエラーを解決する: android.os.FileUriExposedException: file:///storage/emulated/0/
-
Windowsのadbシェルでデータディレクトリにアクセスするとパーミッションが拒否される
-
Androidプロセス生存のためのソリューション
-
Android Studio常见错误之:Rendering Problems/The following classes could not be instantiated