Open9

【Android】Play Billing Libraryのサンプルコードを動かす

だーら(Flamers / Memotia)だーら(Flamers / Memotia)

概要

  • Androidの課金実装の動作検証を行うため、Play Billing Libraryのサンプルコードを動かす
  • このスクラップ作成時点ではBilling Library 6が利用されている

https://github.com/android/play-billing-samples/tree/master

チュートリアル実装の流れ

  • AppKotlinのREADMEが完全な手順となっているので、そちらを見ながら進める。このREADMEの途中でサーバーのデプロイも案内される
だーら(Flamers / Memotia)だーら(Flamers / Memotia)

Firebase Projectの作成

  • 作成時に質問されるGoogle Analyticsとの接続はenableとする。
  • Firestoreの作成
  • Functionsをenable(従量課金プランに変更)
  • AuthenticationからEmail/Passwordと、Googleのパスワード認証をenableにする
  • Androidアプリを追加。SHA-1はこのときにはまだ入れない
    • google-services.jsonをダウンロードしてAndroidプロジェクトのapp以下に配置
    • gradleの設定(Firebaseのガイドを見ながら)
build.gradle(Project ClassyTaxiAppKotkin)
// Projectレベルのgradleファイルに追加するようにFirebaseから指示されている
// id 'com.google.gms.google-services' version '4.4.1' apply false
// は、サンプルプロジェクトに元から入っているので変更の必要性無し

// バージョンをあげないとエラーが発生する
buildscript {
    ext {
-        gradleGoogleVersion = '4.3.10'
+        gradleGoogleVersion = '4.3.15'
build.gradle(Module app)
dependencies {
// Firebaseのドキュメント通り
+    implementation platform('com.google.firebase:firebase-bom:32.7.2')
+    implementation 'com.google.firebase:firebase-analytics'

Play Developer Consoleにアプリを作成して提出

  • 新規アプリを作成し、データ収集や国など諸々の設定を完了
  • 内部テスト向けに提出(署名はアップロード鍵 + Google Playによるアプリ鍵の方式を採用)
  • 一度リリースを作成するとSHA-1を取得できる。これを持って再びFirebaseのgoogle-services.jsonを更新する
  • 再度aabをreleaseビルドしてアップロード
だーら(Flamers / Memotia)だーら(Flamers / Memotia)

Play Developer Consoleの設定

定期購入の作成

https://zenn.dev/link/comments/b83067500650c4

古い内容の詳細

You no longer need to link your developer account to a Google Cloud Project in order to access the Google Play Developer API.

  • 参考記事

  • READMEのSummaryにかかれている以下の記述も古い

A Google Play Console account can only be linked to a single Google Cloud Console project, so we recommend creating a dedicated Google Cloud Console project that is shared by all apps in your Google Play Console

(その代わりに)サービスアカウントをGoogle Play Consoleのユーザーとして招待

公式doc / もし日本語で表示されたら英語にすること

1. Create a Google Cloud Project.

  • Firebaseによって自動で作成されたProjectを利用した(これで良いのか要検討)

2. Enable the Google Play Developer API for your Google Cloud Project.

3. Set up a service account with appropriate Google Play Console permissions to access the Google Play Developer API.

  • Google Play Consoleで、ユーザーとして招待 & 権限付与

サービスアカウントキーの作成

  • 公式ガイドに従って行う
  • キーを作成したらjson形式でダウンロードする
  • Serverの方のサンプルプロジェクトの中に配置する
だーら(Flamers / Memotia)だーら(Flamers / Memotia)

Google Cloud のサービスアカウントとは?

抜粋(公式より)

サービス アカウントは、ユーザーではなく、アプリケーションや Compute Engine インスタンスなどのコンピューティング ワークロードで通常使用される特別なアカウントです。

アプリケーションはサービス アカウントを使用して、認可された API 呼び出しを行います。

アプリケーションをサービス アカウントとして認証する最も一般的な方法は、アプリケーションを実行しているリソースにサービス アカウントを関連付けることです。たとえば、サービス アカウントを Compute Engine インスタンスに関連付けると、そのインスタンスで実行されているアプリケーションがサービス アカウントとして認証されるようにできます。その後、サービス アカウントに IAM ロールを付与すると、サービス アカウントは(さらにはインスタンス上の)アプリケーションが Google Cloud リソースにアクセスできるようになります。

サービスアカウントのタイプ

ユーザー管理のサービスアカウント

  • ユーザーがプロジェクト内に作成するサービスアカウント
  • メアドは→の形式 service-account-name@project-id.iam.gserviceaccount.com

デフォルトのサービスアカウント

  • ユーザー管理のサービスアカウントに含まれる。
  • 特定のGoogle Cloudサービスを有効にするときに自動で作成されるサービスアカウント。

Google管理のサービスアカウント

  • ユーザーに変わってGoogleが作成し、管理する。

Google App EngineとGoogle Compute Engine

https://qiita.com/defunty/items/f837c9e09c8ccc6033b3

  • App EngineはPaaS、Compute EngineはIaaS
    • App EngineはHeroku、Elastic Beanstalk(AWS)と同じ概念
    • Compute EngineはEC2(AWS)と同じ概念
  • FirebaseはApp Engine
だーら(Flamers / Memotia)だーら(Flamers / Memotia)

Serverのデプロイ

https://github.com/android/play-billing-samples/tree/master/ClassyTaxiServer

$ cd "ClassyTaxiServerのディレクトリ"

$ firebase --version
13.3.1

$ firebase login
Waiting for authentication...
✔  Success! Logged in as xxxxx@xxxx.xx

$ npm install
  • Cloud Functionsの設定
$ firebase use --add classy-taxi-dara-server
Now using project classy-taxi-dara-server

$ firebase functions:config:set app.package_name="xxxx.xxxxx.ClassyTaxiDara"
✔  Functions config updated.
Please deploy your functions for the change to take effect by running firebase deploy --only functions

$ firebase functions:config:set app.basic_plan_sku="basic_subscription"
✔  Functions config updated.
Please deploy your functions for the change to take effect by running firebase deploy --only functions
  • デプロイ
$ firebase deploy --only functions
だーら(Flamers / Memotia)だーら(Flamers / Memotia)

(脱線)Pub/Subを作成するチュートリアル

  • 課金とは関係なく、Pub/Subを作ってみる練習

https://cloud.google.com/pubsub/docs/publish-receive-messages-console?hl=ja

  • 新しいプロジェクトを作成する

  • トピックを作成する

    作成完了(サブスクリプションも同時に作成されている)

  • 自分で独自にサブスクリプションを作成する

  • トピックからメッセージを公開する

  • サブスクリプションでpullすると、一つ前のステップで公開したメッセージが受診できる

だーら(Flamers / Memotia)だーら(Flamers / Memotia)

課金のテストができるように設定

https://developer.android.com/google/play/billing/test?hl=ja
https://support.google.com/googleplay/android-developer/answer/6062777

  • Google Play Consoleで(アプリ外の)設定 > ライセンステストで、ライセンス応答を"LICENSED"に設定

  • [公式doc]に以下のように書かれている通り、設定を変更しても反映まで数時間かかった。なので正確に何をしたらテストができるようになるかやや不明確ではある。

    • (だが、上記のライセンス応答の設定を変更したくらいしかアクションをしていない気がする)

テストトラックにアプリを公開します。テストトラックにアプリを公開した後、テスターがアプリを利用できるまでに数時間かかることがあります。

ライセンステスターの違い

  • デバッグ署名を持つデバッグビルドを使用しているアプリであっても、新しいバージョンのアプリをアップロードすることなく、テスト用にアプリをサイドローディングできます。
  • ライセンス テスターは、購入に対して実際の課金が行われないテスト用支払い方法を利用できます。
  • 更新時間も以下のように短縮される