<< Android-Note

GooglePlayBillingLibraryを使った課金アイテムの作り方

アプリ内で何かアイテムを作ってそれを販売したい場合はGooglePlayBillingLibraryというライブラリを使います。

ライブラリの導入

まずeclipseのAndroidSDKManagerを開いて、「extra」フォルダ以下の「Google Play Billing Library」をインストールします。

「Google Play Billing Library」を選択

もしBilling Libraryが見つからなかったらADTをアップデートしてみてください。

インストールが完了したらsdk\extras\googleディレクトリ以下にplay_billingディレクトリが作られます。

次に自分のアプリのプロジェクトのsrcディレクトリ上に次の画像のようにパッケージ「com.android.vending.billing」を作り、その中にsdk\extras\google\play_billingディレクトリにあるIInAppBillingService.aidlをコピーします。

AIDLファイルをコピーしたプロジェクト

パーミッションの追加

アプリから課金するにはAndroidManifest.xmlのapplicationタグの下に次のパーミッションを追加します。

<uses-permission android:name="com.android.vending.BILLING" />

これだけです。

課金アイテムの作成

次に課金したいアイテムをディベロッパー画面から作ります。

課金アイテムを作る場合、必ずAPKがGooglePlay上にアップロードされた上に、アプリが一度以上公開済みでなければなりません。

アプリが公開済みならhttps://play.google.com/apps/publish/を開き、そこからアプリ内アイテムを選択します。

その後、「新しいアイテムを追加」をクリックすると次のダイアログが出てくるのでそこでアイテムの種類とアイテムID(大文字不可)を入力してアイテムを追加します。

アイテムの追加ダイアログ

一度作成したアイテムIDは後からアイテムを削除しても再利用できないので慎重に決めてください。

また、アイテムのステータスは作成時は「無効」になっているので必ず「有効」にします。

アイテムの購入

次にアイテムの購入するための実装をしていきます。

まず初めに課金処理を行うサービスであるIInAppBillingServiceをアクティビティを結びつけます。

そのために初めにActivityで次のサービスとコネクションを宣言します。

アクティビティ内
    IInAppBillingService billingService;
        /// 課金サービス
    
    /**課金サービスをアクティビティと結びつけるコネクションクラス*/
    ServiceConnection billingServiceConn = new ServiceConnection()
    {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) 
        {
            billingService = IInAppBillingService.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name)
        {
            billingService = null;
        }
    };

次にonCreateメソッド内でアクティビティとサービスを次のように結びつけます。

アクティビティ内
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        /// 課金サービス開始
        bindService(
            new Intent("com.android.vending.billing.InAppBillingService.BIND"),
            billingServiceConn, Context.BIND_AUTO_CREATE);
    }

追記 :

Android5.0以上で上記のコードを試すとIllegalArgumentExceptionで落ちてしまうことが判明しました。なので次のように変更しなくてはいけません。

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        /// 課金サービス開始
        Intent intent = new Intent(
                "com.android.vending.billing.InAppBillingService.BIND");
        intent.setPackage("com.android.vending");
        bindService(intent, billingServiceConn, Context.BIND_AUTO_CREATE);
    }

追記終了

そして課金ダイアログをアクティビティ内のボタンが押されたら表示されるような処理を作りました。

アクティビティ内
        Button buyItemButton = (Button) findViewById(R.id.buyItemButton);
        buyItemButton.setOnClickListener(new View.OnClickListener() 
        {
            @Override
            public void onClick(View v)
            {
                Bundle buyIntentBundle = billingService.getBuyIntent(
                        3, getPackageName(), "myapp_item_id", "inapp", 
                        "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
                PendingIntent buyIntent 
                    = buyIntentBundle.getParcelable("BUY_INTENT");
                MainActivity.this.startIntentSenderForResult(
                        buyIntent.getIntentSender(), 1234567, 
                        new Intent(), Integer.valueOf(0), 
                        Integer.valueOf(0), Integer.valueOf(0));
                    /// 課金ダイアログを表示
            }
        });

IInAppBillingServiceのgetBuyIntentに渡している3つ目の引数が先ほど登録した課金アイテムのID、4つ目がアプリの種類、最後の文字列がdeveloper payloadという注文の補足情報で、空の文字列でも構いません。

その後はインテント(BUY_INTENT)を起動するだけで課金ダイアログが表示されます。

購入が成功したかどうかはonActivityResultメソッドから調べることができます。

アクティビティ内
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        if(requestCode == 1234567){
            if(resultCode == RESULT_OK){
                Toast.makeText(this, "アイテムを購入", Toast.LENGTH_LONG).show();
            }else{
                Toast.makeText(this, "アイテムの購入に失敗", Toast.LENGTH_LONG).show();
            }
        }
    }

resultCodeにRESULT_OKが入っていれば購入が成功しています。

最後にアプリが終了したときは購入サービスのコネクションを切り離します。

アクティビティ内
    @Override
    public void onDestroy()
    {
        super.onDestroy();
        
        /// 課金サービスを終了
        if(billingService != null){
            unbindService(billingServiceConn);
        }
    }

これが基本的な流れです。

課金テスト

テスト購入はエミュレーター上ではできず、実機が必要になります。

そしてアプリをインストールするときは署名したアプリを実機にインストールしなければ「このバージョンのアプリは、Google Playを通じたお支払いはご利用になれません。」というエラーメッセージが表示されます。

その場合はeclipse上からは署名付きアプリはインストールできないので端末とPCをつないだ状態でadbコマンドでアプリのAPKをインストールすればOKです。

また、テストアカウントを使っていない場合は「出版社はこのアイテムを購入できません」というエラーが表示されるので本アカウントとは別のアカウントを作成してください。

テストアカウントの追加

もしテストアカウントを端末に追加したら上の画像のように「ライセンス権のあるGmailアカウント」にアカウントを追加します。

もし複数のテストアカウントを登録したければアカウントをコンマで区切ります。

そして課金テストをする際はかならずアプリを一旦公開しなくてはならないみたいです。

公開したとしてもアプリが公開されるまで1時間以上はかかるのでそれまでは課金テストはできません。

全ての条件が整えば次の購入ダイアログが表示されます。

購入ダイアログ

画像に書いてある通り、テストアカウントの場合は課金は発生しないので安心してください。

以上、長くなりましたが課金アイテムの実装方法でした。では、また!

関連項目
プライバシーポリシー