ハコヅミを作る #76:有料プランを休止できるようにする(冬は止めておける、払った分は再開で引く)
#75 で、支払いが失敗したときの扱いを作りました。今回は、有料プランの休止です。
- なぜ休止を作るか
- 休止と凍結は、別のもの
- 決めておかなかった3つ
- 調べてから決める
- ボタンは、ハコヅミに作る
- 時計を2か月進める
- 再開すると、¥0 の請求
なぜ休止を作るか
キャンプには、季節があります。冬はほとんど行かない、という人も多いと思います。
その季節にも毎月払うのは、もったいない。でも、解約すると、春にまた申し込み直すことになります。そこで、契約は残したまま、支払いだけを止められる「休止」を作ることにしました(#72 で決めた)。
休止のあいだは、無料のプランと同じ扱いです。登録した内容と画像は消えません。新しく画像を付けられるのが、無料のプランの上限までになるだけです。
休止と凍結は、別のもの
ハコヅミには、前から「凍結」があります。規約に反したときなどに、管理者がアカウントを止めるものです。凍結されると、アプリそのものが使えなくなります。
休止は、本人が自分で選ぶものです。アプリは今までどおり使えて、有料の分が無料のプランの扱いになるだけです。
名前が似ているので、同じしくみで作りたくなります。でも、意味がまったく違うので、別のものとして作る、と前から決めてありました。今回も、凍結の印とは別に、Stripe の契約の状態(休止中)で見分けています。
決めておかなかった3つ
Issue を書いたときに、わざと決めずに、「作るときに決める」としておいたことが3つありました。
- 休止を、押したときから効かせるか、払った期間の終わりから効かせるか
- 再開したときの支払いは、どうなるか
- 休止の長さに、上限を付けるか
どれも、Stripe でどこまでできるかが分からないと決められません。先に決めても、できなければ決め直しになります。
調べてから決める
/implement 351 で取りかかると、Claude Code は、実装の前に、Stripe のパッケージに入っている一時停止のしくみを調べて、こう報告してきました。
- 一時停止は、押したときにすぐ止まる。「払った期間の終わりから」という指定はない
- そのかわり、払った期間の残りの日数を、次の請求から引く(クレジットにする)ことはできる
- 再開すると、その日から新しい1か月が始まり、その日に払うのが既定
- 一時停止には、自動で再開する日を付ける機能がない
そのうえで、案を出してきました。
- 押したらすぐ休止。残りの日数の分は、再開のときの請求から引く
- 再開した日から新しい1か月。支払いが成功したときだけ、有料に戻す
- 長さに上限は付けない(自動で再開する仕組みが、Stripe にもハコヅミにもないため)
払った期間の終わりから止める形は、時刻で動く仕組み(決まった時刻に処理を走らせるもの)がないと作れません。ハコヅミには、まだそれがありません。そのために仕組みを足すより、「すぐ止めて、残りは後で引く」で、払った分が無駄にならないなら十分だと思いました。
全てその方針でOK
1つだけ、気をつけるところがあります。残りの日数は、返金ではなく、再開のときに引くものです。休止したまま再開しなければ、戻りません。休止の確認の文に、そのことを書きました。

休止する前の確認(架空のデータ)
ボタンは、ハコヅミに作る
解約やカードの変更は、#74 で、Stripe の契約の管理の画面に任せました。でも、その画面には、一時停止の項目がありません。設定を見たときにも、ありませんでした。
そこで、休止と再開のボタンは、ハコヅミのアカウントの画面に作りました。押すと、ハコヅミのサーバーが Stripe に「一時停止して」「再開して」と頼みます。

有料の人のアカウントの画面(架空のデータ)
休止のあいだは、「休止中です」と「再開する」が出ます。

休止中のアカウントの画面(架空のデータ)
休止できるのは、支払いが滞っていなくて、解約の予定もない人だけにしました。支払いの払い直しのあいだに休止すると、払っていない分がどうなるのか、分かりにくくなるからです。
時計を2か月進める
#74・#75 と同じく、Stripe のテストクロック(時計を進める仕組み)で確かめました。
テストクロックの中で契約を作り、ハコヅミの「休止する」を押すと、Stripe の契約が「一時停止」になりました。次の請求書の欄は、「-」です。

Stripe の側でも「一時停止」
そのまま、時計を2か月ほど進めました。本来なら、請求日が2回来ます。でも、請求書は1件も増えず、引き落としは止まったままでした。
再開すると、¥0 の請求
最後に、ハコヅミの「再開する」を押しました。再開にも、確認を出しています。その日に1か月分を払うことになるからです。
再開すると、会員区分が「有料」に戻り、再開した日に、新しい請求書ができました。合計は ¥0 です。

再開した日の請求は ¥0(請求書番号は隠しています)
今回は、契約を作ってすぐに休止したので、払った期間の残りが、ほぼ1か月分(¥300)ありました。それが、再開のときの ¥300 から、ちょうど引かれたのです。次の請求日は、再開した日の1か月後になっていました。
決めたとおりに動いているのを、数字で見られて、安心しました。
1つ、見え方の違いがありました。Stripe の画面では、次の請求日が「1月25日」なのに、ハコヅミでは「1月26日」と出ました。Stripe の画面は世界標準時、ハコヅミは日本の日付で出しているためでした(世界標準時の夜8時は、日本では次の日の朝5時です)。食い違いではありません。
おわりに
- 季節のあるものには、休止がほしい。解約より軽く、続けやすい
- 名前の似た「凍結」とは、別のものとして作る
- できるかどうか分からないことは、Issue で決めずに「作るときに決める」にしておく。調べてから決める
- 期間の終わりから止められないなら、すぐ止めて、残りを後で引く
- 自動の再開は作れない。作れないなら、上限も付けない
- 時計を進めて、止まっていることと、引かれていることを、数字で見る
これで、課金の「作る」は、あと1つです。次は、退会したときに契約を止めることと、規約とプライバシーポリシーの直しの予定です。
テスタを募集しています。キャンプに行く方、よければ、触ってみてください。