定期購入固有の機能を追加する

定期購入を設定するには、Android Play Console を使用します。定期購入を設定したら、定期購入の購入フローを有効にするために Google Play 請求サービスをアプリに追加できます。定期購入には、請求対象期間、猶予期間、無料試用期間など、Google Play 請求サービスの概要に記載されている多くの特性があります。このセクションを読む前に、こういった概念に慣れておく必要があります。

詳しくは、最新の定期購入に関する動画をご視聴ください。

また、このページの残りの部分を読む前に、リアルタイム デベロッパー通知を有効にする必要があります。 リアルタイム デベロッパー通知により、ステータスの変更に積極的に対応し、ユーザーを増やし、ユーザー離れを軽減することができます。通知を有効にするには、リアルタイム デベロッパー通知についてのページをご覧ください。

Google Play 請求サービス ソリューション全般で、対応を試みるべき定期購入のユースケースには次のようなものがあります。

  • リアルタイム デベロッパー通知を使用して定期購入関連のステータスの変更に対処する
  • 個人プランからファミリー プランへのアップグレードなど、ユーザーが定期購入をアップグレードまたはダウングレードできるようにする
  • 定期購入が解約された場合は定期購入の期間が終了する前に、ユーザーが手動で再登録することを許可する
  • 定期購入の料金を払い戻す
  • 定期購入を取り消す
  • 定期購入を解約する
  • 定期購入が一定期間無料になるように、ユーザーへの請求を延期する
  • お客様に解約を思いとどまらせる

このようなユースケースに対処するには、Google Play Billing Library、Google Play Developer API、リアルタイム デベロッパー通知を組み合わせて使用します。

リアルタイム デベロッパー通知を使用して定期購入関連のステータスを処理する

リアルタイム デベロッパー通知は、デベロッパーが SUBSCRIPTION_PURCHASEDSUBSCRIPTION_RECOVERED といった定期購入のステータスの変更を監視できるようにするサーバー プッシュ通知です。リアルタイム デベロッパー通知により、ステータスの変更に積極的に対応し、ユーザーを増やし、ユーザー離れを軽減することができます。通知を有効にするには、リアルタイム デベロッパー通知についてのページをご覧ください。

リアルタイム デベロッパー通知を有効にすると、安全なバックエンド サーバーで定期購入のステータスの変更のみをアラートする通知を受け取れます。リアルタイム デベロッパー通知の受信後は、Developer API を呼び出して完全なステータスを取得し、バックエンド ステータスを更新する必要があります。これらの通知は、定期購入のステータスが変更されたことのみを通知するもので、定期購入のステータスの詳細は通知されません。

Developer API を確認するときは、必ず次の操作を行います。

  • expiryTimeMillis が将来の日付の場合は、常に登録を許可します。
  • autoRenewing = false の場合は定期購入の有効期限が切れるため、ユーザーに再登録を依頼します。
  • paymentState = 0 の場合はユーザーのお支払いの問題を解決するため、定期購入センターのディープリンクを使用してユーザーに定期購入センターをご案内します。

将来的には、定期購入の一時停止や期限切れ後の定期購入の復元など、ユーザーの登録に影響するステータスの変更が追加される可能性があります。そのため、これらの機能を統合する準備ができている場合は、すべての未定義の通知は Developer API の呼び出しで処理し、上記の操作を行ってください。

猶予期間中のユーザー - SUBSCRIPTION_IN_GRACE_PERIOD

猶予期間は、Google Play Console のアプリ内アイテムの設定に基づいて一定期間続きます。Google Play では、猶予期間中に定期購入の更新が試みられます。お支払いの問題についてユーザーに通知するには、お支払い方法の修正方法をユーザーに知らせるメッセージをアプリに表示します。修正しなければ、ユーザーは定期購入にアクセスできなくなります(例: 「アカウントの中断を防ぐため、Google Play の定期購入の設定に移動して Google Play でのお支払いを修正してください」)。メッセージに Google Play の定期購入の設定へのリンクを含め、ユーザー本人がお支払い方法を修正できるようにします。

ユーザーの猶予期間を調べるには、Google Play Developer API を呼び出します。Google Play では、猶予期間が終了するまで expiryTimeMillis 値が動的に延長されます。この期間中に、ユーザーの定期購入が解約、更新、一時停止されたかどうかを確認する必要があります。また、expiryTimeMillis が経過した後に、ユーザーの現在の定期購入のステータスを確認して、定期購入の最新のステータスを取得する必要があります。

次のスニペットに示すように、JSON レスポンスの内容は定期購入のステータスによって異なります。たとえば、猶予期間中(お支払い方法に問題がある場合)に定期購入を照会すると、expiryTimeMillis は将来のタイムスタンプに動的に更新され、paymentState は 0 に設定されます。

    {
      "kind": "androidpublisher#subscriptionPurchase",
      ...
      "expiryTimeMillis": timestamp_in_future,
      "autoRenewing": true,
      ...
      "paymentState": 0  # Payment pending
    }
    

定期購入が正常に更新された(お支払い方法が更新された)後に定期購入を照会すると、expiryTimeMillis は将来のタイムスタンプに設定され、paymentState は 1 に設定されます。

    {
      "kind": "androidpublisher#subscriptionPurchase",
      ...
      "expiryTimeMillis": timestamp_in_future,
      "autoRenewing": true,
      ...
      "paymentState": 1  # Payment received
    }
    

猶予期間が経過した後に定期購入を照会すると、定期購入は一時停止(Google Play Console でアカウントの一時停止が有効な場合)または解約(Google Play Console でアカウントの一時停止が無効な場合)された状態になります。SUBSCRIPTION_ON_HOLDSUBSCRIPTION_CANCELLED の JSON レスポンスのサンプルについては、アカウントの一時停止 - SUBSCRIPTION_ON_HOLD をご覧ください。

アカウントの一時停止 - SUBSCRIPTION_ON_HOLD

アカウントの一時停止期間は 30 日間です。アカウントの一時停止中に、ユーザーの定期購入が解約、再開、再購入されたかどうかを確認する必要があります。アカウントの一時停止中に、定期購入へのアクセスが停止された理由をユーザーに通知します。ユーザーに通知するには、お支払い方法を修正して定期購入に再びアクセスできるようにする方法についてのメッセージをアプリに表示します(例: 「定期購入に問題があります。Google Play の定期購入の設定に移動して、Google Play でのお支払いを修正してください」)。このメッセージに Google Play の定期購入の設定へのリンクを含め、ユーザーがお支払い方法を修正できるようにします。また、次のような追加の操作を行う必要があります。

  • ユーザーがお支払い方法を更新して定期購入が再開された場合、定期購入されたコンテンツへのアクセスがアプリで復元される必要があります。詳しくは、再開された定期購入 - SUBSCRIPTION_RECOVERED をご覧ください。ただし、一時停止期間中に定期購入が再開されなかった場合、定期購入は解約され、ユーザーは新しい定期購入を購入する必要があります。
  • アプリ外の定期購入にアクセスすることを想定したアプリの場合は、定期購入がアクティブでなくなったことを知らせるためにプッシュ通知またはメールをユーザーに送信することをおすすめします。ユーザーがアプリを開いたときにのみ定期購入にアクセスできる場合は、次回ユーザーがアプリを開いたときにのみ定期購入の中断について通知する必要があります。

アカウントが一時停止中であることを検証するため、ユーザーがアプリで定期購入しているコンテンツにアクセスを試みるたびに、ユーザーの現在の定期購入のステータスを確認する必要があります。

次のスニペットに示すように、JSON レスポンスの内容は定期購入のステータスによって異なります。たとえば、アカウントの一時停止中(お支払い方法に問題がある場合)に定期購入を照会すると、expiryTimeMillis は過去のタイムスタンプに設定され、paymentState は 0 に設定されます。

    {
      "kind": "androidpublisher#subscriptionPurchase",
      ...
      "expiryTimeMillis": timestamp_in_past,
      "autoRenewing": true,
      ...
      "paymentState": 0  # Payment pending
    }
    

定期購入が再開された(お支払い方法が更新された)後に定期購入を照会すると、expiryTimeMillis は将来のタイムスタンプに設定され、paymentState は 1 に設定されます。

    {
      "kind": "androidpublisher#subscriptionPurchase",
      ...
      "expiryTimeMillis": timestamp_in_future,
      "autoRenewing": true,
      ...
      "paymentState": 1  # Payment received
    }
    

30 日間の一時停止の経過後に解約された定期購入を照会すると、expiryTimeMillis は過去のタイムスタンプに設定され、cancelReason は 1 に設定されます。

    {
      "kind": "androidpublisher#subscriptionPurchase",
      ...
      "expiryTimeMillis": timestamp_in_past,
      "autoRenewing": false,
      ...
      "cancelReason": 1  # The system canceled the subscription
    }
    

定期購入の再開 - SUBSCRIPTION_RECOVERED

定期購入の再開後の購入トークンは、通常、ユーザーのアカウントの一時停止が開始される前のものと同じです。ただし、ユーザーが一時停止期間中に定期購入を再購入することで、定期購入しているコンテンツへのアクセスを取り戻す場合があります。この場合、定期購入の新しいインスタンスを表すために、新しい購入トークンの値が返されます。

サーバーに新しい定期購入のデータを登録したら、定期購入が再開されたことをユーザーに知らせるメッセージをアプリに表示できます(例: 「更新されたお支払い方法が記録され、定期購入が再開されました」)。

定期購入の解約 - SUBSCRIPTION_CANCELLED

ユーザーは Play ストアから定期購入を自発的に解約したり、一時停止後に再開を希望しない場合は定期購入を自動的に解約したりすることができます。安全なバックエンド サーバーで SUBSCRIPTION_CANCELLED リアルタイム デベロッパー通知を受信した場合は、次のようになります。

  • 定期購入が解約されたことをユーザーに通知するメッセージをアプリに表示します。例: 「定期購入は **日付** に期限切れになります。Google Play の定期購入の設定に移動して、定期購入を再開してください」。ユーザーが定期購入を更新できるように、Google Play の定期購入の設定へのリンクをメッセージに含める必要があります。
  • メッセージを今後表示しない選択肢も提供する必要があります。

新しい購入トークンを受け取ったら、購入トークンを確認する手順を行います。

注: 解約に関するメッセージは、期限切れのお支払い方法による解約ではなく、特に手動で定期購入を解約したユーザーに不快感を与える可能性があります。手動で定期購入を解約したユーザーには、通知しないという選択肢もあります。

定期購入の価格を変更する

Google Play Console では、アプリ内で提供される定期購入の価格を変更できます。この機能は、特定の定期購入に関連付けられているコンテンツの量やアプリ内特典の一部を変更する場合に役立ちます。

定期購入の価格を更新するには、Google Play Console で次の手順を行います。

  1. 価格を変更する定期購入を含むアプリに移動します。
  2. [ストアでの表示] > [アプリ内アイテム] を選択し、[定期購入] タブを開きます。
  3. 図 1 に示すように、変更する価格の横にある [編集] を選択します。

    定期購入価格の横にある [編集] リンク
    図 1. 定期購入の価格を編集する
  4. 定期購入に付ける新しい価格を入力します。

    価格を変更すると、図 2 に示すように、警告ダイアログが表示されます。このダイアログでは、新しい定期購入ユーザーに対しては価格の変更がすぐに有効になり、価格の変更に同意した既存の定期購入ユーザーに対しては 30 日以内に価格の変更が有効になることが説明されています。

    定期購入価格変更の警告ダイアログ
    図 2. 定期購入の価格変更がいつ有効になるかについての警告

価格の変更をユーザーに知らせる

デベロッパーは Google Play で通知が開始されるまでの少なくとも 7 日以内に、価格の変更について既存の定期購入ユーザーに連絡する必要があります。Google Play でのユーザーへの通知は、図 3 に示すようなダイアログで表示されます。このダイアログには、以前の価格、新しい価格、新しい価格が有効になる日付が表示されます。

全般的な定期購入価格変更のダイアログ
図 3. 定期購入の価格変更をユーザーに通知する一般的なダイアログ

次の方法で、このダイアログをアプリに表示できます。

価格変更の確認フローを起動する

アプリの起動時にダイアログを表示するには、課金クライアント クラスに次のロジックを追加します。

Kotlin

    val priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
            .setSkuDetails(changedPriceSubscriptionSkuDetails)
            .build()

    billingClient.launchPriceChangeConfirmationFlow(activity,
            priceChangeFlowParams,
            object : PriceChangeConfirmationListener() {
                override fun onPriceChangeConfirmationResult(responseCode: Int) {
                    if (responseCode == BillingResponse.OK) {
                        // User has confirmed the price change.
                    } else if (responseCode == BillingResponse.USER_CANCELED) {
                        // User hasn't confirmed the price change.
                    }
                }
            })
    

Java

    PriceChangeFlowParams priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
            .setSkuDetails(changedPriceSubscriptionSkuDetails)
            .build();

    billingClient.launchPriceChangeConfirmationFlow(activity,
            priceChangeFlowParams,
            new PriceChangeConfirmationListener() {
                @Override
                public void onPriceChangeConfirmationResult(int responseCode) {
                    if (responseCode == BillingResponse.OK) {
                        // User has confirmed the price change.
                    } else if (responseCode == BillingResponse.USER_CANCELED) {
                        // User hasn't confirmed the price change.
                    }
                }
            });
    

Google Play の価格変更ダイアログを表示する前に、価格変更の理由を説明する独自のメッセージやダイアログを表示できます。このようなカスタム メッセージを作成して表示すると、ユーザーが新しい価格で定期購入を更新することを選択する可能性が高くなります。

ユーザーがカスタム ダイアログに応答すると、アプリが再びアクティブになり、Play Billing Library から responseCode(タイプ BillingClient.BillingResponse)が返されます。

デベロッパーは、PriceChangeConfirmationListener の実装によってユーザーのレスポンスを処理できます。たとえば、ユーザーが価格変更に同意した場合は、カスタマイズされたお礼メッセージを表示することができます。

価格変更に対するユーザーの確認を処理する

定期購入の新しい価格にユーザーが同意すると、ライブラリから請求サーバーにも通知が送信されます。デベロッパーは Google のリアルタイム デベロッパー通知機能で、ダイアログに対するユーザーのレスポンスに関する通知を受け取ることができます。ユーザーが価格の変更に同意した場合、タイプ SUBSCRIPTION_PRICE_CHANGE_CONFIRMED の通知が届きます。

価格変更が不承認となったケースを処理する

ユーザーがアプリの PriceChangeConfirmationListener で価格変更に同意しない場合もあります。このような場合、ユーザーの以前の定期購入は継続されますが、次の更新日に期限切れとなります。以前の定期購入が期限切れとなるまでにユーザーが価格変更に同意しなかった場合、定期購入は解約され、デベロッパーにはタイプ SUBSCRIPTION_CANCELEDリアルタイム デベロッパー通知が届きます。

アプリで定期購入がサポートされている場合は、ユーザーが自分の定期購入を管理できるようにリンクを設定画面に含めます。図 4 にリンクの例を示します。このリンクのクリック ハンドラに、ユーザーがアプリの有効期限内の定期購入を持っているかどうかを判断するロジック(expiryTimeMillis が将来の時間に設定されている、またはautoRenewingtrue に設定されている)を追加します。

  • ユーザーがアプリの有効期限内の定期購入を持っていない場合は、図 5 に示すように次の URL を使用して、他のすべての定期購入を表示するページに移動するようにします。

        http://play.google.com/store/account/subscriptions
        
  • 一方、ユーザーが有効期限内の定期購入を持っている場合は、図 6 に示すように次の URL を使用して、その定期購入に直接移動できるようにします。

        https://play.google.com/store/account/subscriptions?sku=your-sub-product-id&package=your-app-package
        

各定期購入の SKU は、Play Console で作成したときに割り当てたアイテム ID と一致します。プログラムを使用して既存の定期購入の SKU を求めるには、特定のユーザーに関連付けられている定期購入のリストをアプリのバックエンドで照会します。必要なサーバーサイド ロジックの例については、ClassyTaxi サンプルアプリ内の queryCurrentSubscriptions() メソッドをご覧ください。

「Google Play Subscriptions」というボタンを含む設定画面
図 4. 「定期購入を管理」するリンクの例(画像内の [Google Play Subscriptions] ボタン)
ユーザーのすべてのアプリの定期購入を表示する定期購入の詳細画面
図 5. ユーザーがアプリ外で購入したすべての定期購入を表示する画面(アプリ内の定期購入がない場合)
特定のアプリでユーザーが購入した特定の定期購入を表示する定期購入の詳細画面
図 6. ユーザーがアプリで購入した特定の定期購入の詳細を表示する画面(アプリ内の定期購入がある場合)

定期購入のアップグレードやダウングレードを許可する

デベロッパーは基本階層やプレミアム階層など、さまざまな定期購入の階層をユーザーに提供できます。図 7 は、2 つの定期購入の階層を提供する画面を示しています。

図 7. 定期購入の階層

ユーザーは同様の画面にアクセスし、別の階層の定期購入を購入することによって定期購入をアップグレードまたはダウングレードできます。この場合、アプリ内アイテムの購入を有効にするの説明にある元の定期購入の購入に使用されたのと同じアプリ内アイテムの購入フローを使用する必要があります。ただし、アップグレードまたはダウングレードするときは、setOldSku() メソッドを使用して、現在の定期購入と今後の(アップグレードまたはダウングレードされた)定期購入のアイテム ID を BillingFlowParams オブジェクトに渡します。以下に例を示します。

Kotlin

    val flowParams = BillingFlowParams.newBuilder()
            .setSkuDetails(newSkuDetails)
            .setOldSku(currentId)
            .build()
    val responseCode = billingClient.launchBillingFlow(activity, flowParams)
    

Java

    BillingFlowParams flowParams = BillingFlowParams.newBuilder()
            .setSkuDetails(newSkuDetails)
            .setOldSku(currentId)
            .build();
    int responseCode = billingClient.launchBillingFlow(flowParams);

    

購入トークンを受け取ったら、新しい購入トークンの確認に使用するのと同じ確認手続きを行います。詳しくは、購入を確認するをご覧ください。Google Play Developer API は定期購入のリソースで linkedPurchaseToken を返しますが、サービスへのアクセスに古いトークンが使用されないように、linkedPurchaseToken で提供されるトークンは必ず無効にしてください。

ユーザーがアップグレードまたはダウングレードを行うと、SUBSCRIPTION_PURCHASED ステータスが安全なバックエンド サーバーに送信されます。SUBSCRIPTION_PURCHASED を処理するには、SUBSCRIPTION_PURCHASED を処理する方法についての章をご覧ください。

比例配分モードを設定する

定期購入をアップグレードまたはダウングレードするときに、BillingFlowParams クラスの replaceSkusProrationMode を設定して、定期購入が変更されたときに適用される比例配分についての詳細を指定できます。

Kotlin

    val flowParams = BillingFlowParams.newBuilder()
            .setSkuDetails(skuDetails)
            .setOldSku(oldSku)
            .setReplaceSkusProrationMode(replaceSkusProrationMode)
            .build()
    val responseCode = billingClient.launchBillingFlow(activity, flowParams)
    

Java

    BillingFlowParams flowParams = BillingFlowParams.newBuilder()
            .setSkuDetails(skuDetails)
            .setOldSku(oldSku)
            .setReplaceSkusProrationMode(replaceSkusProrationMode)
            .build()
    int responseCode = billingClient.launchBillingFlow(activity, flowParams);
    

下記の表に、すべての比例配分モードを示します。

IMMEDIATE_WITH_TIME_PRORATION 切り替えは直ちに有効になり、新しい有効期限が比例配分され、ユーザーへの入金または請求が行われます。これが現在のデフォルトの動作です。
IMMEDIATE_AND_CHARGE_PRORATED_PRICE 切り替えは直ちに有効になりますが、請求期間は変わりません。残りの期間の価格に対する請求が行われます。

: このオプションは定期購入のアップグレードでのみ利用可能です。

IMMEDIATE_WITHOUT_PRORATION 切り替えは直ちに有効になり、新しい価格が次回契約期間に請求されます。請求サイクルは変わりません。
DEFERRED 切り替えは次回契約期間に有効になります。

各モードの仕組みを理解するために、次の事例について考えてみましょう。

あるユーザーが「Country Gardener」というアプリのオンライン コンテンツの定期購入をしているとします。現在の登録は、そのコンテンツの Tier 1 バージョンの月契約です(コンテンツはテキストのみ)。月額は 200 円で毎月 1 日に契約が更新されます。

4 月 15 日に、Tier 2 の定期購入にアップグレードすることにし(動画のアップデートも含む)、月額 300 円になりました。

デベロッパーは定期購入のアップグレードに、比例配分モードを選択しています。次の一覧は、各比例配分モードがユーザーの定期購入にどのように影響するかを示しています。

  • IMMEDIATE_WITH_TIME_PRORATION - このモードを使用すると、ユーザーの Tier 1 の定期購入は直ちに終了します。1 か月分(4 月 1~30 日)をすでに支払っていますが、半分しか使っておらず、定期購入分の残り半分(100 円)は新たな定期購入に適用されます。ただし、新たな登録は月 300 円のため、100 円のクレジット残高は 10 日分にしかなりません。よって、このユーザーのクレジットは、4 月 15~25 日の分に当てられます。4 月 26 日に、新たな定期購入分の 300 円が課金され、次の 300 円は翌月以降の毎月 26 日に課金されます。
  • IMMEDIATE_AND_CHARGE_PRORATED_PRICE - このモードを使用すると、ユーザーの Tier 1 の定期購入は直ちに終了します。1 か月分(4 月 1~30 日)をすでに支払っていますが、半分しか使っておらず、定期購入分の残り半分(100 円)は新たな定期購入に適用されます。ただし、新たな登録は月 300 円のため、残りの 15 日分の価格は 150 円になります。そのため、新たな定期購入の差分 50 円が課金され、次の 300 円は翌月以降の毎月 1 日に課金されます。
  • IMMEDIATE_WITHOUT_PRORATION - このモードを使用すると、ユーザーの Tier 1 の定期購入は直ちに追加料金なしで Tier 2 にアップグレードされます。新たな定期購入の 300 円は 5 月 1 日に課金され、次の 300 円は翌月以降の毎月 1 日に課金されます。
  • DEFERRED - このモードを使用すると、ユーザーの Tier 1 の定期購入は 4 月 30 日に有効期限が切れるまで続きます。5 月 1 日に Tier 2 の定期購入が有効になり、ユーザーに新たな階層の定期購入の 300 円が課金されます。

再度定期購入を可能にする

定期購入がまだ期限切れになっていなくても、ユーザーは解約された定期購入を再度定期購入できます。解約された定期購入に同じアプリ内アイテムの購入フローを適用することで(同じアイテム ID を使用)、アプリ内で再定期購入を許可することができます。詳しくは、アプリ内アイテムの購入を有効にするをご覧ください。

新しい定期購入は以前の定期購入を置き換え、同じ有効期限に更新されます。たとえば、あるユーザーが「Example Music App」というアプリの定期購入をしていたとします。現在の定期購入が 8 月 1 日に切れるため、7 月 10 日に同じ月額で 1 か月分再度定期購入しました。新しい定期購入は残りのクレジットで比例配分され、すぐに有効になり、8 月 1 日に更新されます。

デベロッパーは再度定期購入に向けて、適切な UI を表示する必要があります。

  • アクティブな定期購入をしていないユーザーには、アプリで [購入] ボタンを表示します。
  • 解約された定期購入があるユーザー(SUBSCRIPTION_CANCELLED)には、アプリで [再度定期購入] ボタンを表示します。詳しくは、SUBSCRIPTION_CANCELLED を処理する方法についての章をご覧ください。

購入トークンを受け取ったら、新しい購入トークンの確認に使用するのと同じ確認手続きを行います。詳しくは、購入を確認するをご覧ください。Google Play Developer API は定期購入のリソースで linkedPurchaseToken を返しますが、サービスへのアクセスに以前のトークンが使用されないように、linkedPurchaseToken で提供されるトークンは必ず無効にしてください。

定期購入の料金を払い戻す

Google Play では、定期購入の払い戻し期間は設けられていません。代わりに、ユーザーは払い戻しを直接要求する必要があります。ユーザーは Play ストアの [ご注文履歴] ページを使用するか、デベロッパーに直接問い合わせて払い戻しを要求できます。

払い戻しのリクエストを受け取った場合、デベロッパーは Google Play Developer API または Merchant Center を使用して以下を行います。

  1. 定期購入を解約します(Purchases.subscriptions:cancel)。
  2. 定期購入がすでに解約されていることを確認します(HTTP レスポンス コード 200 が返されます)(Purchases.subscriptions:cancel)。
  3. 定期購入を解約せずにユーザーのお支払い金額を払い戻します(Purchases.subscriptions:refund)。

直近のお支払い以前の分まで返金する場合には、Merchant Center で追加の返金処理をします。

定期購入が解約されると、SUBSCRIPTION_CANCELLED ステータスが安全なバックエンド サーバーに送信されます。SUBSCRIPTION_CANCELLED を処理するには、SUBSCRIPTION_CANCELLED を処理する方法についての章をご覧ください。

定期購入を取り消す

Google Play Developer API で、デベロッパーは Purchases.subscriptions:revoke を使って定期購入を取り消すことができます。定期購入を取り消すと、直ちに定期購入にアクセスできなくなります。定期購入の取り消しは、通常、デベロッパーや Google によって不正行為が疑われる場合に行われます。

定期購入を解約する

ユーザーは Play ストア アプリから定期購入を解約することもできます。Google Play Developer API で、デベロッパーは Purchases.subscriptions:cancel を使って定期購入を解約することもできます。

注: この API は通常、ユーザーが [マイオーダー] ページから払い戻しを要求したときに使用されます。詳しくは、定期購入の料金を払い戻すをご覧ください。

ユーザーは現在の請求期間が終了するまで、コンテンツに引き続きアクセスできます。請求期間が終了すると、アクセスできなくなります。

重要: ユーザーにコンテンツの利用資格がある間は、Google Play から定期購入を削除しないでください。ユーザーに権利のあるコンテンツを削除すると、ペナルティが発生します。詳しくは、定期購入の作成の「解約」の章をご覧ください。

定期購入を再開する

注: 2019 年 4 月 15 日以降、すべてのアプリで一貫したユーザー エクスペリエンスを確保するために、Google は定期購入を有効にしているすべてのデベロッパーに対して再開機能をデフォルトで有効にしています。再開を適切に処理できることを確認するために、この日付より前に再開機能をテストすることを強くおすすめします。簡単に移行できるよう、Google はすべてのライセンス テスト アカウントの再開を有効にしました。定期購入のテストについて詳しくは、定期購入固有の機能をテストするをご覧ください。

コードを変更する必要があり、2019 年 4 月 15 日までに変更を完了できない場合は、Google Play Console でオプトアウトするため [ストアでの表示] > [アプリ内アイテム] > [定期購入の設定] に移動し、[ユーザーが Google Play で定期購入を再開することを許可します] チェックボックスをオフにします。また、2019 年 4 月 15 日に変更が有効になった後で、オプトアウトすることもできます。

解約された定期購入は、有効期限まで Play ストア アプリに表示されたままになります。ユーザーは有効期限が切れる前に、Play ストア アプリの [アカウント] > [定期購入] で [再開] をクリックして解約された定期購入を再開できます。

図 4. Play ストア アプリの [アカウント] > [定期購入]

定期購入がいつ再開されたかを知るには、次の 2 つの方法があります。

  1. アプリに SUBSCRIPTION_RESTARTED 通知が届きます。詳しくは、リアルタイム デベロッパー通知をご覧ください。
  2. アプリを開くたびに、getPurchases() メソッドを呼び出すことができます。定期購入が再開されると、purchaseToken は定期購入が解約される前のものと同じになります。

ユーザーが解約された定期購入を再開できるようにするには:

  1. Google Play Console にログインします。
  2. アプリを選択して、[ストアでの表示] > [アプリ内アイテム] に移動します。
  3. [定期購入] タブを選択し、[定期購入の設定] を展開します。
  4. 図 5 に示すように、[ユーザーが Google Play で定期購入を再開することを許可します] チェックボックスをオンにし、[保存] をクリックします。
    図 5. Google Play Console の [ユーザーが Google Play で定期購入を再開することを許可します] チェックボックス

課金を延期する

Google Play Developer API で、デベロッパーは Purchases.subscriptions:defer を使用して定期購入ユーザーの次の課金日を延期することができます。ユーザーのコンテンツへの定期購入登録は継続され、アクセスも完全に保持されますが、延期期間中には課金されません。定期購入の更新日は、新しい日付を反映して更新されます。 課金を延期することで、次のことが可能になります。

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

課金の延期は API 呼び出し 1 回あたり、最短で 1 日、最長で 1 年間です。さらに延期するには、次回請求日の前に再度 API を呼び出せます。

例として、あるユーザーが「Fishing Quarterly」というアプリのオンライン コンテンツを月契約で定期購入しているとします。普段は毎月 1 日に、125 円を支払っています。3 月に、アプリのパブリッシャーからのオンライン調査に回答しました。パブリッシャーは謝礼として 6 週間分を無料にし、次のお支払いを 5 月 15 日まで延期することにしました(予定されていた次回請求日 4 月 1 日の 6 週間後)。このユーザーは 4 月 1 日と 5 月 1 日には課金されませんが、通常どおりコンテンツにはアクセスできます。5 月 15 日には、これまでどおり 125 円が定期購入料金として課金されます。次の更新日は、6 月 15 日になります。

請求日が延期された(変更された)ことをユーザーに知らせるために、ユーザーに通知する(メールを使用するかアプリ内で表示する)ことができます。

お客様に解約を思いとどまらせる

長期利用の後、お客様がサービスを解約された場合は、「再獲得 SKU」とも呼ばれる定期購入の特別価格が設定されたアイテム ID を提供することができます。アプリに特典を提示するか、ユーザーに特典をメールで通知することができます。再獲得のための定期購入を開始するには、Google Play Billing Library を使用して Android アプリで購入フローを開始します。これは新しい定期購入と同じプロセスですが、デベロッパーはユーザーが利用できる SKU を決定できます。

最新のニュースとリソース

次の手順

定期購入固有の機能を追加したら、おすすめの設定についてのページに進んでください。