Android、Java、Web系、Linux、マラソン等の備忘録

2015/09/30

Google Playアプリ内課金実装でつまづいたメモ

0 件のコメント

恐れ多くもへっぽこアプリへ課金で広告解除等の実装しようと思っております。既に4月頃リリースしたアプリにはうまく実装できていたのですが、今度バージョンアップのリリースしようと思っているアプリへは一筋縄にいかなかったので、つまづいた点などをメモしておきたいと思います。初めて実装する場合は、クレジットカードの番号とか銀行の口座番号とか入力が必要だったと思いますがその辺りの手順は割愛します。

実装面

こちらのサンプルコードを参考にさせていただきました。
Androidのアプリ内課金IABv2のサービス終了と新しいIABv3への移行方法 - Qiita
http://qiita.com/Night___/items/1ff72d0a926e0ebdf87c
サンプルコードの通りに実装するとうまく動くのですが、IabHelperのstartSetup()メソッドを呼んで、処理が終わってから、(購入ボタンを押した時の)launchPurchaseFlow()を呼ぶようにしなければなりません。単に順番通りに呼んでしまうと、非同期で動いてるのでsubscriptionsSupported()がfalseで返ってきてつまづきました....

アイテム追加

Google Play Developer Console → (アプリを選択) → アプリ内アイテム → +新しいアイテムを追加

で追加します。ここでは「管理対象のアイテム」で話を進めます。この時入力するアイテムIDをサンプルコードのPRODUCT_IDに設定します。

アイテムに必要事項を入力して忘れてはいけないのが、


アイテムを有効にすること!

そして、右上の「更新を送信」ボタンで保存することも忘れずに。

ライセンス キー

左のメニューから「サービスとAPI」を選択。ページ中程になる「ライセンスとアプリ内課金」にある文字列をコピーして、サンプルコードのbase64EncodedPublicKeyのところへ記述。

テストのやり方

Google Play Developer ConsoleにAPKファイルアップロードしてやる必要がるのですが、やり方は何通りかあります。

  • ベータ版テスト
    • クローズドベータ版テスト
    • オープンベータ版テスト
    • GoogleグループまたはGoogle+コミュニティを使用するベータ版テスト
  • アルファ版テスト
    • クローズドアルファ版テスト
    • オープンアルファ版テスト
    • GoogleグループまたはGoogle+コミュニティを使用するアルファ版テスト

ここでは、クローズドベータ版テストで話を進めます。

クローズドベータ版テスト

(左のメニュー)APK → ベータ版テスト → クローズドベータ版テスト

「Create list」をクリックして、適当なリスト名を入力し、テスターのメールアドレスを入力します。Google Play Developer Consoleにログインしているメールアドレスはダメです。

「ベータ版に新しいAPKをアップロード」ボタンにてAPKをアップロードします。
テストはこのAPKがGoogle Play Developer Consoleに反映されてから行えます。

そのため、以下のようなマークが表示されている間はテストが行えません。

この状態でテストしようとすると、


「指定したアイテムは購入できません」と表示されてしまいます。Logcatには以下のように表示されます。
PurchaseFragment.onStateChange: Error: PurchaseError{type=3 subtype=4}
PurchaseFragment.onStateChange: Purchase failed: PurchaseError{type=3 subtype=4}

この反映が数時間かかる場合があります。

上記のような実装面にミスがあると修正して再度APKをアップロードする必要があり更に数時間かかるということをやってしまいました。この時、これはAPKの反映を待てばよいのか別のところが間違ってるのかわかってなかったのでしんどい時間帯でした。

APKが反映されたら

テスト端末にAPKをインストールします。adbのinstallコマンドでは確認してませんが、以下の2通りがあります。

  • 自動アップデート(過去のベータ版APKが端末に入っていたら?テスターの端末として認識されたら?アップデートされる条件を細かく確認してませんが、自動アップデートで入手できる場合があります)
  • オプトインURLから入手

オプトインURLをテスト端末のブラウザ等で開きます。


テスターとして認識されていれば、下図のように表示されます。


これでインストールが完了すると、課金のテストが行えます。購入してもキャンセルされるはずです。


参考

2015/10/06 追記:購入を消費する

上記までだと、1回テストすると購入済みになってしまって、2回目以降の購入テストができません。


このスクショは英語ですが購入後に購入処理を走らせると表示されます。日本語だとこのアイテムは既に購入済みがナントカとか表示されてたと思います。2回目以降をテストをするには、この購入したものを消費すればOKです。
以下のようにIabHelperのconsumeAsync()を実行してやると消費できます。

※このサンプルは動作を確認してません。

これで、購入処理を確認しては消費 を繰り返せば無限にテストできます。
ゲームのアイテムのように何度も購入できるようなものは、購入したタイミングで消費するというような記述を見かけた気がしますが忘れました...。

ちょっと不明な部分と余談

例えばスマホとタブレットというように端末を複数台所持している場合、同じGoogleアカウントを登録していると、スマホで購入したアイテムはタブレット側でも購入済みになる仕様です。そのため、IabHelperのstartSetup()メソッドを実行し、サンプルで言うところの49行目のgetPurchase()の取得を確認してやれば、タブレット側でも購入済みであることを知ることができます。

ただ、この購入情報はどこかがキャッシュしてるみたいで、複数の端末間で購入と消費を繰り返していると、49行目のgetPurchase()はnullで返ってくるけど、購入処理を実行してみると上図のような購入済みのエラーダイアログが表示されてしまうことがあります。テスト時の対処法(?)としては以下が考えられます。
  • 購入情報が反映されるまで待つ(?)
  • 端末をリブートしてみる
  • 新しいテスト端末を使う(例:Genymotionで新しいデバイスを作る。要Google Play)
基本的に1回目は動いているので、例えば広告解除のような1度しか購入できない商品のようなもは運用上は問題ないように思います。

この購入済みのエラーダイアログですが、このダイアログが表示された時にプログラム的にそれをを知る術が不明です。IabHelper.OnIabPurchaseFinishedListenerはそのダイアログのOKボタンを押した後でユーザーキャンセルの値が返ってきます。購入済みである7が返ってくると嬉しいのですが....


あと、Fragemntで実行するよりはActivityで実行した方がいいような記述を見かけました。

参考



0 件のコメント :

コメントを投稿