定期購入と 1 回だけの購入を管理する

日常業務の一環として、定期購入や 1 回限りの購入に対する管理アクションが必要になることがあります。たとえば、ユーザーに全額または一部の払い戻しを行う必要がある場合や、特定のケースで利用資格を取り消す必要がある場合があります。Google Play Console から注文を管理できます。また、独自のシステムから管理する場合は、Google Play Developer API を使用して管理できます。

定期購入を解約する

定期購入の解約は、ユーザーまたはデベロッパーが開始できます。

お客様によるキャンセル

Google Play の定期購入は、Google Play ストアからいつでも解約できます。該当する場合は、アプリとウェブサイトでユーザーが定期購入を解約できるオプションも提供する必要があります。

ユーザーが自主的に解約できるようにする最も簡単な方法は、アプリ内に Google Play ストアへのディープリンクを設定することです。これにより、ユーザーは定期購入を表示して管理できます。

デベロッパーが開始したキャンセル

デベロッパーは、バックエンドから解約をトリガーする必要がある場合もあります。purchases.subscriptions.cancel API を使用すると、定期購入をキャンセルできます。たとえば、このメソッドを使用して、以前のサービスを停止できます。定期購入を解約しても払い戻しは行われず、ユーザーは現在の請求期間が終了するまでアクセスできます。

このメソッドを使用すると、cancellationType リクエスト本文パラメータで次の種類のキャンセルを指定できます。

  • USER_REQUESTED_STOP_RENEWALS: ユーザーが Play ストアから解約したかのように定期購入を解約します。分割払いは、現在のコミットメント期間の残りの期間も継続されます。ユーザーは、Play ストアから、定期購入の有効期限が切れる前に再開したり、有効期限が切れた後に(基本プランで有効になっている場合)再度定期購入したりできます。

  • DEVELOPER_REQUESTED_STOP_PAYMENTS: 定期購入を解約し、以降の支払いをすべて停止します。ユーザーは Google Play ストアから定期購入を復元したり、再度定期購入したりすることはできませんが、アプリ内で再度定期購入できるようにすることは可能です。

ユーザーが有効期限内の定期購入を再開できるようにする

デベロッパーとして解約をトリガーした後で、ユーザーが Google Play 定期購入センターから有効期限が切れていない定期購入を復元できるようにすると便利な場合があります。たとえば、カスタマイズされたアプリ内解約フローを提供できます。ビジネス ロジックに基づいて、バックエンドからトリガーされたどのキャンセルをユーザーが復元できるかを決定できます。

ユーザーが解約を復元できることを示すには、purchases.subscriptions.cancel API に POST リクエストを発行し、cancellationType リクエスト パラメータを USER_REQUESTED_STOP_RENEWAL 値に設定します。

例:

  • 定期購入 1a2b3c4d5e6f7g8h9i0j の購入トークン
  • アプリケーション パッケージ名 com.your.app
  • サブスクリプション ID your-subscription-product

HTTP POST リクエスト:

https://androidpublisher.googleapis.com/androidpublisher/v3/applications/com.your.app/purchases/subscriptions/your-subscription-product/tokens/1a2b3c4d5e6f7g8h9i0j:cancel

リクエストの本文:

{
  "cancellationType": "USER_REQUESTED_STOP_RENEWAL"
}

期限切れの定期購入をユーザーが再開できるようにする

有効期限が切れた定期購入の再購入を許可するには、定期購入の基本プランで [再度定期購入] オプションを有効にしてから、cancellationType パラメータを USER_REQUESTED_STOP_RENEWAL 値に設定して定期購入を解約する必要があります。

ユーザーがアプリ内でのみ再登録できるようにする

cancellationType パラメータを DEVELOPER_REQUESTED_STOP _PAYMENTS に設定している場合、または cancellationType パラメータを設定していない場合、ユーザーは Google Play 定期購入センターから定期購入を復元できません。ただし、ユーザーは必要に応じてアプリから定期購入に再度登録できます。

この操作を行うと、SUBSCRIPTION_CANCELED リアルタイム デベロッパー通知がトリガーされます。これらの解約は、解約の説明に沿って処理します。

課金を延期する

subscriptionsv2.defer メソッドを使用すると、定期購入の利用資格期間を延長できます。アドオンを含む定期購入を延期すると、定期購入のすべてのアイテムが同じ期間だけ延期されます。延期期間中、ユーザーはコンテンツの定期購入を継続できますが、延長期間の料金は請求されません。定期購入の請求を延期すると、ステータス情報がそれに応じて更新され、購入ステータス情報の expiryTime フィールドに反映されます。

  • 有効な定期購入の請求を延期すると、次回の更新日が延長されます。
  • プリペイド プランの場合、請求の延期により有効期限が延長されます。

延期請求の利用例を次に示します。

  • 特別優待の一環として、既存の定期購読者がフィードバック アンケートに回答した場合に 1 週間の無料期間を設けるなど、無料アクセス権を付与する。
  • お客様のサービス利用に影響を及ぼす可能性のある長時間のサービス停止の後など、お客様対応の一環として、お客様に無料アクセス権を付与します。

課金の延期は、API 呼び出し 1 回あたり最短で 1 日、最長で 1 年間です。利用資格の終了をさらに延期するには、新しい有効期限が切れる前に再度 API を呼び出します。

この操作を行うと、SUBSCRIPTION_DEFERRED リアルタイム デベロッパー通知がトリガーされます。これらのイベントの処理方法については、サブスクリプションについて定期購入者の請求を延期するをご覧ください。

例:

  1. FitnessGoals ストリーミング サービスは、2 月に定期的な運動を促すプロモーションを実施したいと考えています。

  2. 2 月中に FitnessGoals を使って 10 回以上エクササイズしたすべてのユーザーに、1 か月間のサービスを追加で提供することにしました。

  3. チャレンジの結果を追跡し、3 月 1 日に、2 月にチャレンジを達成したユーザーに属する有効な定期購入ごとに subscriptionsv2.defer メソッドを呼び出します。

  4. これらのユーザーは、通常の運動動画を 1 か月間無料で利用できるため、FitnessGoals が健康維持に役立っていることを友達に伝えます。

払い戻しと取り消しを行う

定期購入または 1 回限りの購入の払い戻しやアクセス権の取り消しが必要になる状況は数多くあります。

注文 ID で注文の全額払い戻しを行う

orders.refund API を使用すると、購入から 3 年以内の注文に対して全額払い戻しを行うことができます。orders.refund メソッドは、払い戻しに加えてアクセス権を取り消すかどうかを示す取り消しパラメータを受け取ります。

定期購入の購入に対する払い戻し呼び出しで取り消しを発行すると、定期購入は直ちに終了し、SUBSCRIPTION_REVOKED リアルタイム デベロッパー通知がトリガーされます。これらのイベントの処理方法については、定期購入のライフサイクル管理ガイドの取り消しセクションをご覧ください。

例:

  1. 新しいワールドカップの開幕を記念して、e スポーツアプリ Football-Not-Soccer は、最初の 24 時間以内に新しいチームキットを購入したすべてのユーザーに、無料のバーチャル ジャージを抽選でプレゼントすることにしました。

  2. Football-Not-Soccer は、取り消しパラメータを渡さずに orders.refund API を使用して、優勝者にジャージの購入代金を払い戻します。

購入トークンで定期購入を取り消して払い戻す

ユースケースによっては、ユーザーの定期購入へのアクセス権を取り消して払い戻しを行う必要があります。Play Billing では、subscriptionsv2.revoke API を通じて、全額払い戻しや日割り計算での払い戻しなどの特典取り消し方法を提供しています。このエンドポイントでは、revocationContext を指定して、払い戻し額の計算方法を決定できます。

この操作を行うと、SUBSCRIPTION_REVOKED リアルタイム デベロッパー通知がトリガーされます。アプリでは取り消しの説明に沿って、これらの解約を処理する必要があります。

例:

  • 購入トークン 1a2b3c4d5e6f7g8h9i0j で購入
  • パッケージ名 com.your.app のアプリ
  • 日割り計算による払い戻しを行う目的

HTTP POST リクエスト:

https://androidpublisher.googleapis.com/androidpublisher/v3/applications/com.your.app/purchases/subscriptionsv2/tokens/1a2b3c4d5e6f7g8h9i0j:revoke

リクエストの本文:

{
  "revocationContext": {
    "proratedRefund": {}
  }
}

全額払い戻し

定期購入を解約し、現在の請求対象期間の全額を払い戻す必要がある場合は、全額払い戻しを行います。purchases.subscriptionsv2.revoke 関数を使用して、払い戻しタイプとして "fullRefund": {} を設定します。

例:

  1. マリアは、SuperMovies ストリーミングの月額プランの 30 日間の自動更新サブスクリプションを利用しています。Maria は、コンテンツにアクセスできないという技術的な問題に直面しました。請求サイクルの 3 日目に、定期購入にアクセスできないという連絡がカスタマー サービスにありました。

  2. カスタマー サービスは、システムで Maria さんの定期購入の詳細を確認し、purchases.subscriptionsv2.revoke に全額払い戻しをリクエストする呼び出しをトリガーします。

  3. カスタマー サービスは、サブスクリプション料金の 100% が払い戻され、プランのサブスクリプションは終了したことを Maria に伝えます。

払い戻しを日割り計算する

定期購入を終了し、残りの利用期間に対して一部払い戻しを行う必要がある場合は、日割り計算による払い戻しを行います。purchases.subscriptionsv2.revoke 関数を使用して、払い戻しタイプとして "proratedRefund": {} を設定します。

例:

  1. マリアは、SuperMovies ストリーミングの月額プランの 30 日間の自動更新サブスクリプションを利用しています。彼女はしばらくの間、このサービスを快適に利用していました。マリアさんは、請求期間の 15 日目にカスタマー サービスに連絡し、海外に引っ越すため、翌日からサービスを利用できなくなると伝えました。

  2. カスタマー サービスは、システムで Maria の定期購入の詳細を確認し、purchases.subscriptionsv2.revoke への呼び出しをトリガーして、日割り計算による払い戻しをリクエストします。

  3. カスタマー サービスは、定期購入料金の約 50% が払い戻され、サービスへのアクセスが直ちに終了することを Maria に伝えます。