日常業務の一環として、定期購入または 1 回限りの購入に対して管理アクションが必要になる場合があります。たとえば、カスタマー サービスがユーザーに全額払い戻しまたは一部払い戻しを行う必要がある場合や、特定のケースで利用資格を取り消す必要がある場合などです。注文は Google Play Console から管理できます。独自のシステムから管理する場合は、 Google Play Developer API を使用して管理できます。
定期購入を解約する
定期購入の解約は、ユーザーまたはデベロッパーが開始できます。
ユーザーが開始した解約
ユーザーは、Google Play ストアを使用して、いつでも Google Play の定期購入を解約できます。該当する場合は、アプリとウェブサイトでユーザーが定期購入を解約できるオプションも提供する必要があります。
ユーザーが自発的に解約できるようにする最も簡単な方法は、アプリから Google Play ストア へのディープリンクを 提供することです。ユーザーは、Google Play ストアで定期購入を 表示して管理できます。
デベロッパーが開始した解約
デベロッパーは、バックエンドから解約をトリガーする必要がある場合もあります。
purchases.subscriptions.cancel
API を使用すると、定期購入を解約できます。
たとえば、このメソッドを使用して、従来のサービスを停止できます。
定期購入を解約しても払い戻しは行われず、ユーザーは現在の請求対象期間が終了するまでアクセス権を保持します。
このメソッドを使用すると、cancellationType リクエスト本文パラメータで次のタイプの解約を指定できます。
USER_REQUESTED_STOP_RENEWALS: ユーザーが Google Play ストアから解約した場合と同様に、定期購入を解約します。分割払いは、現在の契約期間の残りの期間も継続されます。Google Play ストアでは、定期購入の有効期限が切れる前に再開できます。また、基本プランで有効になっている場合は、有効期限が切れた後に再度定期購入することもできます。
DEVELOPER_REQUESTED_STOP_PAYMENTS: 定期購入を解約し、 以降の支払いを停止します。ユーザーは Google Play ストアから定期購入を再開または再度定期購入することはできませんが、アプリ内で再度定期購入できるようにすることはできます。
有効期限が切れていない定期購入をユーザーが再開できるようにする
デベロッパーとして解約をトリガーした後、有効期限が切れていない定期購入をユーザーが Google Play 定期購入センターから再開できるようにすると便利な場合があります。たとえば、カスタマイズされたアプリ内解約フローを提供する場合などです。ビジネス ロジックに基づいて、バックエンドからトリガーされた解約をユーザーが再開できるようにするかどうかを決定できます。
ユーザーが解約を再開できることを示すには、POST リクエスト
を purchases.subscriptions.cancel API に発行し、cancellationType
リクエスト パラメータを USER_REQUESTED_STOP_RENEWALS 値に設定します。
例:
- 定期購入
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_RENEWALS"
}
有効期限が切れた定期購入をユーザーが再度定期購入できるようにする
有効期限が切れた定期購入を再度定期購入できるようにするには、定期購入の基本プランで [再度定期購入] オプションを 有効
にしてから、
cancellationType パラメータを USER_REQUESTED_STOP_RENEWALS 値に設定して定期購入を解約する必要があります。
アプリ内でのみユーザーが再度定期購入できるようにする
cancellationType パラメータを DEVELOPER_REQUESTED_STOP_PAYMENTS
に設定した場合、または cancellationType パラメータを設定していない場合、ユーザーは Google Play
定期購入センターから定期購入を再開できません。ただし、必要に応じて、ユーザーはアプリから再度定期購入に申し込むことができます。
このアクションを行うと、SUBSCRIPTION_CANCELED リアルタイム
デベロッパー通知がトリガーされます。これらの解約は、
解約の説明に沿って処理してください。
課金を延期する
subscriptionsv2.defer メソッドを使用すると、定期購入の利用資格期間を延長できます。アドオンを含む定期購入を延期すると、定期購入のすべてのアイテムが同じ期間だけ延期されます。延期期間中、ユーザーはコンテンツの定期購入を継続できますが、追加料金は請求されません。定期購入の課金を延期すると、ステータス情報が更新され、購入ステータス情報の
expiryTime フィールドに反映されます。
- 有効な定期購入の場合、課金を延期すると次回の更新日が延長されます。
- プリペイド プランの場合、課金を延期すると有効期限が延長されます。
課金を延期する例をいくつか示します。
- 特別な特典として、ユーザーに無料アクセスを提供します。たとえば、既存の定期購入者がフィードバック アンケートに回答した場合、1 週間無料にします。
- カスタマー ケアの一環として、ユーザーに無料アクセスを提供します。たとえば、サービスの使用に影響する可能性のある長時間の停止が発生した場合などです。
課金の延期は、API 呼び出し 1 回あたり最短で 1 日、最長で 1 年間です。 利用資格の終了をさらに延期するには、新しい有効期限が切れる前に再度 API を呼び出します。
このアクションを行うと、SUBSCRIPTION_DEFERRED リアルタイム
デベロッパー通知がトリガーされます。これらのイベントの処理方法については、定期購入についての定期購入者の課金を延期するをご覧ください。
例:
FitnessGoals ストリーミング サービスは、2 月に定期的な運動を促すプロモーションを実施したいと考えています。
2 月中に FitnessGoals で 10 回以上運動した定期購入者には、1 か月分のサービスを追加で提供することにしました。
チャレンジの結果を追跡し、3 月 1 日に、2 月にチャレンジを達成したユーザーの有効な定期購入に対して subscriptionsv2.defer メソッドを呼び出します。
これらのユーザーは、1 か月分の定期的な運動動画を無料で利用できます。また、FitnessGoals が健康維持に役立つことを友達に伝えます。
払い戻しと取り消しを行う
定期購入または 1 回限りの購入に対して払い戻しを行う場合や、アクセス権を取り消す場合は、さまざまな状況が考えられます。
注文 ID で注文の全額払い戻しを行う
orders.refund
API を使用すると、購入から 3 年以内の注文に対して全額払い戻しを行うことができます。
orders.refund
メソッドは、払い戻しに加えてアクセス権を取り消すかどうかを示す取り消しパラメータを受け取ります。
定期購入の払い戻し呼び出しで取り消しを行うと、定期購入は直ちに終了し、SUBSCRIPTION_REVOKED リアルタイム
デベロッパー通知がトリガーされます。これらのイベントの処理方法については、定期購入ライフサイクル管理
ガイドの取り消しセクション
をご覧ください。
例:
新しいワールドカップの開幕を記念して、e スポーツアプリ Football-Not-Soccer は、最初の 24 時間以内に新しいチームキットを購入したすべてのユーザーに、無料の仮想ジャージを抽選でプレゼントすることにしました。
Football-Not-Soccer は、取り消しパラメータを渡さずに
orders.refundAPI を使用して、ジャージの購入代金を 当選者に払い戻します。
購入トークンで定期購入を取り消して払い戻す
ユースケースによっては、ユーザーの定期購入へのアクセス権を取り消して払い戻しを行う必要がある場合があります。Google Play 請求サービスでは、全額払い戻しや日割り払い戻しなどの取り消し方法をsubscriptionsv2.revokeAPI を使用して提供しています。このエンドポイントでは、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": {}を払い戻しタイプとして設定します。
例:
マリアは、SuperMovies ストリーミングの月額プランの 30 日間の自動更新定期購入を利用しています。マリアは、コンテンツにアクセスできないという技術的な問題に遭遇しました。請求サイクルの 3 日目にカスタマー サービスに連絡し、定期購入にアクセスできないと伝えました。
カスタマー サービスは、システムでマリアの定期購入の詳細を確認し、
purchases.subscriptionsv2.revoke全額払い戻しをリクエストする呼び出しをトリガーします。カスタマー サービスは、マリアに定期購入料金の 100% が払い戻され、プランの定期購入は終了したことを伝えます。
日割り払い戻し
定期購入を終了し、残りの利用資格期間を一部払い戻す必要がある場合は、日割り払い戻しを行います。
purchases.subscriptionsv2.revoke
関数を使用し、"proratedRefund": {}を払い戻しタイプとして設定します。
例:
マリアは、SuperMovies ストリーミングの月額プランの 30 日間の自動更新定期購入を利用しています。しばらくの間、サービスを快適に利用していました。 請求期間の 15 日目にカスタマー サービスに連絡し、海外に引っ越すため、翌日からサービスを利用できなくなると伝えました。
カスタマー サービスは、システムでマリアの定期購入の詳細を確認し、日割り払い戻しをリクエストする
purchases.subscriptionsv2.revokeの呼び出しをトリガーします。カスタマー サービスは、マリアに定期購入料金の約 50% が払い戻され、サービスへのアクセス権が直ちに終了したことを伝えます。