定期購入と 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 リアルタイム デベロッパー通知がトリガーされます。これらの解約は、解約の説明に沿って処理します。

課金を延期する

subscriptions.defer を使用して、サブスクリプションの利用資格期間を延長します。延期期間中、ユーザーはコンテンツの定期購入を継続できますが、延長期間分の料金は請求されません。定期購入の請求を延期すると、ステータス情報が更新され、購入ステータス情報の expiryTime フィールドに反映されます。

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

請求の延期を活用する例をいくつか示します。

  • 特別な特典として、既存の定期購読者にフィードバック アンケートを記入すると 1 週間無料になるなど、ユーザーに無料アクセス権を付与する。
  • サービスが長時間停止し、お客様のサービス利用に影響した可能性がある場合など、カスタマーケア対応としてお客様に無料アクセス権を付与します。

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

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

例:

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

  2. 2 月中に FitnessGoals で 10 回以上エクササイズした定期購入者に、1 か月分の追加サービスを提供することにしました。

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

  4. これらのユーザーは、通常のエクササイズ動画を 1 か月間無料で追加で視聴できます。また、FitnessGoals が健康維持に役立つと、すべての友人に伝えています。

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

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

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

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

定期購入の払い戻し呼び出しで取り消しを実行すると、定期購入は直ちに解約され、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 日間の定期購入を利用しています。マリアは技術的な問題が発生してコンテンツにアクセスできない状態です。請求サイクルの 3 日目に、定期購入にアクセスできないとカスタマー サービスに連絡してきました。

  2. カスタマー サービスは、システムでマリアの定期購入の詳細を見つけ、purchases.subscriptionsv2.revoke への呼び出しをトリガーして全額払い戻しをリクエストします。

  3. カスタマー サービスは、サブスクリプションの料金の 100% が払い戻され、プランの定期購入は解約されるはずだとマリアに伝えます。

日割り計算での払い戻し

定期購入を解約し、残りの利用資格期間の一部を払い戻す必要がある場合は、案分払い戻しを行います。purchases.subscriptionsv2.revoke 関数を使用して、払い戻しの種類として "proratedRefund": {} を設定します。

例:

  1. マリアは、SuperMovies ストリーミングの月額プランの自動更新 30 日間の定期購入を利用しています。お客様は、このサービスを長い間、満足して使用しています。マリアは請求サイクルの 15 日目にカスタマー サービスに連絡し、海外に転居するため、翌日からサービスを利用できなくなると伝えます。

  2. カスタマー サービスは、システムでマリアの定期購入の詳細を見つけ、purchases.subscriptionsv2.revoke への呼び出しをトリガーして、按分払い戻しをリクエストします。

  3. カスタマー サービスは、定期購入料金の約 50% が払い戻され、サービスの利用が直ちに停止されることをマリアに伝えます。