日常業務の一環として、定期購入や 1 回限りの購入に対して管理アクションが必要になることがあります。たとえば、ユーザーに全額または一部の払い戻しを行う必要がある場合や、特定のケースで利用資格を取り消す必要がある場合があります。Google Play Console から注文を管理することも、独自のシステムから管理する場合は Google Play Developer API を使用することもできます。
定期購入を解約する
定期購入の解約は、ユーザーまたはデベロッパーが開始できます。
ユーザーによる解約
ユーザーは 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 定期購入センターから有効期限が切れていない定期購入を復元できるようにすると便利なことがあります。たとえば、カスタマイズされたアプリ内解約フローを提供できます。ビジネス ロジックに基づいて、バックエンドからトリガーされたどの解約をユーザーが復元できるかを決定できます。
ユーザーが解約を復元できることを示すには、purchases.subscriptions.cancel API に POST リクエストを発行し、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 を使用して、優勝者にジャージの購入代金を払い戻します。
購入トークンで定期購入を取り消して払い戻す
特定のユースケースでは、ユーザーの定期購入へのアクセスを取り消して払い戻しを行う必要がある場合があります。Play 請求サービスでは、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": {} を設定します。
例:
マリアは、SuperMovies ストリーミングの月額プランの 30 日間の自動更新サブスクリプションを利用しています。Maria は、コンテンツにアクセスできないという技術的な問題に直面しています。請求サイクルの 3 日目に、サブスクリプションにアクセスできないという連絡がカスタマー サービスにありました。
カスタマー サービスは、システムで Maria さんの定期購入の詳細を確認し、
purchases.subscriptionsv2.revokeに全額払い戻しをリクエストするようトリガーします。カスタマー サービスは、サブスクリプション料金の 100% が払い戻され、プランのサブスクリプションは解約されたと Maria に伝えます。
払い戻しを日割り計算する
定期購入を終了し、残りの利用期間の一部を払い戻す必要がある場合は、日割り計算で払い戻しを行います。purchases.subscriptionsv2.revoke 関数を使用して、払い戻しタイプとして "proratedRefund": {} を設定します。
日割り計算による払い戻しは、自動更新される定期購入と、期間が 1 週間以上のプリペイド プランの両方でサポートされています。
例:
マリアは、SuperMovies ストリーミングの月額プランの 30 日間の自動更新サブスクリプションを利用しています。彼女はしばらくの間、このサービスを快適に利用していました。マリアさんは、請求期間の 15 日目にカスタマー サービスに連絡し、海外に引っ越すため、翌日からサービスを利用できなくなることを伝えました。
カスタマー サービスは、システムで Maria の定期購入の詳細を確認し、
purchases.subscriptionsv2.revokeへの呼び出しをトリガーして、日割り計算による払い戻しをリクエストします。カスタマー サービスは、定期購入料金の約 50% が払い戻され、サービスへのアクセスが直ちに終了することを Maria に伝えます。