アプリ内定期購入

定期購入では、アプリのコンテンツ、サービス、機能を自動的に繰り返し課金できます。 定期購入の販売には、既存のアプリ内課金の実装を簡単に適用できます。

このドキュメントでは具体的な定期購入の実装方法に重点を置きつつ、関連する課金およびビジネスモデル戦略についても説明します。

  • 定期購入では、自動的に好きな間隔で継続的に課金する商品を販売できます。
  • 月または年単位の定期購入に対しては試用期間を設定できます。
  • 定期購入の管理には Developer Console、または Google Play Developer API を使います。
  • ユーザーは、Google Play から直接ではなく、アプリ内で定期購入に登録します。
  • 現在の定期購入がアクティブであれば、ユーザーは自身で定期購入を更新できます。
  • 定期購入期間内であれば、アップグレードやダウングレードも可能です。 以前の定期購入費用は比例配分され、未使用分は次の定期購入に適用されます。
  • アカウントの管理や特典を提供する目的で、特定のユーザーの定期購入に対する課金を先延ばしすることもできます。

概要

定期購入は、アプリ内課金の商品タイプのうち、ユーザー向けコンテンツ、サービス、機能をアプリ内で指定した間隔で自動的に繰り返し課金できる販売方式です。 アプリやゲームなど、ほぼすべてのタイプのデジタル コンテンツに対して定期購入販売が可能です。

その他のアプリ内アイテムと同様に、Developer Console で定期購入の設や公開を行い、Android 端末にインストールされたアプリ内で販売できます。 Developer Console で定期購入商品を作成し、商品リストに追加します。そして価格と、オプションで試用期間を設定し、課金間隔を指定して公開します。 Developer Console の使用に関する詳細は、定期購入アイテムの設定をご覧ください。

ユーザーがアプリ内で定期購入を登録すると Google Play が精算内容を処理するのため、アプリ側で金銭的なトランザクションを直接処理する必要はありません。 Google Play は Google ペイメントを介して定期購入の支払いを処理します。通常のアプリ内アイテムやアプリの購入とまったく同様のプロセスなので、ユーザーになじみのある一貫した購入フローを提供できます。

ユーザーは定期購入を登録後、Play ストア アプリの [My Apps] 画面から、もしくは Play ストア アプリのアプリの商品詳細ページから登録内容の確認やキャンセルができます。 ユーザーによるキャンセル処理の詳細は、定期購入のキャンセルをご覧ください。

デベロッパーのウェブサイトやその他サービスなどから幅広いコンテンツにアクセスできる定期購入を提供するにあたり、クライアント側の API だけでなく、アプリ内課金用のサーバー側の API も使用できます。サーバー側 API を使うと、自身の他のサービスにユーザーがログインした際に、定期購入状況を確認できます。 API に関する詳細は、Google Play Developer API をご覧ください。

自身の Android アプリ内から、既存の外部定期購入者ベースを作成することもできます。

  • たとえばウェブサイト上で定期購入を販売する場合、Android アプリに独自のビジネス ロジックを追加してユーザーが他で定期購入を登録済みかどうかを判定し、登録済みならコンテンツへのアクセスを許可、未登録なら Google Play での定期購入登録を勧めます。
  • できる限り多くのアプリや商品で定期購入登録を共有するような独自のソリューションを実装できます。 たとえば、アプリ、ゲーム、その他のコンテンツのコレクション全体へのアクセスを許可する定期購入を、月額または年額で販売することも可能です。 このようなソリューションを実装するには、アプリに独自のビジネス ロジックを追加し、すでに定期購入を登録済みのユーザーかどうかを判定し、そうであればコンテンツへのアクセスを許可します。

全体的には、標準的なアプリ内アイテムと同様の基本ポリシーと規約が定期購入にも当てはまりますが、いくつか違いもあります。 現行のポリシーと規約に関するすべての情報は、ポリシー ドキュメントでご確認ください。

定期購入に必要な最小限のシステム要件については、バージョン情報で詳細をご確認ください。

定期購入アイテムの設定

定期購入を作成して管理するには、Developer Console でアプリ用の商品リストを作成し、定期購入商品それぞれに属性を設定します。

  • 購入タイプ: 常に Subscription に設定
  • 定期購入 ID: 定期購入の識別子
  • 公開状態: Unpublished(非公開)/ Published(公開)
  • 言語: 定期購入を表示する際のデフォルト言語
  • タイトル: 定期購入商品のタイトル
  • 説明: ユーザーに対する定期購入の説明
  • 価格: 毎回の支払い時のデフォルト価格
  • 繰り返し: 課金の間隔
  • 追加の通貨での価格(自動入力可能)

Developer Console で商品を追加、設定する詳細な方法は、アプリ内課金の管理をご覧ください。

Google Play Developer API でも定期購入の作成や管理が可能です。

定期購入の価格設定

Developer Console で定期購入を作成する際、利用可能な通貨で価格を設定できます。 各定期購入にはゼロ以外の価格を設定してください。 同じコンテンツに異なる定期購入価格を複数設定できます。 たとえば、月契約料金よりも年契約料金の登録に割引サービスを提供するなどのケースです。—

重要: 定期購入の価格を変更するには、新規価格で新たな定期購入用商品 ID を公開し、アプリ内で元の商品 ID と置き換えます。 購入済みのユーザーは引き続き元の価格で課金されますが、新規ユーザーは新規価格で課金されます。

ユーザー課金

Developer Console で自動定期課金の間隔を指定して、定期購入商品の設定ができます。

  • 週単位: 初回購入時および以降は週ごとに、Google Play から購入者の Google ペイメント アカウントに課金します。
  • 月単位: 初回購入時および以降は月ごとに、Google Play から購入者の Google ペイメント アカウントに課金します。(課金日は月によって多少異なる場合があります)。
  • 3 か月単位: 初回購入時および以降は 3 カ月ごとに、Google Play から購入者の Google ペイメント アカウントに課金します。(課金日は月によって多少異なる場合があります)。
  • 6 か月単位: 初回購入時および以降は 6 カ月ごとに、Google Play は購入者の Google ペイメント アカウントに課金します。(課金日は月によって多少異なる場合があります)。
  • 年単位: 初回購入時および翌年以降は同じ日に、Google Play からカスタマーの Google ペイメント アカウントに課金します。
  • シーズン単位: 「シーズン」開始日に、Google Play からカスタマーの Google ペイメント アカウントに課金します(シーズン開始日と終了日を自分で指定します)。 シーズンもののコンテンツ(スポーツ関連コンテンツなど)を年契約してもらうことがねらいです。 定期購入の有効期間はシーズン終了までで、翌年のシーズン開始日に再び有効になります。

定期購入に指定した間隔と価格で、無期限に課金が継続されます。 定期購入を更新するたびに、Google Play はユーザー アカウントに自動的に課金し、あとからメールで課金内容を通知します。 月および年契約については、課金のサイクルは常に購入日をベースにした定期購入のサイクルに一致します (シーズン購入は毎年一回シーズン開始日に課金されます)。

定期購入の支払いが承認されると、Google Play は In-app Billing API を通して購入アプリに購入トークンを発行します。 アプリはトークンをローカルに保存するか、バックエンド サーバーに渡すことができます。これにより、Google Play Developer API を使ってリモートで定期購入を確認、キャンセルできます。

定期支払いができない場合(購入者のクレジットカードが無効だった場合など)は、定期購入は更新されません。 getPurchases() メソッドによって、失敗や期限切れの定期購入は返されません。

推奨事項: 定期購入、トークン、想定される課金エラーを、バックエンド サーバーに通知するビジネス ロジックをアプリに含めてください。 これにより、バックエンド サーバーがサーバー側 API を使ってクエリの作成や記録のアップデートを行い、必要い応じて直接購入者のフォローアップをすることができます。

手動更新

In-app Billing Version 3 API を使うと、ユーザーは定期購入を自動更新するように設定していなくても、定期購入の有効期間中に手動更新することができます。 定期購入期間中にさらに定期購入を行うと、現行レートで適切な期間分が延長されます。

たとえば、あるユーザーが「Modern Hoplite」というアプリの定期購入をしていたとします。現在の登録が 8 月 1 日に切れるため、7 月 10 日に現行レートで 1 か月分購入しました。 その結果、現在の定期購入に 1 か月追加され、期限は 9 月 1 日に変更されます。

こうしたケースをどのような UI で通知するはアプリに委ねられています。たとえば、ユーザーの定期購入が現在有効でなければアプリに [購入] ボタンを表示し、有効であれば [更新] ボタンを表示すると良いでしょう。

定期購入のアップグレードとダウングレード

In-app Billing Version 3 API を使うと、ユーザーは定期購入期間であってもアップグレードやダウングレードができます。 その場合、現在有効な定期購入はキャンセルされ、新たな定期購入が作成されます。 変更前の定期購入はキャンセルされ、未使用分は割合に応じて新たな定期購入に適用されます。 新たな定期購入に対する最初の課金期間は、未使用分を使い切ったあとから始まります(新たな定期購入では、変更前と同じ期間である必要はありません)。

たとえば、あるユーザーが「Country Gardener」というアプリのオンライン コンテンツの定期購入をしているとします。 現在の登録は、そのコンテンツの Tier 1 バージョンの月契約です(コンテンツはテキストのみ)。 月額は 200 円で毎月 1 日に契約が更新されます。 4 月 15 日に、Tier 2 の定期購入にアップグレードすることにし(動画のアップデートも含む)、月額 300 円になりました。 この時点で、Tier 1 の定期購入はただちに終了します。1 か月分(4 月 1~30 日)をすでに支払っていますが、半分しか使っておらず、定期購入分の残り半分(100 円)は新たな定期購入に適用されます。 ただし、新たな登録は月 300 円のため、100 円のクレジット残高は 10 日分にしかなりません。 よって、このユーザーのクレジットは、4 月 15 日~25 日の分に当てられます。4 月 26 日に、新たな定期購入分の 300 円が課金され、次の 300 円は翌月以降の毎 26 日に課金されることになります。

注: 新たな定期購入の課金日は、配分されたクレジットを定期購入者がいつ使い切るかによって変わるため、シーズン契約の定期購入者はアップグレードやダウングレードできません。シーズン契約では、開始日と終了日が予め固定されているためです。

定期購入のアップグレードやダウングレードの際、アプリは getBuyIntentToReplaceSkus() を呼び出します。このメソッドが、ユーザーが購入を希望する新たな SKU に渡され、その時点で前の SKU は破棄されます。 前の SKU の残りは新たな定期購入分の支払いに当てられ、クレジットを使い切った時点で課金が開始されます。

課金の延期

Google Play Developer API を使うと、定期購入者の次の課金日を延期することができます。 ユーザーのコンテンツへの定期購入登録は継続され、アクセスも完全に保持されますが、延期期間中には課金されません。 これにより、次のことが可能になります。

  • バンドル割引やスペシャル オファーの一環として無料アクセスを提供(例:雑誌の定期購読を申し込んだユーザーに、ウェブ コンテンツへの無料アクセス権を付与するなど)
  • 感謝の印としてユーザーに無料アクセス権を付与

課金の延期は 1 回当たり最長 1 年間です。もちろん延長期間が終了しても、再度 API を呼び出せます。

例として、あるユーザーが「Fishing Gentleman」というアプリのオンライン コンテンツを月契約で定期購入しているとします。 普段は毎月 1 日に、150 円を支払っています。3 月 10 日に、アプリの公開者からのオンライン調査に回答しました。 公開者は謝礼として、次の支払を 6 月 1 日まで延期ことにしました。すると、このユーザーは4 月 1 日と 5 月 1 日には課金されませんが、この間も通常通りコンテンツにはアクセスできます。 6 月 1 日には、これまで通りの 150 円が定期購入費として課金されます。

注: API は常に日数単位で課金日を延期します。 半端な日数で延期をリクエストすると、API は指定日時に一番近い次の課金日まで繰り上げます。たとえば、ユーザーの定期購入登録では 2015 年 6 月 15 日の 14:00:00(協定世界時)に更新するよう設定されていて、デベロッパーが API で 2015 年 8 月 15 日の 02:00:00(協定世界時)に更新日を延期する場合、API は次の課金日に揃えて更新日を 2015 年 8 月 15 日 14:00:00(協定世界時)に設定します。

新規の定期購入者には、以下無料試用サービスに記載したサービスも提供できます。

無料試用サービス

Developer Console では、ユーザーが定期購入のコンテンツを購入前に試用できる、無料の試用期間を設定できます。 試用期間はデベロッパーが設定した期間だけ継続し、指定した課金間隔と価格に基づいて自動的に本購入に移行します。 Google Play では、シーズン契約を含むすべての定期購入タイプにおいて、無料試用サービスをサポートしています。

無料試用サービスを利用するには、ユーザーは通常のアプリ内課金フローに沿って定期購入登録のステップを一通り踏む必要があります。つまり、課金用の支払いフォームに入力し、通常の購入トランザクションまでを一通り行います。ただ、最初の期間が無料試用期間となるため、ユーザーが実際に課金されることはありません。 Google Play では、キャンセルされるまでは試用期間中も定期購入として登録し、0 円のトランザクションを記録します。 トランザクションを完了すると、ユーザーには、無料試用サービス付きの定期購入の登録完了と最初の課金が 0 円であることが Google Play からのメールで通知されます。

試用期間の終了時には、最初の購入手続きでユーザーが入力したクレジットカードに対して、本購入用に設定した金額で Google Play により自動的に課金が開始されます。以降は、定期購入の間隔で繰り返し課金されます。 ユーザーは必要に応じて、試用期間中にいつでも定期購入をキャンセルできます。 この場合、定期購入自体は試用期間終了まで有効ですが、Google Play によって自動的に本購入への更新をしないように設定されます。これにより、試用期間の終了時点で定期購入も終了となり、Google Play からユーザーへの課金は行われません。

APK の修正や更新をすることなく、Developer Console 内で定期購入に試用期間を設定できます。 商品リストに対象の定期購入を含め、編集して、試用期間の有効日数(7 日以上必要)を設定して公開するだけです。 Google Play では期間の変更はいつでも可能ですが、すでに試用サービスを登録済みのユーザーには変更が反映されません。 新たな定期購入者にのみ、変更後の試用期間が適用されます。 定期購入対象商品 1 つにつき、1 回の無料試用期間を設けることができます。

定期購入の公開

Developer Console で、または API によって定期購入商品の詳細を設定し終えたら、アプリ内の商品リストで定期購入を公開します。

商品リストで定期購入とアプリ内アイテム、またはその両方を追加できます。異なるコンテンツやサービスへのアクセスを可能にする複数の定期購入や、同じコンテンツへのアクセスを可能にするが課金間隔や価格設定が異なる(プロモーション用など)複数の定期購入を追加できます。 たとえば、ニュースの配信サービスでは同じコンテンツに対して月払いと年払いを用意して、年払いの方に割引を付けたいと考えるでしょう。 定期購入をサポートしていない旧式の端末ユーザーでもコンテンツを利用できるように、定期購入商品に相当するアプリ内購入を提供することもできます。

定期購入またはアプリ内アイテムを商品リストに追加して商品を公開すると、Google Play によって購入が可能な状態になります。 Google Play によって商品が購入可能になるには、先にアプリ自体も公開する必要があることに注意してください。

重要: アプリ内の商品リストから定期購入商品を削除すると、ユーザーは商品の確認や購入ができなくなります。

シーズン契約の定期購入の配分価格

シーズン契約の定期購入ユーザーに対しては、シーズン開始日以降に配分価格を設定できます。 割引価格の適用開始日を指定します。 この割引価格は、指定日の 0:00(協定世界時)に有効になります。 シーズン後半になるほど定期購入価格を下げるなど、複数の配分価格の設定が可能です。 ユーザーが配分価格のシーズン契約を購入し、翌シーズン開始まで継続した場合、Google Play は翌シーズンの開始時に正規の定期購入額を課金します。

たとえば、プロのチェッカー対戦シーズンである 3 月 1 日から 8 月 31 日の間、「Checkers Dilettante」というアプリをシーズン契約 1,000 円で提供するとします。 さらにアプリでは 2 種類の配分価格を用意し、6 月 1 日以降に申込んだユーザーは 850 円、8 月 15 日以降の申込みであれば 600 円とします。 ユーザーの申込み時期にかかわらず、シーズン契約は 8 月 31 日に終了します。

定期購入のキャンセル

ユーザーは、Play Store アプリの [My Apps] 画面で定期購入の状況を確認し、必要ならばキャンセルできます。現時点で In-app Billing API は、購入アプリ内での定期購入のキャンセルをプログラムでサポートしていません。

ユーザーが定期購入をキャンセルしても、Google Play は現在の課金サイクルに対する返金はしません。 代わりに、定期購入期間が満了となる課金サイクル終了までの間、ユーザーはキャンセルした定期購入を利用できます。 たとえば、月契約で定期購入していたユーザーが、サイクルの 15 日目でキャンセルした場合、Google Play 上の登録は同月末日まで有効です。

また、ユーザーが定期購入契約のキャンセルを、デベロッパーに直接リクエストする場合もあり得ます。 このような場合には、サーバー側 API でクエリを作成し、ユーザーの定期購入を自身のサーバーから直接キャンセルします。

重要: あらゆる場合において、ユーザーからのアクセスが可能な限り、定期購入者がいるコンテンツを提供し続ける必要があります。 つまり、定期購入が有効なユーザーが一人でもいれば、いかなるコンテンツも削除してはなりません。仮にその登録が現在の課金サイクルの終了時に満了するとしてもです。 その代わりに、返金と解約用の API を使って定期購入登録を一人一人解約し、定期購入金額を返金することができます。定期購入者がアクセス権を保持するコンテンツを削除した場合には、ペナルティが課されます。 詳細については、ポリシー ドキュメントをご覧ください。

アプリのアンインストール

ユーザーが定期購入アプリをアンインストールする際には、Play ストア アプリからユーザーに有効な定期購入登録があることが通知されます。 アンインストールの続行を選択するとアプリは削除されますが、定期購入登録は有効な状態が続き、課金もそのまま継続されます。 ユーザーは Play ストア アプリの [My Apps] 画面から、いつでも定期購入登録のキャンセルが可能です。 アンインストールのキャンセルを選択した場合には、アプリと定期購入登録は変更されません。

定期購入の返金と解約

定期購入に関しては、Google Play に返金ウィンドウがないため、ユーザーからリクエストする必要があります。 ユーザーは Play ストア内の [My Orders] ページから、またはデベロッパーに直接問い合わせて、返金をリクエストします。

返金リクエストを受信したら、Google Play Developer API または Merchant Center で、定期購入登録のキャンセルや、キャンセル済みかの確認、キャンセルせずに返金などの対応ができます。 Google Play Developer API は、ユーザーの定期購入の返金と解約にも使用できます。 登録の返金および解約を行うと、ユーザーの定期購入登録はただちにキャンセルされ、直近の支払い分が返金されます (直近の支払い以前の分まで返金する場合には、Merchant Center で追加の返金処理をします)。

重要: 現時点では、一部返金には対応していません。

支払い処理とポリシー

Google Play の規約では、一般的にデベロッパーは、通常の支払いプロセスを扱う Google ペイメントを介してのみ、アプリ内定期購入を販売できます。 定期購入商品の購入に対するトランザクション手数料は、アプリ購入の手数料(30%)と同じです。

Google Play に公開された定期購入販売対応のアプリは、アプリ内課金でトランザクションを処理する必要があります。アプリや Google Play 以外の購入フロー(外部ウェブサイトなど)へのリンクを貼らないでください。

規約およびポリシーに関する詳細については、ポリシー ドキュメントをご覧ください。

定期購入の注文番号

特定の定期購入のトランザクションをトラックできるように、Google ぺイメントでは、繰り返されるすべての定期購入に対して基本となる販売者注文番号を付与しています。また次のような整数を付加することで、それぞれのトランザクションが何回目かを表しています。

GPA.1234-5678-9012-34567 (基本注文番号)
GPA.1234-5678-9012-34567..0(1 回目の注文 ID)
GPA.1234-5678-9012-34567..1(2 回目の注文 ID)
GPA.1234-5678-9012-34567..2(3 回目の注文 ID)
...

INAPP_PURCHASE_DATA JSON フィールド(V3 の場合)または PURCHASE_STATE_CHANGED インテント(V2 の場合)の、orderId フィールドの値として、Google Play から注文番号が付与されます。

未払いに対する支払猶予期間

Developer Console では、定期購入の支払猶予期間を設定できるため、定期購入者は支払いが滞った際に支払方法を変更することができます。 定期購入者のクレジットカードの有効期限が過ぎてしまった、プリペイドカードを使って登録した、支払い情報をアップデートせずにカードを解約してしまった場合に、この設定が役立ちます。 定期購入の支払猶予期間の設定に関する詳細は、Developer Console Help のトピック Add subscriptions & recurring charges をご覧ください。

定期購入の支払猶予期間の設定が getBuyIntent() メソッドから返されるデータに与える影響については、INAPP_PURCHASE_DATA フィールドの表をご覧ください。

購入確認の戦略

通常、新規購入分の注文ステータスが有効かどうかをアプリで事前確認してから、購入コンテンツへのアクセスを許可します。

購入確認時は、アプリから購入トークンや他の詳細情報をバックエンド サーバーに渡し、それらの情報を Google Play Developer API を使用して Google Play で直接確認します。 バックエンドサーバーは購入が有効であると判断すると、アプリに通知してコンテンツへのアクセスを許可します。

ユーザーはネットワークに未接続の状態でも、常時アプリを利用できる状況を望んでいます。 よって、オフラインのユースケースにも対応した購入確認方法を使用するよう配慮してください。

Google Play Developer API

Google Play が提供する HTTP ベースの API では、次のようなタスクが実行可能です。

  • リモートで特定の定期購入の有効性を随時照会する
  • 定期購入をキャンセルする
  • 定期購入者の次の課金日を延期する
  • 定期購入をキャンセルせずに支払いを返金する
  • 定期購入を返金および解約する

この API は定期購入の安全な管理、定期購入の延長や別のサービスとの統合を行う手段として、バックエンドサーバーから利用できるよう設計されています。

詳細については、Google Play Developer API をご覧ください。