Apple 和 Google 只退自家商店的款項,跨平台訂閱必須由你在其他平台一併終止存取
Apple 或 Google 為跨平台訂閱退款時,你的 Android App、iPhone App 和網站並不會自己得知。本文說明如何把每筆商店購買綁定到同一個帳號、撤銷正確的權益,並停止為已退款的使用者負擔服務成本。

重點摘要
- Apple 的 App Review Guideline 3.1.3(b) 允許跨多個平台營運的 App,讓使用者存取他們在其他平台或開發者網站上取得的內容與訂閱,前提是這些項目在 App 內也以 App 內購買項目的形式提供。
- Apple 和 Google 只會為在自家商店完成的購買退款,所以 Apple 對跨平台訂閱的退款不會影響客戶在 Google Play 或網站上的計費。開發者的伺服器必須在每個平台上移除它所授予的存取權。
- Apple 為消耗性項目、非消耗性項目、非續訂型訂閱或自動續訂型訂閱退款時,會透過 App Store Server Notifications V2 發送 REFUND 通知,並表明開發者有責任儲存、監控並處理每一筆已退款的交易。
- Apple 的 appAccountToken 是開發者附加在 App 內購買上的 UUID,而 App Store Server API 的 Set App Account Token 端點可以事後替 App 以外完成的購買補上這個值,例如兌換的優惠代碼。
- Google Play 的 setObfuscatedAccountId 會把購買連結到開發者 App 中的帳號,長度上限為 64 個字元;若其中含有電子郵件等明文個人資料,購買將會被封鎖。
- Google Play 的 Voided Purchases API 會回報已退款及遭退單的購買,並附上 orderId 與 voidedSource,值為 0 代表使用者、1 代表開發者、2 代表 Google。
- 針對 2026 年 8 月 3 日之後成立的 Google Play 訂單,一旦退單成立,開發者須負擔扣除 Play 服務費後的購買金額,再加上銀行收取的退單手續費。
你的訂閱者付款給 Apple,當天下午打開了你的 Android App,現在又在公司使用你的網站。接著 Apple 幫他退了款。Google Play 不知道,你的網站計費系統也不知道。除非你自己的伺服器終止存取,否則一份已退款的跨平台訂閱,會在每個讀取你帳號資料庫的畫面上繼續運作。商店一次只處理一個店面的退款,而完整的訂閱只存在於你的帳號系統裡。也因此,只有它能終止這份訂閱。
為什麼單一商店的退款無法終止跨平台訂閱
Apple 白紙黑字允許這種做法。App Review Guideline 3.1.3(b),也就是 Multiplatform Services 條款指出,跨多個平台營運的 App 可以讓使用者存取他們在其他平台或你的網站上取得的內容、訂閱或功能,前提是這些項目在 App 內也以 App 內購買項目的形式提供。
Apple 關於在多個 App 之間提供同一份訂閱的指南,說明了實際的運作方式。由你的伺服器透過統一的帳號資料庫授予存取權,每個 App 都從這裡讀取。同一份指南也提醒,如果某筆購買沒有同步到其他 App,使用者可能會為同一項服務重複付費。
這種設計有個常被忽略的後果。權益存放在你的資料庫,但每家商店只認得自己的收據。Apple 可以為 iPhone 上的購買退款並通知你的伺服器,卻無法通知你的 Android App 或網站。如果退款處理邏輯只更新 iOS 用戶端,客戶就會拿回款項,同時在其他地方保有訂閱。
| 付款管道 | 由誰決定退款 | 你的伺服器如何得知 | 誰能停止續訂 |
|---|---|---|---|
| App Store | Apple | App Store Server Notifications V2 中的 REFUND 通知 | 客戶本人,在 App Store 訂閱設定或你的 App 開啟的管理畫面中操作 |
| Google Play | 前 48 小時由 Google 決定,之後由你或 Google 決定 | Voided Purchases API 與即時開發人員通知 | 客戶本人,或由你透過 purchases.subscriptionsv2.cancel 處理 |
| 你的網站 | 你 | 金流服務商的 webhook | 你 |
退款後如何在每個平台撤銷存取權
把每筆商店購買綁定到同一個帳號
真正困難的是把退款對應到特定的人,因為每家商店都用自己的方式識別買家。兩家都提供一個欄位,讓你放入自己的帳號 ID。每一筆購買都要用上它。
- 在 Apple,於購買開始時設定 appAccountToken,也就是由你產生的 UUID。App Store 會在交易資訊與續訂資訊中回傳同一個 UUID。Apple 表示,屬於同一位客戶的所有交易都可以重複使用同一個值。
- 如果客戶是在你的 App 以外購買,例如在 App Store 兌換優惠代碼,該筆交易就不會有 token。Set App Account Token 端點可以補上。對自動續訂型訂閱而言,它只適用於目前及之後的續訂,不會回溯過去的交易,也不適用於透過「家人共享」取得的購買。
- 在 Google Play,啟動帳單流程時用 setObfuscatedAccountId 傳入經過混淆的帳號 ID。長度上限為 64 個字元。Google 表示,電子郵件等明文個人資料會導致購買被封鎖,並建議採用加密或單向雜湊。
同時監聽兩家商店,再寫入同一筆權益
Apple 為任何類型的產品退款時都會發送 REFUND,自動續訂型訂閱也包含在內。當 Apple 因客戶提出的爭議而撤回已核准的退款時,會發送 REFUND_REVERSED。在 Google Play,Voided Purchases API 會列出已退款及遭退單的購買,每筆都附有 orderId,可辨識是哪一次購買或續訂。你網站的金流服務商也會送出自己的退款事件。這三者都應該進入同一個處理器,並更新同一筆紀錄。
撤銷的是權益,不是帳號
退款取消的是一筆購買,而不是一個人。先移除這筆已退款購買帶來的存取權,再重新計算這個帳號還剩下哪些權益。如果客戶在另一家商店仍有有效訂閱,就透過那份訂閱保有存取權。如果沒有,每個用戶端在下次向你的伺服器確認時都會失去進階功能。
同一個人在兩家商店都訂閱時
重複訂閱是問題的另一半。有人在 Android 上訂閱,換了新的 iPhone 卻沒有登入,又訂閱了一次。現在他為同一項服務付了兩次錢,而其中一筆通常會變成退款申請。Apple 的商務團隊在 Apple Developer Forums 回覆開發者時說得很直白:App 的帳號系統應該內建防止在另一個平台重複購買的邏輯。
顯示付費牆之前先查過每家商店
在顯示付費牆之前先讓使用者登入,在你的伺服器查詢他所有有效的購買,只要其中任何一筆已涵蓋這個平台,就略過購買方案。光是這一道檢查,就能在大多數重複扣款發生前加以攔阻。
重複購買已經發生,該退哪一筆?
退你能掌控的那一筆。在 Google Play,你可以自己在 Play Console 退款,並以帶有 DEVELOPER_REQUESTED_STOP_PAYMENTS 的 purchases.subscriptionsv2.cancel 停止下一次扣款。網站訂閱則完全由你決定是否退款。App Store 的退款由 Apple 決定,所以如果重複的那份在 iPhone 上,必須由客戶向 Apple 申請,而你的 App 可以透過 StoreKit 的退款申請 API 開啟這項申請。
漏掉某個平台的退款,會讓你付出什麼代價
退還的金額只是第一筆損失。如果客戶的 Apple 退款從未傳到你的 Android App 或網站,他就會繼續使用你花錢維運的服務。每次工作階段仍在消耗運算資源,每個 AI 功能仍在呼叫由你付費的第三方 API。他的檔案仍占用儲存空間,如果你的 App 依觀看次數或使用次數支付創作者分潤,這些款項也會持續撥出。若是年繳方案,這可能代表你要為一個已不再付費的帳號負擔整整一年的服務成本。
走銀行管道的情況更糟。針對 2026 年 8 月 3 日之後成立的 Google Play 訂單,Google 表示一旦退單成立,開發者須負擔扣除 Play 服務費後的購買金額,再加上金融機構收取的退單手續費。退單在銀行端即為定案。一位已經退單卻仍保有存取權的客戶,會讓你同時損失售價、手續費和服務成本。
| 漏撤銷後仍持續發生的支出 | 由誰負擔 |
|---|---|
| Android 或網頁每次工作階段的伺服器運算資源 | 你 |
| 你的功能所呼叫的第三方 API | 你 |
| 使用者檔案與歷史紀錄的儲存空間 | 你 |
| 依使用次數或觀看次數支付給創作者的分潤 | 你 |
| 2026 年 8 月 3 日之後 Google Play 訂單的退單手續費 | 你,另外還要負擔扣除 Play 服務費後的購買金額 |

跨平台使用紀錄依然是證據
當商店要你提出說明時,跨平台共用的帳號同樣派得上用場。Apple 的消耗資訊會詢問客戶用掉了消耗性項目、非消耗性項目或非續訂型訂閱的多少比例。自動續訂型訂閱則不需要傳送百分比,因為 Apple 會依已經過的時間自行計算。Google Play 的退單審查最多接受 1,000 筆消耗使用事件,每一筆都可以附上混淆後的帳號 ID。只要使用紀錄記在同一個帳號 ID 底下,無論來自哪台裝置,都是你可以提出的使用證據。
哪些退款根本不會徵詢你的說法
大多數退款都是在你不知情的情況下決定的。Google Play 可能會在 48 小時內透過自己的退款流程為購買退款。商店客服退款、作廢的購買,以及 Google 在約 72 小時後自動退還你始終未確認的購買,都是先發生、事後才通知。面對這些情況,上述的撤銷邏輯就是你全部的工作。
只有兩種流程會要求你提供證據。Apple 的 CONSUMPTION_REQUEST 給你 12 小時傳送消耗資訊。Google Play 的退單審查則從 PendingRefundReviewNotification 起算給你 24 小時,透過 orders.reviewrefund 回覆,而且 Google 只採計你的第一次呼叫。RefundHalt 會在時限內回覆這兩種請求,所用的是你本來就在收集、並在各個 App 之間以同一帳號為鍵值的使用資料。
跨平台退款的簡易檢查清單
- 在 Apple 購買上設定 appAccountToken,在 Google Play 購買上設定混淆後的帳號 ID。
- 針對兌換優惠代碼的購買,用 Set App Account Token 補上缺少的 Apple token。
- 把 Apple 的 REFUND 與 REFUND_REVERSED、Google Play 的作廢購買,以及網站退款都導向同一個處理器。
- 儲存每筆購買及其來源,並依所有有效購買計算存取權。
- 在任何平台顯示付費牆之前,先檢查每家商店的購買紀錄。
常見問題解答
- 我可以讓 iPhone 使用者使用他們在 Android 或我的網站上購買的訂閱嗎?
- 可以。Apple 的 App Review Guideline 3.1.3(b) 允許跨多個平台營運的 App,讓使用者存取他們在其他平台或你的網站上取得的內容、訂閱或功能,前提是這些項目在 iPhone App 內也以 App 內購買項目的形式提供。
- Apple 為訂閱者退款時,Google Play 或我的網站計費系統會知道嗎?
- 不會。Apple 只會透過 App Store Server Notifications V2 中的 REFUND 通知告訴你的伺服器,不會通知其他地方。你的伺服器必須移除這筆購買在 Android、網頁,以及這個帳號登入的任何其他地方所授予的存取權。
- 要怎麼把 App Store 的退款對應到使用者帳號?
- 使用 appAccountToken,也就是你的 App 附加在購買上的 UUID,App Store 會在交易資訊中回傳。對於在 App 以外完成的購買,例如兌換優惠代碼,Apple 的 Set App Account Token 端點可以新增或取代這個 token。它不支援「家人共享」的交易。
- 客戶同時在 App Store 和 Google Play 訂閱,我該退哪一份?
- 退你能掌控的那一份。你可以在 Play Console 為 Google Play 訂單退款,並以 purchases.subscriptionsv2.cancel 停止下一次扣款。App Store 的退款由 Apple 決定,所以 iPhone 上的重複訂閱要走 Apple 的退款申請,你的 App 可以透過 StoreKit 開啟這項申請。
- 我網站或 Android App 上的使用紀錄,能在退款審查中當作證據嗎?
- 記錄在同一個帳號下的使用資料可以支持你的回覆。Apple 的消耗資訊會詢問消耗性項目、非消耗性項目或非續訂型訂閱被用掉多少比例,而 Google Play 的退單審查最多接受 1,000 筆可附上混淆帳號 ID 的使用事件。
資料來源與延伸閱讀
- Apple: App Review Guidelines, 3.1.3(b) Multiplatform Services
- Apple Developer Documentation: Offering a subscription across multiple apps
- Apple Developer Documentation: Handling refund notifications
- Apple Developer Documentation: notificationType
- Apple Developer Documentation: Set App Account Token
- Android Developers: BillingFlowParams.Builder, setObfuscatedAccountId
- Google Play Developer API: purchases.voidedpurchases
- Google Play Console Help: Updates to refund protection and chargeback cost responsibility
RefundHalt
App Store 與 Google Play 的退款自動駕駛
繼續閱讀
過多的退款申請,代價可能遠超退款本身,因為兩大 App 商店都把它視為品質訊號
Apple 審查準則 5.6.4 把過多的退款申請列為 App 未達品質標準的跡象,Google 的開發人員發布協議也允許它依退款率下架新開發人員的 App。本文整理兩家商店的原文、下架的實際成本,以及如何避開風險。
在處理退款之前先驗證 App Store 伺服器通知,因為任何人都能向你的 webhook URL 發送請求
在檢查簽章之前,一則退款通知只不過是一個 HTTPS 請求。本文說明如何驗證 App Store 伺服器通知和 Google Play RTDN 訊息、各商店簽署的內容,以及偽造的退款或遭錯誤拒絕的退款會讓你付出什麼代價。