RORK LABEN
APPLE-AI — Appleが初回DL 200万未満の開発者にFoundation Modelsを無償開放。個人開発アプリへのAI組み込みコストが大幅に低下SWIFT-API — Foundation Modelsのサーバーサイド統合で、ClaudeやGeminiを同一Swift APIから呼び出し可能に。画像入力にも対応KOTLIN-MIGRATION — Android Studioの移行エージェントがReact Native製アプリをネイティブKotlinへ自動移行。Rork生成アプリの将来の選択肢にRORK-MAX — Rork MaxはネイティブSwiftコードを生成(月$200)。iPhone・iPad・Watch・TV・Vision Pro・iMessageまで対応SIMULATOR — ブラウザベースのストリーミングiOSシミュレータで、XcodeやMacなしに実機相当のApple環境で検証可能SWIFTUI — WWDC 2026でSwiftUIが進化。並べ替え可能コンテナ・任意コンテナのスワイプアクション・最大2倍速のレイアウトAPPLE-AI — Appleが初回DL 200万未満の開発者にFoundation Modelsを無償開放。個人開発アプリへのAI組み込みコストが大幅に低下SWIFT-API — Foundation Modelsのサーバーサイド統合で、ClaudeやGeminiを同一Swift APIから呼び出し可能に。画像入力にも対応KOTLIN-MIGRATION — Android Studioの移行エージェントがReact Native製アプリをネイティブKotlinへ自動移行。Rork生成アプリの将来の選択肢にRORK-MAX — Rork MaxはネイティブSwiftコードを生成(月$200)。iPhone・iPad・Watch・TV・Vision Pro・iMessageまで対応SIMULATOR — ブラウザベースのストリーミングiOSシミュレータで、XcodeやMacなしに実機相当のApple環境で検証可能SWIFTUI — WWDC 2026でSwiftUIが進化。並べ替え可能コンテナ・任意コンテナのスワイプアクション・最大2倍速のレイアウト
記事一覧/開発ツール
開発ツール/2026-06-12上級

サブスクの返金にアプリが気づかない — REFUND 通知と Voided Purchases で権限を失効させる実装メモ

返金が成立してもアプリ側のフラグは立ったままで、Premium 機能は使われ続けます。App Store Server Notifications V2 の REFUND、Google Play の Voided Purchases、RevenueCat の照合で権限を確実に失効させる実装を記録しました。

RevenueCat20App Store66Google Play17サブスクリプション54アプリ内課金8

プレミアム記事

壁紙アプリの月次レポートを確認していたとき、売上の一覧に小さなマイナスの行が並んでいることに気づきました。App Store の返金です。金額そのものは大きくありませんでしたが、引っかかったのはそこではありません。返金したユーザーの端末で、買い切りの Premium 解除がそのまま有効になっている可能性に思い当たったのです。

調べてみると、案の定でした。当時の私のアプリは購入成功時に「Premium 済み」のフラグをローカルに保存し、起動時はそれを参照するだけの設計になっていました。返金が成立しても、Apple や Google からアプリへ自動で連絡が来るわけではありません。サーバー側で通知を受け取り、自分で権限を失効させない限り、返金後も機能は使われ続けます。

個人開発では返金は月に数件あるかないかの世界なので、後回しにしがちな領域です。ただ、買い切りやサブスクの単価が上がるほど無視しにくくなります。ここでは、私が自分のアプリ群に返金検知を組み込んだときの実装と、その過程でつまずいた点を記録としてまとめておきます。

返金がアプリに伝わらない構造

App Store の返金は、ユーザーと Apple の間で完結します。ユーザーが「問題を報告する」から申請し、Apple が承認すれば返金は成立しますが、その瞬間にアプリへ何かが届くわけではありません。StoreKit 2 では該当トランザクションに revocationDate が記録されますが、これはアプリが能動的にトランザクションを照合して初めて分かる情報です。

Google Play も同様です。Play Console や API 経由の返金で「アクセス権の取り消し」を選ぶと購入は無効化されますが、クライアントに反映されるのは Billing Library が次に購入状態を照合したタイミングになります。

問題は、購入成功時にローカルフラグを立てて終わり、という設計のアプリが少なくないことです。私のアプリもかつてそうでした。この設計では返金が成立してもフラグは立ったままで、ユーザーは Premium 機能を使い続けられます。私の壁紙アプリ群では返金は売上件数の 0.5% 前後と少ないものの、買い切り型の上位プランほど単価が高く、放置すれば「返金してから使い続ける」抜け道として定着しかねません。

失効までの経路を先に決める — 3つの構成

実装に入る前に、返金情報がどの経路で自分のシステムへ届くのかを決めておくと、後の作業で迷いません。選択肢は実質3つです。

構成A: RevenueCat に集約する

Rork で生成したアプリに RevenueCat を組み込む構成は課金実装の定番ですが、返金検知の観点でも有力です。RevenueCat は Apple と Google の両ストアからサーバー通知を受け取り、返金を検知すると entitlement を自動で失効させてくれます。アプリ側の仕事は CustomerInfo の照合だけになります。

構成B: 自前サーバーで Server Notifications を受ける

サブスク管理を自前で持っている場合は、App Store Server Notifications V2 と Google Play の Real-time Developer Notifications(RTDN)を直接受けます。実装量は増えますが、返金以外の通知(請求リトライ・解約予約・オファー利用)も一次情報として扱えるようになります。

構成C: サーバーなしでクライアント照合だけにする

バックエンドを持たない小規模アプリなら、起動時に StoreKit 2 の currentEntitlements(Android は queryPurchasesAsync)を照合し、取り消し済みトランザクションを除外する方法もあります。検知は「次回起動時」までずれ込みますが、ローカルフラグ放置と比べれば大きな前進です。

私は課金実装を RevenueCat に寄せているアプリが多いこともあり、構成Aを基本にして、自社ユーザーIDと購入を紐づけたいアプリにだけ構成Bを足しています。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
App Store Server Notifications V2 の REFUND を署名検証して権限を失効させる Node.js 実装(@apple/app-store-server-library 使用)
RevenueCat 構成で返金がクライアントに届くまでの経路と、キャッシュした Premium フラグが生き残る落とし穴の塞ぎ方
Google Play の SUBSCRIPTION_REVOKED と Voided Purchases API による失効処理、返金率 0.5% 前後を保つ運用の工夫
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-05-04
Rork Maxで作ったアプリをリリースする前に確認すべきこと — App Store & Google Play 申請チェックリスト2026
Rork Maxで生成したアプリをApp Store・Google Playに申請するときに見落としがちなポイントをチェックリスト形式でまとめました。リジェクトを防ぐための実践的な確認事項です。
開発ツール2026-04-28
Family Sharing で IAP が消える4つのトリガー — Rork で子ども向けアプリの課金を安全に設計する
Family Sharing 経由の購入で IAP 収益が突然消える原因と、Rork で実装する StoreKit 2・Server Notifications V2 を組み合わせた安全な課金設計を、実コードとテスト手順まで網羅的に解説します。
開発ツール2026-04-15
Rork × RevenueCat + Stripe Web 統合ガイド:iOS・Android・Web のサブスクリプションを1つのバックエンドで管理する
Rorkアプリで iOS StoreKit・Android Google Play Billing・Stripe Web の3つの課金チャネルを RevenueCat で一元管理する実装ガイド。クロスプラットフォーム対応の落とし穴と本番運用まで解説します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →