日常業務の一環として、定期購入や 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 メソッドは、払い戻しに加えてアクセスを取り消すかどうかを示す revoke パラメータを受け取ります。
定期購入の払い戻し呼び出しで取り消しを発行すると、定期購入はすぐに終了し、SUBSCRIPTION_REVOKED リアルタイム デベロッパー通知と VoidedPurchaseNotification(Voided Purchases API に記録)の両方がトリガーされます。これらのイベントの処理方法については、定期購入のライフサイクル管理ガイドの取り消しセクションをご覧ください。
例:
新しいワールドカップの開幕を記念して、e スポーツアプリ Football-Not-Soccer は、最初の 24 時間以内に新しいチームキットを購入したすべてのユーザーに、無料のバーチャル ジャージを抽選でプレゼントすることにしました。
Football-Not-Soccer は、取り消しパラメータを渡さずに
orders.refundAPI を使用して、優勝者にジャージの購入代金を払い戻します。
購入トークンでサブスクリプションを取り消して払い戻す
特定のユースケースでは、ユーザーの定期購入へのアクセスを取り消して払い戻しを行う必要があります。Google Play 請求サービスでは、subscriptionsv2.revoke API を通じて、全額払い戻しや日割り払い戻しなどの取り消し方法を提供しています。このエンドポイントでは、revocationContext を指定して、払い戻しの計算方法を決定できます。
この操作を行うと、SUBSCRIPTION_REVOKED リアルタイム デベロッパー通知と VoidedPurchaseNotification の両方がトリガーされ、Voided Purchases API に記録されます。アプリでは取り消しの説明に沿って、これらの解約を処理する必要があります。
例:
- 購入トークン
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": {} を設定します。
日割り計算による払い戻しは、自動更新の定期購入と、1 週間以上の期間のプリペイド プランの両方でサポートされています。
例:
マリアさんは、SuperMovies の 30 日間の自動更新サブスクリプション(月額プラン)に加入しています。彼女はしばらくの間、このサービスを快適に利用していました。マリアさんは、請求期間の 15 日目にカスタマー サービスに連絡し、海外に転居するため、翌日からサービスを利用できなくなると伝えました。
カスタマー サービスは、システムで Maria さんの定期購入の詳細を確認し、
purchases.subscriptionsv2.revokeを呼び出して、日割り計算による払い戻しをリクエストします。カスタマー サービスは、Maria に定期購入料金の約 50% が払い戻され、サービスへのアクセスが直ちに終了することを伝えます。