Google Play のアプリ内課金サービスの使用
Android アプリケーションの作成 への移動
アプリ内決済サービスを利用すると、アプリケーション内でデジタル コンテンツを直接販売することができます。
Google Play のアプリ内課金は、Google の Android 向けアプリ内決済サービスです。このトピックでは、FireMonkey アプリケーション プラットフォーム を使ってアプリケーションで Google Play のアプリ内課金にアクセスする方法を説明します。
- メモ: 以下の情報は、Android 向け開発についての主要なドキュメント トピックを補完するものです。続行する前に、「Android モバイル アプリケーション開発」に目を通してください。
目次
サポートされているデバイス
FireMonkey では、Android 2.2 以降が動作しているデバイスと、最新バージョンの Google Play ストアに関して、Google Play のアプリ内課金をサポートしています。「FireMonkey プラットフォームに必要な準備」の「Android の要件」セクションも参照してください。
- メモ: Android エミュレータはサポートされていません。
前提条件
Google Play のアプリ内課金サービスを使用する前に、以下を行う必要があります。
- 開発環境の準備。
- Google Play デベロッパー コンソール アカウントの取得。このアカウントは、Google Play にアプリケーションを公開するために必要です。
- メモ: Google によって初回のみ 25 ドルの登録料が請求されます。
- Google ウォレット Merchant アカウントの作成。このアカウントは、アプリケーションから製品を販売するために必要です。
Google Play のアプリ内課金を使用するためのアプリケーションの構成
Google では、アプリ内製品を追加する前に、ドラフト アプリケーションをアップロードすることが求められます。
アプリケーションに Google Play のアプリ内課金機能を追加する前に、現状のアプリケーションを Google Play にアップロードしてください。手順は以下のとおりです。
- アプリケーションの配置準備をします。
- [プロジェクト|オプション...|使用する権限]を開き、[販売課金 (アプリ内課金)]の権限を有効にすることを忘れないでください。
- アプリケーションの署名済み
.apk
パッケージを作成します。 - 新規アプリケーションを Google Play にアップロードします。
Google Play デベロッパー コンソールのアプリケーションのページで、[サービスと API]をクリックします。[サービスと API]ページに、アプリケーションのライセンス キーが表示されます。Google Play に接続できるよう TInAppPurchase のインスタンスを構成するときには、このライセンス キーを ApplicationLicenseKey プロパティにコピーしなければなりません。
TInAppPurchase では、管理アプリ内製品をサポートしています。管理製品の詳細は、「In-app Billing Version 3, Product Types」(『アプリ内課金バージョン 3』の「製品の種類」)を参照してください。
- メモ: 定期購買は現在サポートされていません。
モバイル アプリケーションへの Google Play のアプリ内課金機能の追加
アプリケーションでは、このコンポーネントのインスタンスをアプリケーションに追加し、アプリケーションの起動時またはその他の任意の時点でGoogle Play のアプリ内課金サービスへの接続を確立する必要があります。そうすれば、サービスを使用することができます。Google Play のアプリ内課金サービスへの接続を確立したら、次のようなことを行うことができます。
- アプリケーションの製品についての情報を要求する。Google Play のアプリ内課金サービスに接続した後で、少なくとも 1 度はアプリケーションでこれを行う必要があります。
- 製品を購入する。
- 製品を消費する。アプリケーションで消費型製品を処理し、消費したことをアプリ内決済サービスに知らせます。
- ユーザーが別のデバイスで購入した製品を現在のデバイスにリストアする。ユーザーが要求したときに行う必要があります。たとえば、アプリケーションにそのための[リストア]ボタンを用意するなどが考えられます。
Google Play のアプリ内課金サービスへの接続を確立する
Google Play のアプリ内課金サービスを使用する前に、Google Play のアプリ内課金サービスに接続できるよう TInAppPurchase を構成し、接続を確立する必要があります。
Google Play のアプリ内課金サービスを使用できるよう接続データを構成する
Android で Google Play のアプリ内課金サービスに接続するには、TInAppPurchase の ApplicationLicenseKey プロパティにライセンス キーをコピーしなければなりません。ライセンス キーは、Google Play のアプリ内課金を使用できるようアプリケーションを構成した後で取得します。たとえば次のようなものです。
InAppPurchase1.ApplicationLicenseKey := 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgEAlGKUp9KCAQjzJdrjDaCC2Z2P0K751w1KAL3cBLhDqRSYDnug+nZKzeg2+R3KOIDVpJU7+PXz8jyf07m/30Y0J1CmOBf6NK/MIsXq3BmWb4/UIUW1aKzlHiiVtpcm26n3hOSmnnfkhasbfQo75puBBTbURvumOFfwUAJ2BM9FzAOPWzsAqT1brYI8iu+NHDT+gGQl7uOTgEN3jbBD/la5qAt' +
'evOGbgP1DhfKtsi91+/oyy3+lphWNn2A+RE1KOx4lnHp0wZyOEvDP/CPZneT0YYgqG6MtawM+Mij/75XwhJEdeOSXYya7BN6hg49JX2WJxCRc7JqbgzN9vsRn6hSceQ5MuQIDAQAB';
- メモ: Delphi コンパイラの制限により、255 文字を超えた文字列リテラルは使用できません。解決策としては、上記のように文字列を複数の部分に分割してください。
Google Play のアプリ内課金サービスに接続する
Google Play のアプリ内課金サービスに接続するには、SetupInAppPurchase を呼び出します。この手続きは非同期で、終了すると OnSetupComplete イベントが発生します。OnSetupComplete にイベント ハンドラを関連付けたい場合には、SetupInAppPurchase を呼び出す前に行います。
InAppPurchase1.OnSetupComplete := InAppPurchase1SetupComplete;
InAppPurchase1.SetupInAppPurchase;
通常は、OnSetupComplete にイベント ハンドラを関連付けて、対象のサービスに接続した直後に製品リストを要求します。あるいは、IsSetupComplete を呼び出して、特定の時点でサービスを使用できるか(True
)できないか(False
)を確認することもできます。
Google Play のアプリ内課金サービスを使用する
Google Play のアプリ内課金サービスへの接続を確立したら、以下の処理を行うことができます。
製品リストの情報を取得する
アプリケーションでは、そのアプリケーションで購入可能な製品の ID のリストを保持する必要があります。このリストはTInAppPurchase.ProductIDs プロパティに保持します。任意の時点で QueryProducts を呼び出して、その ID の製品に関する情報(その製品が購入済みかどうかなど)を要求することができます。
エラーが起きると、TInAppPurchase.OnError が発生します。そのときの FailureKind
は ProductsRequest です。
要求が成功すると、TInAppPurchase.OnProductsRequestResponse が発生します。このイベントには 2 つの製品リストが含まれます。
Products
: TProduct のインスタンスを含む TList。有効な製品と購入済みの製品のリストです。InvalidProductIDs
: TStrings。無効な製品の ID のリストです。
ユーザーが既に購入した製品と単に購入可能である製品とを区別するには、引数に製品の ID を渡して IsProductPurchased を呼び出します。
if InAppPurchase1.IsProductPurchased(ProductID) then { Do something. }
- メモ: 製品のリストに購入済みの消費型製品が含まれている場合には、このタイミングでその製品を消費します。
TProduct には数多くのプロパティが用意されており、それを読み取って各製品の情報を取得することができます。
製品を購入する
ユーザーに製品を購入させる前に、CanMakeInAppPurchases を呼び出して、ユーザーが購入を許可されているか(True
)いないか(False
)を確認してください。
if not InAppPurchase1.CanMakeInAppPurchases then { Disable or hide the in-app payments GUI elements of your application. }
Google Play のアプリ内課金サービスから返された購入可能な製品のリストに含まれる製品の購入を要求するには、製品 ID を引数に渡して PurchaseProduct を呼び出します。
InAppPurchase1.PurchaseProduct(ProductID);
エラーが起きると、TInAppPurchase.OnError が発生します。そのときの FailureKind
は Purchase です。
購入が成功すると、TInAppPurchase.OnPurchaseCompleted が発生します。このイベントには購入した製品の ID が含まれていて、イベントの NewTransaction
パラメータは、製品を購入したときには True
に、リストアしたときには False
になっています。このイベント ハンドラを使用して購入済みの製品を管理することができます。たとえば、購入した製品が消費型の製品である場合には、消費を行います。
製品を消費する
- メモ: TInAppPurchase では、製品が消費型か非消費型かを判断するメソッドを提供していません。アプリケーション内で独自に区別する必要があります。たとえば、消費型または非消費型の製品 ID のリストをアプリケーション内にハードコードするなどの方法があります。
消費型の製品とは、複数回購入できる製品です。ユーザーが消費型の製品を購入したときには、アプリケーションで ConsumeProduct を呼び出して、その製品が消費されたことを Google Play のアプリ内課金サービスに知らせる必要があります。
InAppPurchase1.ConsumeProduct(ProductID);
-
- メモ: 製品 ID のリストを渡して ConsumeProducts を呼び出しても構いません。
上記いずれかのメソッドを呼び出して製品を消費すると、結果として以下のいずれかのイベントが発生します。
- TInAppPurchase.OnConsumeCompleted: 製品の消費が成功した場合。このイベント処理として、アプリケーション内で購入の処理を行います。たとえば、アプリケーション内でクッキーの数をカウントしていて、ユーザーが "クッキー 5 個" を購入した場合、アプリケーションでクッキー数を 5 だけ増やすことができます。
- TInAppPurchase.OnConsumeFailed: エラーが発生して製品を消費できない場合。このイベントの
ErrorMessage
引数にエラーの詳細説明が含まれています。
別のデバイスで購入した製品を現在のデバイスにリストアする
ユーザーの非消費型製品は、そのユーザーのどのデバイスにおいても、常に購入済みとして表示されます。何もしなくても、それらの購入した製品はリストアされます。
- メモ:
- 以前に購入した製品をユーザーが再び購入しようとした場合には、無料で購入できます。
- 購入済み製品をリストアすると、ユーザーの App Store 資格情報を入力するよう求められます。購入済み製品のリストアを自動的に行うべきではありません。そうではなく、たとえば[リストア]ボタンを使用して、ユーザーにリストア操作を手動で開始させるなどします。
デベロッパ ペイロード文字列を使って購入を確認する
Google Play のアプリ内課金サービスを使用するときには、アプリケーションのユーザーに固有の値(何らかのコード)を TInAppPurchase.TransactionPayload プロパティに設定することができます。この値は、ユーザーがアプリケーションから製品を購入すると、Google Play のアプリ内課金サービスに送信されます。
購入処理中に Google Play のアプリ内課金サービスからデベロッパ ペイロード文字列が送り返されてきますが、これは、先に TransactionPayload プロパティに定義した文字列と一致しなければなりません。2 つの文字列が一致する、つまり購入が実際にユーザーによって注文されたものであることを確認する処理は、OnVerifyPayload イベントのイベント処理で行います。
procedure TForm1.InAppPurchase1VerifyPayload(Sender: TObject; const Payload: string; var PayloadOk: Boolean);
begin
if Payload.Compare(FPayload) <> 0 then
PayloadOk := False;
end;
このイベントのハンドラで PayloadOk
を False
に設定すると、購入は無効になります。
- 警告: 同じユーザーが別のデバイスでアプリケーションを使用する可能性があります。デバイスが違ってもユーザーが同じであれば、デベロッパ ペイロード文字列は同じでなければなりません。たとえば、アプリケーションでランダムに生成した文字列ではいけません。すべてのデバイスで同じにならないためです。
アプリ内での製品購入のテスト
アプリ内での製品購入は、テスト ユーザーを使って料金を発生させずにテストすることができます。『Testing In-app Billing(アプリ内課金のテスト)』を参照してください。