所有文章
Deep dive閱讀時間 8 分鐘

付費 App 的退款永遠不會通知你的伺服器,所以只能由 App 自己發現

買斷制付費 App 的退款會繞過你的伺服器監聽的所有通知。Google 給買家兩小時的退貨期並解除安裝 App,Apple 可依據你簽署的協議在 90 天內退款,兩者都不會向你索取證據。本文說明各商店會告訴你什麼、退款讓你損失什麼,以及如何在 App 內偵測。

木桌上的一支智慧型手機,旁邊是一張撕破的商店收據和幾枚硬幣,示意付費 App 退款

重點摘要

  • 付費 App 退款針對的是 App 下載本身的價格,而不是 App 內購買。Apple 和 Google 都沒有為它記載任何伺服器通知。
  • Google Play Console 說明文件指出,買家購買付費 App 後有最多兩小時可以退貨並取得全額退款,同一款 App 只能退一次。
  • Google Play 的退款政策指出,App 會在退款過程中被解除安裝,買家再次購買同一款 App 後不能再次退款。
  • Apple 的 App Store Server Notifications V2 中的 REFUND 類型涵蓋消耗性項目、非消耗性項目、自動續訂型訂閱和非續訂型訂閱。App 本身的購買不在這份清單中。
  • Apple 開發者計劃授權協議 Schedule 2 第 6.3 條允許 Apple 為下載後 90 天內取消購買的買家退款,並由開發者向 Apple 償付這筆款項。
  • Apple 的 StoreKit 文件在 AppTransaction(App 購買的簽署紀錄)上列出了 revocationDate,App 可以在裝置上檢查它。
  • CONSUMPTION_REQUEST 和 Google Play 的 orders.reviewrefund 都沒有記載適用於 App 下載購買,因此付費 App 退款是在沒有開發者證據的情況下裁定的。

買斷制付費 App 的退款走的是一道側門,大多數退款工具從不盯著它。當買家退掉的是 App 本身,而不是在 App 內買的東西時,Apple 和 Google 會直接從你的收益中扣回這筆錢,卻不會向你的伺服器傳送任何通知。Google 至少會解除安裝 App。在 iOS 上,Apple 官方論壇裡的開發者反映,退款後的買家仍在繼續使用 App。如果你銷售付費 App,付費 App 退款是唯一一種你只能在報表裡看到一行負數的退款,除非 App 在裝置上主動檢查。

Google Play 與 App Store 的付費 App 退款規則

兩家商店都把下載購買視為一項獨立商品,適用各自的規則。以下是各商店文件中的說法。

規則Google PlayApp Store
快速自助退貨購買後最多兩小時內,全額退款無文件記載
較長的申請期限買家可在 48 小時內申請,之後需聯絡開發者依據開發者協議 Schedule 2,Apple 可在下載後 90 天內退款
可退次數每款 App 一次。再次購買後不能再退無文件記載
App 會怎樣在退款過程中被解除安裝無文件記載。開發者反映退款買家仍可使用
開發者能否退款可以,僅限全額退款,在 Play Console 中操作不能
傳給你的伺服器通知無文件記載無文件記載
向你索取證據無文件記載無文件記載

Google Play 的兩小時退貨如何運作

Google 的 Play Console 說明文件寫得很直白。購買付費 App 後,使用者有最多兩小時可以退貨並取得全額退款,而且同一款 App 只能退一次。Google 面向消費者的退款政策還補充,在 48 小時內,買家可能可以視購買情況取得退款,App 會在退款過程中被解除安裝,再次購買同一款 App 的人不能再為它退款。超過 48 小時後,Google 會請買家去找開發者。

Apple 如何為付費 App 退款

在 App Store 上,買家透過 reportaproblem.apple.com 向 Apple 提出申請,選擇原因,然後選取該 App。Apple 表示預計會在 24 到 48 小時內提供處理結果。你無法自行為 App Store 購買退款。你的合約設定了最長期限。Apple 開發者計劃授權協議 Schedule 2 第 6.3 條規定,如果買家希望在下載後九十天內取消,或者 App 不符合你的規格說明或適用法律,Apple 可以全額退款,而你需要向 Apple 償付該金額或給予等額抵扣。

為什麼你的伺服器永遠收不到付費 App 退款的消息

兩家商店發出的所有退款訊號都是為 App 內購買設計的。Apple 將 notificationType 描述為觸發通知的 App 內購買或外部購買事件。它的 REFUND 類型涵蓋消耗性項目、非消耗性項目、自動續訂型訂閱或非續訂型訂閱。Get Refund History 傳回的是顧客已退款的 App 內購買。App 下載不在其中任何一份清單裡。

Google 也是一樣。即時開發人員通知涵蓋訂閱、一次性產品和作廢購買,而作廢購買的 productType 只會是訂閱或一次性購買。Voided Purchases API 說明它適用於一次性 App 內訂單和訂閱,而且只能回溯 30 天。

付費 App 退款會觸發 CONSUMPTION_REQUEST 嗎?

不會。Apple 的文件指出,當顧客為消耗性 App 內購買或自動續訂型訂閱申請退款時,它會傳送 CONSUMPTION_REQUEST。這是兩家商店中僅有的兩種會向開發者索取證據的退款流程之一。另一種是 Google Play 的退單審查,需在 24 小時內透過 orders.reviewrefund 回應,它同樣經由 App 內購買的通知流到達。兩者都沒有記載適用於 App 下載。付費 App 退款的裁定,不會參考你能提供的任何東西。

退款後的買家還能繼續使用 App 嗎?

在 Google Play 上,政策規定 App 會被解除安裝。在 iOS 上,Apple 論壇裡有開發者正是在問這個問題。2025 年 3 月的一篇貼文寫道:「當使用者對買斷制付費 App 退款後,他們仍然可以存取該 App。」另一篇 2022 年的貼文懷疑有買家購買、安裝、退款後繼續使用。第三篇貼文發於 2025 年 6 月,詢問 App Store Server Notifications V2 究竟會不會回報 App 層級的退款。這三篇貼文都沒有得到 Apple 的回答。

付費 App 退款讓你損失多少錢

收益這一側是可預測的。Google 的 Play Console 說明文件指出,你退款時它會退還其服務費,因此從你收益中扣除的是你的分潤,而不是標價。如果退款發生在 Google 已經付款給你之後,會從未來的付款中扣除;如果你的餘額持續為負至少 48 小時,Google 可能會從你的銀行帳戶扣款。在 Apple 這一側,合約規定你償付與價格相等的金額。實務上,RevenueCat 在 2022 年回報,Apple 扣除的是顯示為 Extended Partner Share 的扣佣後金額,也就是說 Apple 沒有保留它的抽成。

拿不回來的,是你為服務這位買家已經付出的成本。來看一個示例。一款售價 $6.99 的付費相片 App 透過雲端模型執行濾鏡,並把專案同步到雲端儲存空間。你為一則廣告付了錢,這則廣告帶來了這位買家。

成本項目在 Google Play 上是否退還在 App Store 上是否退還
你在 $6.99 中的分潤從你的收益中扣回從你的收益中扣回
商店服務費或佣金由 Google 退還給你根據 RevenueCat 的報告,不收取
已用掉的雲端推論和 API 呼叫否否
已同步專案的儲存空間否否
取得該買家的廣告支出否否
買家繼續使用 App 時持續產生的伺服器成本終止,App 已被解除安裝持續,直到你的 App 進行檢查

最後一列正是 iOS 變得昂貴的地方。保留了 App 的退款買家會繼續呼叫你的後端,退款之後的每一次推論請求、同步和 API 呼叫,都是沒有收入支撐的成本。對於沒有伺服器成本的付費 App,退款只是少了一筆銷售。對於有後端的 App,它可能變成一張不斷累積的帳單。

如何在 App 內偵測付費 App 退款

既然伺服器什麼也收不到,檢查就必須從裝置上開始,再通知你的伺服器。

在 iOS 上,讀取 AppTransaction 的 revocationDate

AppTransaction 是 App Store 對顧客購買該 App 的簽署紀錄。Apple 的 StoreKit 文件現在在其上列出了 revocationDate 屬性,描述為 App 購買的撤銷日期。在啟動時讀取 AppTransaction.shared,驗證結果,並把非 nil 的 revocationDate 視為已退款的下載。把簽署值傳送到你的伺服器,讓它停止為該帳戶提供服務。

  • Apple 表示,即使在退款或重新購買之後,同一個 Apple 帳號的 appTransactionID 也保持不變。所以用它作為紀錄的鍵,再次付費的買家就能被辨識出來。
  • AppTransaction.refresh() 會從 App Store 取得一份新的紀錄,但會顯示登入提示。Apple 建議只在使用者明確操作之後呼叫它,例如點一下「回復」按鈕。
  • 簽署值存放在裝置上。Apple 的文件沒有為它描述任何伺服器通知,所以你的伺服器只能知道 App 回報的內容。
一位開發者在筆電前拿著螢幕上顯示鎖頭的手機,在付費 App 退款後檢查存取權限

在 Android 上,向 Play Integrity 請求授權判定

Google 的解除安裝能處理大多數情況,但某些副本可能在解除安裝後依然存在,例如從備份側載的副本。Play Integrity API 會為已登入的帳戶傳回 appLicensingVerdict。LICENSED 表示使用者擁有 App 授權。UNLICENSED 表示沒有,Google 建議顯示 GET_LICENSED 對話方塊。UNEVALUATED 表示 Google 無法檢查,例如使用者沒有登入 Google Play。Google 也指出,在一些較舊的裝置上,使用者解除安裝後仍保有授權,所以 LICENSED 並不能在每台裝置上都證明購買仍然有效。

讓伺服器擔任守門人

用戶端檢查可能被修補繞過。真正值得保護的是你的後端所做的付費工作,所以讓後端拒絕以下帳戶的呼叫:最近一次回報為退款、回報為 UNLICENSED 判定,或在你設定的寬限期過後仍沒有任何判定。這樣才能避免退款變成免費的運算資源。

付費 App 何時應該轉向 App 內購買

Apple 自己關於變更商業模式的指南,描述了如何從付費 App 轉為提供 App 內購買的免費 App,並使用 AppTransaction 上的 originalAppVersion,繼續為購買過付費版本的使用者提供進階功能。這項轉變在退款方面的好處很具體。一旦價格放在非消耗性項目或訂閱上,退款就會以 REFUND 通知和作廢購買的形式到達,你的伺服器可以據此採取行動,而 App Store 上的訂閱退款申請會觸發 CONSUMPTION_REQUEST。這些正是 RefundHalt 監聽的訊號,並且會在 12 小時和 24 小時的期限內回應。付費下載一個都不會給你。

常見問題解答

在 Google Play 上,買家有多長時間可以退掉付費 App?
根據 Google 的 Play Console 說明文件,購買後最多兩小時內可全額退款,而且每款 App 只能退一次。Google 的退款政策也指出,買家可能可以在 48 小時內取得退款,超過之後 Google 會請買家聯絡開發者。App 會在退款過程中被解除安裝。
有人為我的付費 App 退款時,Apple 會通知我的伺服器嗎?
沒有任何有文件記載的通知。Apple 的 App Store Server Notifications 涵蓋的是 App 內購買事件,REFUND 類型只列出消耗性項目、非消耗性項目、自動續訂型訂閱和非續訂型訂閱。App 可以在裝置上讀取 AppTransaction 的 revocationDate,並回報給你的伺服器。
退款後的買家還能繼續使用付費 iOS App 嗎?
Apple 論壇上的開發者反映可以,而且 Apple 的文件沒有描述任何在退款後移除 App 的步驟。在啟動時檢查 AppTransaction 的 revocationDate,並讓你的伺服器停止為回報了已退款下載的帳戶提供服務。
我可以自己為付費 App 退款嗎?
在 Google Play 上可以。Play Console 允許你為付費 App 發出全額退款,但不能部分退款,而且 Google 會退還其服務費。在 App Store 上不行。只有 Apple 能為 App Store 購買退款。
我能用使用數據作為證據,對付費 App 退款提出申訴嗎?
不能。Apple 的 CONSUMPTION_REQUEST 記載適用於消耗性項目和自動續訂型訂閱,而 Google Play 透過 orders.reviewrefund 進行的退單審查,經由為 App 內產品和訂閱設計的通知到達。兩家商店都沒有為 App 購買本身記載任何證據流程。

資料來源與延伸閱讀

RefundHalt

App Store 與 Google Play 的退款自動駕駛

繼續閱讀

下一筆退款申請已經在路上。

讀完另一封關於未能抗辯退款的客服郵件所需的時間,就足夠您設定好 RefundHalt。