每次續訂都有自己的 Google Play 訂單編號,退款前要核對的就是這個號碼
像 GPA.1234-5678-9012-34567..2 這樣的 Google Play 訂單編號對應一筆確切的扣款。本文說明如何解讀續訂後綴,如何在 Play Console 或 Orders API 中查詢訂單,以及如何退還客戶真正指的那筆扣款,避免為錯誤的訂單付出代價。

重點摘要
- Google Play 訂單編號的格式類似 GPA.1234-5678-9012-34567,訂閱續訂會加上後綴,因此 GPA.1234-5678-9012-34567..0 是該訂閱的第一次續訂。
- 對於訂閱續訂,Play Billing Library 的 getOrderId() 傳回的是初始訂單的訂單編號,而不是續訂本身的編號;購買處於 PENDING 狀態時則傳回 null。
- Google 於 2025 年 5 月 21 日在 Play Developer API 的 Orders 資源中新增了 get 和 batchGet。batchGet 接受 1 到 1,000 個不重複的訂單編號,只要其中任何一個找不到,整個要求就會失敗。
- Orders API 傳回的 Order 帶有 PENDING、PROCESSED、CANCELED、PENDING_REFUND、PARTIALLY_REFUNDED 或 REFUNDED 狀態,以及 developerRevenueInBuyerCurrency,該金額已扣除部分退款、稅金和手續費。
- Google Play 的 orders.refund 方法無法退還超過 3 年的訂單,傳入 revoke=true 會立即終止客戶對該訂閱或商品的存取權。
- 在 Play Console 中,「退款並撤銷」(Refund and revoke)適用於訂閱中最近的一筆訂單,「僅退款」(Refund only)則適用於較早的訂單,訂閱會維持有效。
- 購買後 48 小時內的退款要求由 Google Play 自行處理。超過 48 小時後,Google 會請客戶聯絡開發人員,這時訂單編號通常就會出現在你的客服收件匣。
替 Google Play 客戶退款之前,先看訂單編號的結尾。GPA.1234-5678-9012-34567 是一個訂閱的第一筆扣款,GPA.1234-5678-9012-34567..2 是第三筆。它們共用同一個基礎編號,卻是不同的付款,退款時 Play Console 對它們的處理方式也不同。Google Play 訂單編號是客戶唯一看得到的識別碼,所以最後出現在你客服收件匣裡的就是它。讀對了,你就能把客戶真正不滿的那筆扣款退掉,而且只退一次。
Google Play 訂單編號能告訴你什麼
Google 的 Play Billing Library 說明文件以範例說明格式。訂單編號以 GPA 開頭,後面是幾組數字。對於訂閱,每次續訂都會在基礎訂單編號後加上兩個點和一個從零開始的計數器。因此,原始購買沒有後綴,第一次續訂是 ..0,第二次是 ..1,依此類推。
如此一來,看後綴就能快速判斷客戶已經付費多久。來信提到 GPA.3333-4137-0319-36762..11 的客戶已經續訂了十二次。引用不帶後綴的基礎編號的客戶,要不是只買過一次,就是指他們的第一筆付款。
| 訂單編號 | 代表意義 |
|---|---|
| GPA.1234-5678-9012-34567 | 單次購買,或訂閱的第一筆扣款 |
| GPA.1234-5678-9012-34567..0 | 該訂閱的第一次續訂 |
| GPA.1234-5678-9012-34567..1 | 第二次續訂 |
| Billing Library 中的 null | 仍處於 PENDING 狀態、Google 尚未處理付款的購買 |
訂單編號出現在哪裡,你拿到的是哪個版本
團隊常在這裡出錯。不同的地方給你的是同一個編號的不同形式。
- 客戶的 Google Play 收據顯示的是該筆扣款的訂單編號,續訂也包含在內。
- 在你的應用程式中,Play Billing Library 的 Purchase.getOrderId() 對訂閱續訂傳回的是初始訂單的訂單編號。Google 自己的範例:你拿到的不是 GPA.1234-5678-9012-34567..0,而是 GPA.1234-5678-9012-34567。
- 在伺服器端,purchases.subscriptionsv2 為每個訂單項目提供 latestSuccessfulOrderId,也就是該項目最近一筆成功訂單的編號。Google 於 2025 年 5 月 21 日新增了這個欄位。
- 在 Voided Purchases API 中,orderId 可唯一識別單次購買、訂閱購買或訂閱續訂。Google 說明文件指出,要用 orderId 而不是購買憑證來區分各次續訂。
購買憑證的用途
購買憑證識別的是整筆購買。對於訂閱,一個憑證涵蓋原始扣款及之後的每次續訂。這就是為什麼它適合用來管理權益,卻不適合用來退款。退款和退單針對的是單筆扣款,而只有訂單編號能指向單筆扣款。
如何查詢 Google Play 訂單
在 Play Console 中
訂單管理(Order management)的搜尋框接受訂單編號或客戶的完整電子郵件地址。每筆訂單會顯示下列其中一種狀態:已處理(Processed)、已取消(Cancelled)、待處理(Pending)、待退款(Pending refund)、已退款(Refunded)、待部分退款(Pending partial refund)或已部分退款(Partially refunded)。如果客戶給你的是電子郵件地址而不是收據,就用電子郵件搜尋,依日期找出那筆扣款,然後在採取行動前確認後綴。
使用 Orders API
自 2025 年 5 月 21 日起,Google Play Developer API 的 Orders 資源提供 orders.get 查詢單筆訂單,orders.batchget 查詢多筆訂單。實務上有幾項限制需要注意:
- batchget 每個要求接受 1 到 1,000 個訂單編號,且不得重複。
- 只要有一個訂單編號找不到或不屬於該套件,整個 batchget 要求就會失敗。
- Orders API 的呼叫會計入你的 Play Developer API 配額,預設為每天 200,000 次呼叫。
真正有用的是傳回的 Order。它包含訂單的 state、purchaseToken、createTime 和 lastEventTime、總額和稅額、salesChannel(例如 IN_APP 或 PLAY_STORE),以及記錄處理、取消、退款和部分退款事件的 orderHistory。它還包含 developerRevenueInBuyerCurrency,Google 將其定義為以買家幣別計算、已扣除部分退款、稅金和手續費的開發人員收益。當 Google 是登記商家(merchant of record)時,買家地址只會包含國家/地區。
| 訂單狀態 | Google 參考文件的說明 |
|---|---|
| PENDING | 已建立,等待處理 |
| PROCESSED | 已成功處理 |
| CANCELED | 在處理前已取消 |
| PENDING_REFUND | 已提出的退款要求正在等待處理 |
| PARTIALLY_REFUNDED | 訂單金額已部分退還 |
| REFUNDED | 訂單金額已全額退還 |
退還正確的訂單
確定客戶指的是哪筆扣款後,Play Console 會依該訂單在訂閱中的位置提供不同選項。
| 選項 | 適用對象 | 結果 |
|---|---|---|
| 退款並撤銷(Refund and revoke) | 訂閱中最近的一筆訂單 | 核發退款,立即移除訂閱,取消後續續訂 |
| 僅退款(Refund only) | 訂閱中較早的訂單 | 核發退款,訂閱維持有效 |
| 部分退款(Partial refund) | 2018 年 3 月之後訂購的應用程式內購買和訂閱,不含付費應用程式 | 低於 100% 的任意比例,或低於訂單總額的稅前金額 |
| 取消訂閱(Cancel subscription) | 有效的訂閱 | 不退款,存取權持續到目前帳單週期結束 |
透過 API,orders.refund 接受套件名稱和訂單編號。超過 3 年的訂單無法退款。選用的 revoke 參數設為 true 時,會立即終止對訂閱或應用程式內商品的存取權。Google 說明中心也指出,退款一經核發便無法撤回,因此你傳入的訂單編號就是最終決定。
為什麼訂閱者會出現一筆 $0.00 的訂單?
Google 的訂閱生命週期說明文件對此有解釋。當使用者在訂閱到期前從你的應用程式再次註冊同一個基本方案時,Google Play 會建立一筆 $0.00 的訂單。使用者不會被扣款,因為他們已經為目前週期付過費,正常計費會在原本的續訂日期恢復。這既不是免費試用,也不是促銷。這筆訂單沒有可退的金額。如果客戶想要退款,請找出它之前的那筆付費訂單。
退錯訂單的代價
退款退還的是售價。部分退款依比例同理。Google 的範例:50% 的部分退款也會收回你 50% 的收益和 50% 的服務費。收不回來的是你為該客戶提供服務所花的一切,包括運算資源、第三方 API 呼叫、儲存空間以及任何聯盟分潤。退錯了訂單,這些成本你就要付兩次。
事情通常是這樣發生的。一位月繳方案的客戶來信詢問 ..4 那筆扣款,也就是上週那筆。你團隊裡有人用電子郵件搜尋,看到最上面是第一筆訂單,就對幾個月前的基礎訂單按下「僅退款」。現在客戶拿回了一個已經使用過的週期的錢,他們投訴的那筆扣款卻原封不動,訂閱也照常續訂。他們仍然可以要求銀行撤銷上週的扣款。

如今,走銀行這條路的代價最高。Google 表示,對於 2026 年 8 月 3 日之後下的訂單,退單一旦成立,開發人員須承擔購買價格(扣除 Play 服務費)以及銀行收取的退單費用。退單在銀行端是最終結果。一次看錯後綴,最後可能損失相當於兩次退款的金額,再加上手續費。
哪些退款根本不會進到你的收件匣
大多數 Google Play 退款根本不需要你,也不需要訂單編號。Google 的退款政策規定,客戶在購買後 48 小時內可以透過 Google Play 取得退款,超過 48 小時則應聯絡開發人員。對於你在三天內未確認的訂閱,Google 也會退款並撤銷。你會在事後透過 Voided Purchases API 得知這些情況,該 API 會回報 voidedSource(0 代表使用者,1 代表開發人員,2 代表 Google)以及 voidedReason,例如 Remorse、Chargeback 或 Unacknowledged_purchase。
只有一種 Google Play 退款流程需要你表態。當退單需要開發人員審查時,你有 24 小時可透過 orders.reviewrefund 回覆,提交 APPROVE、DECLINE 或 NEUTRAL 的退款偏好以及購買使用情形證據。RefundHalt 會在期限內用你已有的使用資料替你回覆該審查,讓有爭議的訂單得到你的證據,而不是沉默。
訂單編號客服工單簡易檢查清單
- 向客戶索取 Google Play 收據上的完整訂單編號,包括後綴。
- 在 Play Console 中或用 orders.get 查詢,並先檢查其狀態。
- 確認扣款日期與客戶的描述相符。
- 「退款並撤銷」只用於最近的一筆訂單,較早的訂單則用「僅退款」。
- 記錄你退款的訂單編號,這樣日後另一筆訂單發生退單時就容易發現。
常見問題解答
- Google Play 訂單編號結尾的 ..0 是什麼意思?
- 它代表訂閱的第一次續訂。Google Play 為每次續訂指派的編號是訂閱的基礎訂單編號加上兩個點和一個從零開始的計數器,因此 GPA.1234-5678-9012-34567..0 是第一次續訂,..1 是第二次。不帶後綴的基礎編號是原始扣款。
- 為什麼我應用程式中 getOrderId() 傳回的訂單編號與客戶收據上的不同?
- 因為對於訂閱續訂,Play Billing Library 傳回的是初始訂單的編號。Google 的範例是,對於第一次續訂,getOrderId() 傳回的不是 GPA.1234-5678-9012-34567..0,而是 GPA.1234-5678-9012-34567。請在伺服器端使用 purchases.subscriptionsv2 的 latestSuccessfulOrderId 取得續訂本身的編號。
- 如何用訂單編號查詢 Google Play 訂單?
- 在 Play Console 的訂單管理(Order management)中搜尋,它接受訂單編號或客戶的完整電子郵件地址;也可以呼叫 Google Play Developer API 的 orders.get。orders.batchget 可一次查詢 1 到 1,000 個不重複的訂單編號,只要其中任何一個找不到,整個要求就會失敗。
- 超過一年的 Google Play 訂單還能退款嗎?
- 可以,最長 3 年。Google 的 orders.refund 參考文件指出,超過 3 年的訂單無法退款。對於訂閱中較早的訂單,Play Console 的「僅退款」(Refund only)選項會退還款項,訂閱維持有效。
- 為什麼訂閱者會有一筆 $0.00 的 Google Play 訂單?
- 當使用者在訂閱到期前從你的應用程式再次註冊同一個基本方案時,就會出現這種訂單。使用者不會被扣款,因為他們已經為目前週期付過費,正常計費會在原本的續訂日期恢復。Google 表示,這並不代表提供了免費試用或促銷折扣。
資料來源與延伸閱讀
- Android Developers: Purchase (Play Billing Library), getOrderId
- Google Play Developer API: REST Resource orders
- Google Play Developer API: orders.batchget
- Google Play Developer API: orders.refund
- Google Play Developer API release notes
- Google Play Developer API: purchases.voidedpurchases
- Play Console Help: Issue refunds or cancel orders
- Google Play Billing: Subscription lifecycle
- Google Play Help: Apps, games and in-app purchases refund policies
- 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 訊息、各商店簽署的內容,以及偽造的退款或遭錯誤拒絕的退款會讓你付出什麼代價。