所有文章
實戰指南閱讀時間 7 分鐘

客戶收據上的 App Store 訂單 ID 能告訴你他們買了什麼,以及 Apple 是否已經退款

Apple 的 Look Up Order ID 端點能把客戶 App Store 收據上的訂單 ID 轉換成已簽署的交易,其中包含退款日期與原因。本文說明如何用它處理退款郵件、它做不到什麼,以及 Google Play 的訂單 ID 有何不同。

客服桌上放著顯示收件匣的筆電和顯示購買收據的 iPhone,App Store 訂單 ID 是退款溝通的起點

重點摘要

  • 客戶每次進行 App 內購買,Apple 都會寄出一封附有訂單 ID 的電子郵件收據,客戶也可以在 App Store 購買記錄中找到自己的訂單 ID。
  • Apple 的 App Store Server API 端點 Look Up Order ID(GET /inApps/v1/lookup/{orderId})會針對有效的訂單 ID 回傳一筆或多筆已簽署交易,客服不必猜測就能看到 productId 和 purchaseDate。
  • 解碼後的 App Store 交易包含 revocationDate 和 revocationReason,因此查詢訂單 ID 就能看出 Apple 是否已對該筆購買退款。原因值 1 代表 Apple 因 App 內實際存在或被認為存在的問題而退款。
  • 當訂單 ID 對你的 App 無效時,Look Up Order ID 會回傳 OrderLookupStatus 1 且不含 signedTransactions 陣列,這表示收據有誤或購買來自其他 App。
  • Look Up Order ID 在 Apple 的沙盒環境中無法使用,正式環境的速率限制為每個 App 每秒 10 個請求,按小時執行。
  • 開發者無法發起 App Store 退款。退款由 Apple 在 reportaproblem.apple.com 決定,開發者唯一能提交證據的環節,是在 12 小時內回應 CONSUMPTION_REQUEST。
  • Google Play 會為每筆一次性購買和每次訂閱續訂寄出附有訂單 ID 的郵件,開發者可以在 Play Console 中搜尋該訂單 ID 並直接退款。Play Console 表示退款無法撤銷。

在回覆 iPhone 客戶的退款郵件之前,先請對方提供 Apple 收據上的 App Store 訂單 ID。把這串字元交給 Apple 的 Look Up Order ID 端點,就能知道對方買了哪個產品、何時購買,以及 Apple 是否已經退款。沒有它,你只能拿截圖和電子郵件地址去比對資料庫,碰碰運氣。有了它,幾秒鐘就能判斷對方是付費客戶、已被 Apple 退過款的客戶,還是拿著別的 App 收據的人。

App Store 訂單 ID 從哪裡來

Apple 的文件寫得很明確。客戶在你的 App 中進行一次或多次 App 內購買時,App Store 會寄給他們電子郵件收據,收據上有訂單 ID。客戶也可以在 App Store 的購買記錄中找到訂單 ID。Apple 的購買記錄頁面位於 reportaproblem.apple.com,也可以在 App Store App 的「App 與購買記錄」中查看,預設顯示最近 90 天,並可篩選更早的購買。

所以鑰匙早就在客戶手上。你的客服表單只需要開口要。

為什麼只有電子郵件地址不夠

Apple 不會把客戶的 Apple 帳號電子郵件分享給你。寫信到你客服信箱的地址,可能和付款的帳號毫無關係。如果你在購買時設定了 appAccountToken,就能把交易和你自己的使用者 ID 連結起來,但這只能從你這一端做到。訂單 ID 則來自客戶那一端,來自一張輕點一下就能轉寄的收據。

Look Up Order ID 會回傳什麼

Look Up Order ID 屬於 App Store Server API,自 1.1.0 版起提供。你用簽署過的 JWT 呼叫 GET https://api.storekit.apple.com/inApps/v1/lookup/{orderId}。Apple 表示,回應以客戶的 App 內購買記錄為依據,不論客戶是否安裝、移除或重新安裝了 App。

欄位或行為Apple 文件的說法客服如何運用
OrderLookupStatus 0訂單 ID 有效。回應包含一筆或多筆已簽署交易組成的陣列逐筆解碼並查看購買內容
OrderLookupStatus 1回應不包含 signedTransactions 陣列視為該訂單 ID 對你的 App 無效。請對方提供正確的收據
productId 和 purchaseDateApple 指明這兩個欄位用於客戶支援確認買了什麼、何時買的
revocationDateApp Store 退款或將該交易從家人共享中撤銷的時間若有值,代表 Apple 已經把錢退給客戶
revocationReason0:因其他原因退款,例如誤購。1:因 App 內實際存在或被認為存在的問題而退款值為 1 是產品訊號,不只是一張客服工單
appAccountToken你在購買時設定的 UUID(若有設定)將訂單與你自己的使用者紀錄對應
price 和 currencyApple 表示不要用它們做營收對帳金額請以 App Store Connect 報告為準
沙盒此端點在沙盒環境中無法使用只能用正式環境的訂單 ID 測試
速率限制每個 App 每秒 10 個請求,按小時執行。超出會收到帶有 Retry-After 標頭的 HTTP 429對客服櫃台綽綽有餘,但不適合大量掃描

這是我的 App 的有效收據嗎?

OrderLookupStatus 最先回答的就是這個問題。值為 1 代表該訂單 ID 沒有對應到你 App 中的購買。常見情況是打錯字、收據來自其他 App,或者收據根本不是 App Store 的。狀態為 1 時,不要退款、不要贈送額度、不要恢復任何東西。請客戶再核對一次收據。

Apple 是否已經對這筆購買退款?

檢查每筆解碼交易中的 revocationDate。如果有值,代表 Apple 已經對該購買退款或將其從家人共享中撤銷,客戶已經拿回了錢。你的 App Store Server Notifications 應該已經為同一筆交易送出 REFUND,所以這也是確認伺服器是否真的撤銷存取權的低成本方法。

開發者將印出的 App Store 收據與筆電上的交易紀錄逐列對照,在回覆退款請求前核對 App Store 訂單 ID

訂單 ID 在 App Store 上做不到什麼

它無法發起退款。開發者沒有 App Store 退款按鈕。退款由 Apple 決定,Apple 的支援文章會把客戶引導到 reportaproblem.apple.com,客戶在那裡選擇「I'd like to」,再選擇「Request a refund」,挑一個原因,然後選取對應的項目。Apple 也表示,在客戶收到電子郵件收據之前,處理中的扣款無法退款。

你唯一能表達意見的地方是 Apple 的 CONSUMPTION_REQUEST。客戶向 Apple 申請退款時,Apple 可能會送出這個通知,你有 12 小時透過 Send Consumption Information 回應。查詢訂單 ID 只是客服工具,它不會開啟這個期限,也不會延長它。

跳過查詢時,一封退款郵件會讓你付出什麼代價

不看訂單 ID 的客服,正是錢悄悄流失的地方。有三種情況一再出現。

  • 退款之外再送補償。Apple 已經退款,客戶又寫信給你,客服再贈送免費額度或多一個月。你送出的每一份額度都要消耗你付費的運算、API 呼叫和儲存空間,而這個帳號早已拿回了錢。
  • 從未被撤銷的存取權。如果你的 REFUND 處理失敗,已退款的客戶還會繼續產生用量。查詢顯示有 revocationDate,而你的資料庫仍顯示有效,這就是一份附上價格標籤的錯誤回報。
  • 帳號找錯,處理也錯。訂單 ID 屬於別人,你卻為轉寄郵件背後的帳號恢復權益或贈送額度,等於把付費服務給了一個從沒買過的人。

這些情況都不需要爭議或截止期限就能造成損失。它們只是缺乏事實根據的客服回覆。每張工單呼叫一次 API,就不必再猜。

revocationReason 為 1 是否代表我做錯了什麼?

不一定。Apple 表示原因值 1 代表它因 App 內實際存在或被認為存在的問題而退款。「被認為」這幾個字分量很重。但如果某個產品在某次改版後集中出現原因值為 1 的退款,那就是 Apple 給你最清楚的產品回饋。把它們統計出來。

Google Play 的訂單 ID 有何不同

Google Play 的做法正好相反。Google 的帳款文件表示,使用者在每次一次性產品購買、首次訂閱購買以及每次定期續訂時,都會收到一封附有唯一訂單 ID 的郵件,你可以用訂單 ID 在 Play Console 中管理退款。你在訂單管理中依訂單 ID 或使用者的完整電子郵件地址搜尋,然後自行退款。

問題App Store 訂單 IDGoogle Play 訂單 ID
客戶在哪裡找到它電子郵件收據和 App Store 購買記錄每次購買和每次續訂的電子郵件收據
你如何查詢App Store Server API 中的 Look Up Order ID在 Play Console 的訂單管理中搜尋
能否憑它退款不能。由 Apple 決定可以。可全額退款,應用程式內購買和訂閱還可部分退款
退款的證據期限CONSUMPTION_REQUEST,12 小時,由 Apple 決定透過 orders.reviewrefund 進行退單審查,24 小時
退款能否撤回你無法撤回不能。Play Console 表示退款無法撤銷

在 Google Play 上,訂單 ID 更加重要,因為按下按鈕的是你自己。Play Console 表示,對最近一筆訂閱訂單退款會立即移除訂閱並取消後續續訂,而對較早的訂單退款則只退款,訂閱仍維持有效。部分退款僅支援 2018 年 3 月之後下的訂單,付費 App 不能部分退款。

把訂單 ID 放在退款客服流程的最前面

  • 在客服表單中索取訂單 ID,並附上一行提示:它在 Apple 或 Google Play 的收據郵件裡。
  • 在 iOS 上,呼叫 Look Up Order ID,解碼每一筆交易,在同一個畫面上向客服顯示 productId、purchaseDate、revocationDate 和 revocationReason。
  • 如果 OrderLookupStatus 為 1,先停下來,請對方提供正確的收據。什麼都不要給。
  • 如果 revocationDate 有值,確認你的伺服器已撤銷存取權,然後結案。不要額外補償。
  • 如果沒有值而客戶想要退款,請把他們引導到 reportaproblem.apple.com,並讓你的 CONSUMPTION_REQUEST 處理程式為 12 小時期限做好準備。RefundHalt 會用 Apple 要求的使用資料回應該請求。
  • 在 Android 上,退款前先在 Play Console 中找到確切的訂單,並刻意在「僅退款」和「退款並撤銷」之間做出選擇。

常見問題解答

身為開發者,要如何查詢 App Store 訂單 ID?
使用簽署過的 JWT 呼叫 App Store Server API 端點 Look Up Order ID,也就是 GET https://api.storekit.apple.com/inApps/v1/lookup/{orderId}。有效的訂單 ID 會回傳 OrderLookupStatus 0 以及一筆或多筆已簽署交易,解碼後即可查看 productId、purchaseDate 和任何退款細節。此端點在沙盒中無法使用。
客戶在哪裡找到自己的 App Store 訂單 ID?
在每次進行 App 內購買後 Apple 寄出的電子郵件收據中,以及在 reportaproblem.apple.com 或 App Store App 的「App 與購買記錄」裡的 App Store 購買記錄中。購買記錄預設顯示最近 90 天,並可篩選更早的購買。
我可以用訂單 ID 為 App Store 購買退款嗎?
不行。開發者無法發起 App Store 退款。客戶在 reportaproblem.apple.com 申請退款後,由 Apple 決定。你能做的是在 12 小時內透過 Send Consumption Information 回應 Apple 的 CONSUMPTION_REQUEST。
如何得知 Apple 是否已經對一筆購買退款?
查詢訂單 ID,並檢查每筆解碼交易中的 revocationDate。如果有值,代表 Apple 已對該購買退款或將其從家人共享中撤銷。revocationReason 為 0 代表其他原因,例如誤購,為 1 代表 App 內實際存在或被認為存在的問題。
OrderLookupStatus 1 是什麼意思?
代表該訂單 ID 對你的 App 無效,回應中沒有 signedTransactions 陣列。通常是客戶寄來其他 App 的收據、打錯 ID,或寄來的收據不是 App Store 的。在給予任何東西之前,請對方提供正確的收據。

資料來源與延伸閱讀

RefundHalt

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

繼續閱讀

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

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