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

Family Sharing 退款只會撤銷一筆付款,卻可能讓另外五個人繼續使用你的 App,而只有你的伺服器能夠切斷他們

Family Sharing 退款只會撤銷一筆付款,卻可能讓多達五名家庭成員繼續使用你的付費功能。Apple 會送出一個 REVOKE,並期待你的伺服器來終止存取權。以下說明家庭共享退款如何運作,以及一筆退款的代價。

一張紙本收據放在一張擺設給六人用餐的餐桌正中央,象徵 Family Sharing 退款背後的一筆付款如何能涵蓋六個人

重點摘要

  • Apple 會為每一筆家庭共享的交易標上值為 `FAMILY_SHARED` 的 `inAppOwnershipType`,並為每一筆直接購買標上 `PURCHASED`。這個欄位只會出現在非消耗型 App 內購買與自動續訂訂閱上,也就是 Family Sharing 支援的兩種產品類型。
  • 一筆可家庭共享的購買最多能讓六個人享有權益,也就是購買者加上五名家庭成員,因此一筆付款可能帶來相當於六個人份的運算、API 呼叫、儲存空間與撥款,這些都是你的產品在提供服務時所花費的。
  • 當 Apple 為購買共享項目的人退款時,會送出一個 REVOKE App Store Server Notification,而撤銷存取權,包括它每一份家庭共享的副本,是你的伺服器的工作。Apple 會退還金錢,但不會替你終止你的權益。
  • REVOKE 中的 `FAMILY_SHARED` 交易只有在撤銷是由對購買者退款所引起時,才會帶有 `revocationDate`。如果家庭成員只是離開群組,同樣的 REVOKE 會在沒有 `revocationDate` 的情況下送達,這是 Apple 自家工程師所說的。
  • Apple 會刻意將一筆新的家庭共享購買延遲約一小時後才送達家庭成員,好讓購買者有時間在其他人取得存取權之前停用共享。
  • 在 App Store Connect 為某個 App 內購買啟用 Family Sharing 之後無法復原,所以一旦某個產品變得可共享,它就會一直可共享,而你的退款處理從那時起就必須將 `FAMILY_SHARED` 交易納入考量。
  • 消耗型產品絕不會家庭共享,所以家庭成員絕不會觸發 `CONSUMPTION_REQUEST`,也不會出現在你的消耗回報中。Family Sharing 退款永遠只會牽涉到非消耗型產品與自動續訂訂閱。

Family Sharing 群組中的一筆購買,可以把你的 App 交到六個人手上。付錢的人是其中之一,另外五個人從沒掏過錢包,而 Apple 仍期待你的 App 對他們所有人都能運作。這就是你在為某個 App 內購買開啟 Family Sharing 那一刻所選擇加入的交易。這也是為什麼 Family Sharing 退款和普通退款是截然不同的物種。當購買者拿回錢時,這筆銷售對一個帳號被撤銷了,但你授予多達五個其他人的存取權並不會自行關閉。你的伺服器必須去做這件事,而如果它被寫成只盯著購買者,它就不會這麼做。

以下是集中在一處的全貌。本文會逐步說明 Apple 如何標記一筆共享購買、那個把購買者和家庭區分開來的單一欄位、Apple 究竟何時送給你一個 REVOKE 以及如何解讀它、那個把退款和某人只是離開家庭區分開來的安靜細節,以及一筆共享退款在你把已經花在從沒付錢給你的人身上的運算算進去之後,實際上的代價是多少。

Family Sharing 交出了什麼,又交給了多少人

為某個產品開啟 Family Sharing,你就改變了誰是你的付費客戶。Apple 上的一個家庭群組最多可容納六個人,一位管理員加上最多五名成員。當群組中任何人購買一個可家庭共享的產品時,群組中每個人都會取得對它的存取權。他們不付錢,他們不會出現在你的營收中,他們只是帶著有效的權益出現在你的 App 裡,因為 Apple 為他們每個人發出一筆指向同一次購買的交易。

只有兩種產品類型可共享,而消耗型不是其中之一

Family Sharing 恰好涵蓋兩種 App 內購買:非消耗型與自動續訂訂閱。消耗型,也就是金幣和點數這類產品,絕不會被共享,這就是為什麼家庭成員絕不會觸發 CONSUMPTION_REQUEST,也不會出現在你的消耗回報中。如果你的 App 只賣消耗型產品,Family Sharing 退款就不是你的問題。如果你賣的是終身解鎖或週期性方案,那就是你的問題。

把購買者和受益者區分開來的那個欄位

Apple 發出的每一筆交易都帶有 inAppOwnershipType。它有兩個值。PURCHASED 表示這個帳號為產品付了錢,並且可以管理它,包括取消它或申請退款。FAMILY_SHARED 表示這個帳號是一名透過別人的購買而取得存取權的家庭成員。兩者都讓這個人有權使用你的產品,只有其中一個付了錢。這個欄位存在於 StoreKit 交易、收據和 App Store Server API 上,所以你可以在任何你已經在檢查權益的地方讀取它。

inAppOwnershipType這是誰能否管理或退款該購買他們付錢給你了嗎
PURCHASED購買該產品的帳號可以
FAMILY_SHARED具有共享存取權的家庭成員不可以

Family Sharing 退款如何抵達你的伺服器

共享購買的退款一開始的方式,和任何 Apple 退款都一樣。購買者,也就是唯一能這麼做的人,向 Apple 要求退錢。Apple 做決定。如果 Apple 批准,購買者的購買被撤銷,Apple 會送給你的伺服器一個 REVOKE App Store Server Notification。通知的 V1 和 V2 都會攜帶它。REVOKE 是你唯一的訊號,代表它背後的權益,以及它每一份家庭共享的副本,現在都作廢了。

不要只撤銷一筆交易,要重新讀取整段歷史

Apple 對 REVOKE 的指引很直接:不要把它當成單一開關。當你收到一個時,走過客戶的整段交易歷史,從頭重建他們的權益,因為一個人可能持有不止一筆授予相同或不同產品的交易。只撤銷通知中指名的那筆交易,你可能會讓已退款的家庭成員仍保有存取權,或是切斷仍持有有效第二權益的人。每一次都要重新建立完整的樣貌。

一隻手從一串六把相同的鑰匙中拿起一把黃銅鑰匙,象徵在 Family Sharing 退款後撤銷單一家庭成員的共享存取權

把退款和家庭拆夥區分開來的那一個細節

這裡有個讓團隊花掉一整個下午除錯的陷阱。對於一筆 FAMILY_SHARED 交易,REVOKE 可能代表兩件截然不同的事,而你用來分辨它們的方式,是一個有時候根本就不存在的欄位。當購買者取得退款時,FAMILY_SHARED 交易會帶有 revocationDate。當家庭成員只是離開群組時,同一種 REVOKE 會在完全沒有 revocationDate 的情況下送達。Apple 的商務工程師在開發者論壇上直接這麼說過。無論哪一種你都要收回存取權,但只有帶日期的那個才是退款,而只有退款才是那個同時也撤銷了一筆付款的情況。

一筆共享退款實際上讓你付出多少代價

跟著錢走,因為這就是 Family Sharing 悄悄改變算式的地方。一般退款撤銷一筆銷售。Apple 把價格退還給購買者,並交回它的佣金,所以商店這一側幾乎是打平的。永遠回不來的,是你在提供產品時已經花掉的東西。有了 Family Sharing,你不是只花了一次,你是為多達六個人花了它。購買者和最多五名家庭成員每個人都跑了你的運算、呼叫了你的 API、填滿了你的儲存空間,並提取了任何你出資的撥款,全都只憑一筆付款。

現在購買者退款了。這一筆付款被撤銷。每一名家庭成員的存取權都應該在同一刻終止,因為讓服務他們變得合理的那個東西,一筆已付款的購買,已經沒了。如果你的伺服器只撤銷 PURCHASED 交易,卻讓 FAMILY_SHARED 那些交易繼續存活,最多五個人會免費繼續使用你的付費功能,而你繼續付錢服務他們,系統裡卻再也沒有任何可以收費的對象。這不是四捨五入的誤差。這是你剛退回的那筆銷售的服務成本的五倍。

你在共享退款時撤銷什麼誰失去存取權你還在為什麼付錢
完整的交易歷史購買者和所有家庭成員沒有,所有人的存取權都終止
只撤銷 PURCHASED 交易只有購買者多達五名家庭成員,仍在你的運算、API、儲存空間與撥款上
沒有,因為你錯過了 REVOKE沒有人購買者和多達五名成員,全都免費

訂閱讓漏洞變成週期性的

對於非消耗型產品,一名未被撤銷的家庭成員是一次性的損失,會一直持續到你察覺為止。對於自動續訂訂閱來說更糟,因為那個權益本來就已經是週期性的。針對訂閱訂單的退款應該結束整個群組的共享,但一名被留著存活的家庭成員,每一個你沒有結清他的計費週期都保有那個付費層級。修正方法是一樣的,在每一個 REVOKE 上都從完整歷史重建權益,但跳過它的代價會累積。

把它做對,並在真正的退款出現之前先測試它

這裡沒有什麼奇特的東西要建置。整件工作就是把存取權綁在權益上,而不是綁在購買者上,並在每一個 REVOKE 上重建那個存取權。

  • 依交易及其 inAppOwnershipType 來儲存存取權,而不是依單一購買者帳號,這樣一筆 FAMILY_SHARED 交易就能自行授予存取權,也能被自行撤銷。
  • 在任何 REVOKE 通知上,重新讀取客戶的完整交易歷史並重新計算權益,而不是只關掉那一筆被指名的交易。
  • 把帶有 revocationDateFAMILY_SHARED 交易當成退款,並終止該成員的存取權。把沒有 revocationDate 的那一筆當成離開家庭,也一樣終止它。
  • 不要急著把一筆全新的共享購買投入服務。Apple 會把它保留約一小時,好讓購買者可以反悔,所以要遵照 Apple 實際發出的交易,而不是在點擊購買的當下就授予存取權。
  • 演練它。Apple 的 Testing Family Sharing 工具讓你可以模擬一筆共享交易,而沙盒退款會觸發和你的正式伺服器將收到的完全相同的 REVOKE。

做到這一點,Family Sharing 退款就會變成一件無關痛癢的事。購買者拿回他們的錢,整個群組在同一拍失去存取權,而你不再為服務從沒付錢給你的人而付錢。

常見問題解答

inAppOwnershipType 是什麼,它有哪些值?
inAppOwnershipType 是 Apple 放在每一筆 App 內購買交易上的欄位,有兩個值:PURCHASED 代表購買該產品的帳號,FAMILY_SHARED 代表透過別人的購買而取得存取權的家庭成員。它只會出現在非消耗型產品與自動續訂訂閱上,也就是 Family Sharing 支援的產品類型。
當購買者取得退款時,Apple 會自動撤銷家庭成員的存取權嗎?
不會。Apple 會撤銷購買者的付款,並送給你的伺服器一個 REVOKE App Store Server Notification,但撤銷權益,包括它每一份家庭共享的副本,是你的伺服器的工作。如果你不對 REVOKE 採取行動,家庭成員在退款後仍會保有存取權。
我要如何分辨 Family Sharing 退款與家庭成員離開群組?
檢查 FAMILY_SHARED 交易上的 revocationDate。當撤銷是由對購買者退款所引起時,交易會帶有 revocationDate。當家庭成員只是離開群組時,REVOKE 會在沒有 revocationDate 的情況下送達。兩種情況都會終止權益,但只有帶日期的那個撤銷了一筆付款。
一筆家庭共享的購買能讓多少人使用?
最多六人,管理員加上多達五名家庭成員。因此一筆付款可以讓六個人享有你的產品權益,這就是為什麼如果你只撤銷購買者的交易,一筆共享退款可能讓多達五個人繼續留在你的付費功能上。
我可以在啟用 Family Sharing 之後,為某個 App 內購買關閉它嗎?
不行。在 App Store Connect 為某個 App 內購買啟用 Family Sharing 之後無法復原。一旦某個產品變得可共享,它就會一直可共享,所以你的退款處理從那時起就必須將 FAMILY_SHARED 交易納入考量。
消耗型購買會與家庭共享嗎?
不會。Family Sharing 只涵蓋非消耗型產品與自動續訂訂閱。消耗型絕不會被共享,所以家庭成員絕不會觸發 CONSUMPTION_REQUEST,也不會出現在你的消耗回報中。

資料來源與延伸閱讀

RefundHalt

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

繼續閱讀

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

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