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

每種應用程式內購買類型的退款規則都不同,而只有其中兩種會向你徵詢意見

消耗型、非消耗型、自動續訂訂閱和非續訂訂閱,各自遵循自己的退款規則。有些可以復原,有些一旦花掉就消失,而只有消耗型請求和訂閱請求才會向開發者索取證據。以下說明你所販售的應用程式內購買類型如何改變退款對你的影響。

一張暖光書桌上,一疊硬幣、一把掛鎖、一本日曆和一張票券排成一列,說明每種應用程式內購買類型的退款規則各不相同

重點摘要

  • App Store 上有四種應用程式內購買類型:消耗型、非消耗型、自動續訂訂閱和非續訂訂閱,每一種都遵循不同的退款規則。Google Play 則把同樣的目錄歸類為一次性商品和訂閱兩種。
  • 在退款被裁定之前,Apple 只有兩條流程會向開發者索取證據:消耗型的 CONSUMPTION_REQUEST,以及自 WWDC24 起的自動續訂訂閱 CONSUMPTION_REQUEST。非消耗型和非續訂訂閱幾乎不會開啟這個視窗。
  • 消耗型商品的退款風險最高。它們在交付時即被花掉,無法復原,而且價值在退款到來之前就已消失,這正是 Apple 會針對它們索取你的消耗資料的原因。
  • 非消耗型商品是永久且可復原的,因此退款必須撤銷一項客戶帳戶仍然記得的權益。在 Google Play 上,若你未在 72 hours 內確認一筆購買,它會被自動退款,存取權限也會被收回。
  • 自動續訂訂閱按時鐘計算退款。Apple 從已過去的時間來計算消耗了多少,而不是從你發送的數字,所以你的任務是提供誠實的 refundPreference 以及背後的使用證據。
  • 在 App Store 上,只有 Apple 能發放應用程式內購買退款。在 Google Play 上,你可以自己從 Play Console 為一筆訂單退款,這讓你所販售的商品類型成為你自己需要承擔的決定。
  • 無論哪種類型,退款都會把商店的佣金退還給客戶,卻絕不會退還你的支出。消耗型商品已經觸發的運算、API 呼叫、儲存以及分潤款項,都不會回來。

你在 App Store Connect 或 Play Console 中選擇的應用程式內購買類型,所決定的遠不止商品如何販售。它決定了退款發生時的行為方式,決定了客戶之後能否免費重新拿回該商品,以及在款項移轉之前是否會徵詢你的意見。一個金幣包、一個終身解鎖、一個月度訂閱和一個一次性的賽季通行證,是四種不同的法律與技術物件,退款規則也是這樣對待它們的。大多數開發者用同一段購買程式碼發布它們全部,然後不明白為什麼退款感覺如此不一致。它們並非不一致,而是因類型而異。

以下是每種應用程式內購買類型的定義、退款如何作用於它,以及為什麼四種中只有兩種會把決定路由到你的伺服器。

四種應用程式內購買類型,以及退款為何沿著它們分道

Apple 定義了四種商品類型。消耗型商品是用掉後再買的:遊戲貨幣、提示、能量補充。非消耗型商品是買一次就永久保留的:專業版解鎖、去廣告升級、可下載的關卡包。自動續訂訂閱按重複週期計費,直到客戶取消。非續訂訂閱在一段固定期限內授予存取權,且不會自動續訂,比如作為單一期限販售的一季內容。

Google Play 對同樣的目錄分類方式不同,卻落在同一處。它把商品分為一次性商品和訂閱,而一次性商品是否被標記為消耗型,取決於你的應用程式在購買後是否將其消耗。用詞不同,退款後果卻相同。

應用程式內購買類型退款後可否復原退款時的價值Apple 是否索取你的證據
消耗型否,無法復原通常已被花掉是,CONSUMPTION_REQUEST
非消耗型是,與帳戶綁定仍然持有,權益被撤銷極少
自動續訂訂閱是,在有效期內按已過時間比例攤算是,自 WWDC24 起
非續訂訂閱需由你的應用程式復原期限已部分過去極少

消耗型商品才是退款詐欺真正瞄準的類型

消耗型商品是你會遇到的最棘手退款情形,而它恰恰是 Apple 圍繞其打造消耗請求的那一種,這絕非偶然。當客戶購買 10,000 個金幣、你的伺服器發放的那一刻,價值就已交付。如果他們花掉這些金幣再申請退款,商店可以退還他們的錢,但金幣已經沒了,你為兌現它們所付出的成本也一樣。Apple 自己的工具也反映了這一點:消耗型商品一旦完成,就會離開交易記錄,且永遠不帶取消日期,因為沒有任何持久的東西可供取消。

這就是為什麼消耗型是證據能帶來回報的商品類型。當客戶對消耗型商品申請退款時,Apple 會向你的伺服器發送一個 CONSUMPTION_REQUEST,並等待最多 12 hours 以接收一次 Send Consumption Information 呼叫。在該呼叫中,你設定一個 deliveryStatus,並且在你已交付時,設定一個 consumptionPercentage。該百分比是以 milliunits 表示、從 0 到 100,000 的整數,其中 100,000 表示客戶用掉了全部購買。一份你的記錄顯示已完全花掉的金幣餘額就是你可以回報的 100,000,也是你能在非本意購買主張面前擺出的最有力的單一事實。

消耗型商品無法復原,所以時機就是一切

因為消耗型商品無法復原,你不能像撤銷訂閱那樣把它追回來。一旦退款獲批,你唯一的保護就是你在販售時保留的記錄。如果你沒有在交付和消耗發生時記錄它們,你就要在 12 hours 的時鐘下重建它,而那是去找資料最糟糕的時刻。在進入時記錄它,而不是在退出時。

訂閱按你無法控制的時鐘退款

自動續訂訂閱是多數應用程式賺錢的地方,而 WWDC24 的退款更新終於把它們路由到了與消耗型相同的證據視窗。自 App Store Server Notifications version 2.11 起,對自動續訂訂閱的退款請求也會觸發一個 CONSUMPTION_REQUEST。所以那些過去完全不經你手就被裁定的訂閱退款,如今到來時附帶了一個 12 hours 的視窗。

關鍵在於消耗如何被度量。對於自動續訂訂閱,Apple 不希望你捏造一個使用百分比。它會自行從已過去的時間計算消耗,所以一個年度計劃已用滿六個月的人無論你發送什麼都會被讀作大約消耗了一半。你的槓桿不是百分比,而是一份誠實的 refundPreference,即 GRANT_FULL、GRANT_PRORATED 或 DECLINE,並由你實際掌握的任何使用訊號來支撐。發送證據所支持的偏好,讓 Apple 去權衡。

非續訂訂閱更接近一次性解鎖

非續訂訂閱是客戶購買一次的固定期限,就退款而言,它的表現更像非消耗型商品,而不像自動續訂計劃。Apple 極少向它路由 CONSUMPTION_REQUEST,也沒有可供比例攤算的自動續訂。你的應用程式負責追蹤該期限並在客戶的各裝置上復原它,所以退款意味著結束一個由你自己管理的存取視窗,而不是一個 Apple 在為你計時的視窗。

非消耗型商品是永久的,這一點是雙面刃

非消耗型商品是最乾淨俐落的販售對象,也是退款時的一個隱蔽陷阱。它只買一次,永久與客戶的商店帳戶綁定,商店可以隨時按需將其復原到任何裝置。這種永久性在退款到來之前都是一項優點,因為現在你得撤銷一項帳戶仍然記得的權益。如果你的撤銷邏輯只在購買時檢查、從不重新驗證,那麼被退款的客戶可以復原購買,逕直走回付費功能。

Google Play 在這裡增加了一條會絆倒新開發者的硬邊界。如果你的應用程式沒有在 72 hours 內確認一筆購買,Google 會自動退款並撤銷權益。一個你的計費程式碼忘記確認的非消耗型商品不會懸而未決,它會自我逆轉,客戶會失去他們付了錢的東西的存取權,而這並非出於他們自己的任何請求。

一部智慧型手機顯示著一筆付款確認,旁邊是一小疊硬幣,其中幾枚被撥到一邊,說明每種應用程式內購買類型如何按不同規則退款

到底誰能發放退款,會因商店和類型而變

在你規劃任何退款應對之前,先弄清楚誰握著筆。在 App Store 上,只有 Apple 能發放應用程式內購買退款,對每種商品類型都是如此。你的 StoreKit 程式碼無法為一筆購買退款,你的客服台也不能。你可以在開啟視窗的那兩種類型上發送消耗資料來影響 Apple 的決定,而這就是你直接控制的全部。

Google Play 恰恰相反。你可以自己從 Play Console 或 Voided Purchases 和退款 API 為一次性商品或訂閱訂單退款,全額或部分皆可。這份自由也是一份責任:你對一個消耗型商品發放的退款,仍然必須在你自己的後端撤銷該商品,因為 Google 不知道你的金幣已被花掉。你所選的商品類型決定了那次撤銷有多乾淨俐落。

每種退款類型實際上讓你付出什麼

被退款的價格是每個人都盯著看的那一行,也是帳單中最小的部分。當任何商店發放退款時,它會連同退回自己的佣金,所以你損失的是你的淨收益,而不是全額標價。這是好消息,也就到此為止。商店退還的是它抽走的那一份。它永遠不退還的,是你為完成這筆販售已經花掉的成本,而這個數字會因商品類型而急劇變化。

消耗型商品是昂貴的退款

被退款的消耗型商品是那種可能比其價格花費更多的商品。假設一個客戶購買了 5,000 個額度,每個額度都觸發一次付費推論呼叫,他們花掉了其中 4,000 個,然後申請退款。商店退還價格及其佣金,但運算、按 token 計費的 API 帳單、你生成的圖像,以及這些額度資助的任何創作者分潤,全都已被花掉。非消耗型商品的退款至少能把一項權益拉回你的掌控。消耗型商品的退款拉回的,是一筆你已經付清了全部成本的販售。

拒付是同一張帳單的更重版本

退款和拒付是不同的事件,而兩者之間的差距現在有了一個日期。當客戶不是向商店申請、而是向他們的銀行爭議這筆扣款時,一次完成的拒付是銀行終局的。對於在 August 3 2026 當天或之後下的 Google Play 訂單,一次敗訴的拒付會向開發者收取購買價格減去 Play 的服務費,再加上銀行的拒付手續費,這是一筆由卡組織設定的固定費用。Google Play 會透過 orders.reviewrefund 把拒付路由給你審查,附帶一個 24 hours 的視窗,這是唯一向你索取證據的 Google 流程,而且它可能落在任何商品類型上。

當類型決定規則時該如何應對

你無法在販售之後改變退款落在哪種商品類型上,但你可以停止用同一種方式處理全部四種。

  • 在消耗型商品的交付和消耗發生的那一刻就記錄它們。那份日誌是你在唯一無法復原的類型上的全部防禦,而 12 hours 的視窗遠遠不夠從零建構它。
  • 在退款之後重新驗證非消耗型商品的權益,而不只是在購買時。一次復原呼叫應當檢查目前狀態,這樣被退款的客戶就無法走回付費功能。
  • 自動應答兩個證據視窗。一個 12 hours 的消耗請求和一個 24 hours 的拒付審查,等不了某個人去讀收件匣,也不會為時區而延長。
  • 只在兩種可爭議的類型上評判你的退款防禦。在從不開啟視窗的類型上退款數量的上升,是一個產品或定價訊號,而不是你證據的失敗。

這一切都不是要戰勝商店,而是要讓你的應對匹配那個真正被賣出的對象。RefundHalt 會在視窗之內、用你在販售時記錄的交付與使用證據,自動應答消耗型和訂閱的 CONSUMPTION_REQUEST 以及 Google Play 的 orders.reviewrefund 審查,並把那些沒有任何視窗曾讓你爭議的退款保存在它們自己的帳本裡,這樣你用來評判自己的那個數字才保持誠實。

常見問題解答

我可以自己為一筆應用程式內購買退款嗎?
這取決於商店。在 App Store 上,只有 Apple 能發放應用程式內購買退款,對每種商品類型都是如此,所以你唯一的影響力就是你在兩條索取證據的流程上發送的消耗資料。在 Google Play 上,你可以自己從 Play Console 或退款 API 為一次性商品或訂閱訂單退款,全額或部分皆可。
哪種應用程式內購買類型的退款風險最高?
消耗型。消耗型商品在交付時即被花掉,無法復原,而且它的價值通常在退款請求到來之前就已消失。這正是為什麼 Apple 會為消耗型商品發送 CONSUMPTION_REQUEST 並索取你的消耗資料,也是為什麼一個消耗型商品背後的運算或 API 成本可能讓它的退款花費超過其售價。
Apple 會為每種購買類型都發送消耗請求嗎?
不會。Apple 會為消耗型商品發送 CONSUMPTION_REQUEST,並且自 WWDC24 更新起,也為自動續訂訂閱發送。非消耗型和非續訂訂閱極少開啟那個證據視窗。對每種類型,退款本身仍由 Apple 裁定,而不是由你。
客戶可以在退款之後復原一個消耗型商品嗎?
不能。消耗型商品無法復原,這正是讓它們的退款對你而言成為終局的原因。非消耗型商品和有效的訂閱與客戶的商店帳戶綁定並且可以復原,所以對這些商品的退款必須撤銷一項權益,你的後端應當重新驗證它,而不是信任購買時的狀態。
訂閱退款的計算方式有何不同?
對於自動續訂訂閱,Apple 從已過去的時間計算消耗了多少,而不是從你發送的一個百分比,所以半個期限會被讀作大約消耗了一半。你的角色是一份誠實的 refundPreference,即 GRANT_FULL、GRANT_PRORATED 或 DECLINE,由你掌握的使用證據來支撐,而不是一個捏造的消耗數字。

資料來源與延伸閱讀

RefundHalt

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

繼續閱讀

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

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