iOSアプリに月額課金を自分で組んだ話

記事
IT・テクノロジー
一人社長向けに作っている経理アプリに、月額のサブスクリプションを付けました。

購入画面は自分では作らず、Appleが用意しているSubscriptionStoreViewを使っています。価格や無料期間、復元、利用規約の表示はストア側にまかせられるので、審査や表示義務のところで余計な地雷を踏まずに済みました。

購入の記録にはRevenueCatを使いましたが、決済そのものを任せるのではなく「記録係」として使う構成にしています。実際の購入処理はAppleのStoreKit2が完結させ、RevenueCatにはその結果だけを伝える形にしました。こうしておくと、将来何か切り替える判断をするときも、決済部分には手を入れなくて済みます。

サーバー側はCloudflare WorkersとD1で組んでいます。RevenueCatのREST APIで契約の状態を取得して課金ユーザーかどうかを判定し、AI機能を使った回数は1つのSQL文でまとめて数えるようにしました。処理に失敗したときは、その回数をもとに戻す処理も入れています。

一番つまずいたのは、テストのときに期限切れや返金を起こしても、購入状態がすぐには反映されないことでした。無料期間を7日のつもりで計算していたら、実際に返ってくる値が違っていたこともあります。

最終的に、購入状態の判定は「購読中・猶予期間・再試行中」のような状態そのもので見る形に変えました。テストも、最大5秒だけ結果を待つ形に直しています。その結果、購入・解約・期限切れ・返金・復元という6つのパターンが、人の手を使わずに自動で確認できるようになりました。

サーバー側にも、RevenueCatが一時的に止まった場合に備えて、1度確認した結果を24時間だけ覚えておく仕組みを入れています。何かの障害が起きても、課金ユーザーの機能がすぐに止まってしまわないようにするためです。

次は、審査に出す前の最終チェックとして、プライバシーポリシーにRevenueCatと使っているAIサービスの名前をきちんと書き足す作業を進めます。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す