客户收据上的 App Store 订单 ID 能告诉你他们买了什么,以及 Apple 是否已经退款
Apple 的 Look Up Order ID 端点可以把客户 App Store 收据上的订单 ID 转换为已签名的交易,其中包括退款日期和原因。本文介绍如何用它处理退款邮件、它做不到什么,以及 Google Play 的订单 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 和 purchaseDate | Apple 指明这两个字段用于客户支持 | 确认买了什么、何时买的 |
| revocationDate | App Store 退款或从家人共享中撤销该交易的时间 | 如果存在,说明 Apple 已经把钱退给了客户 |
| revocationReason | 0:因其他原因退款,例如误购。1:因 App 内实际存在或被认为存在的问题而退款 | 值为 1 是产品信号,不只是一张客服工单 |
| appAccountToken | 你在购买时设置的 UUID(如果设置了) | 将订单与你自己的用户记录对应起来 |
| price 和 currency | Apple 表示不要用它们做收入对账 | 涉及金额时以 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,所以这也是确认服务器是否真正撤销访问权限的低成本方法。

订单 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 订单 ID | Google 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 的。在给予任何东西之前,请对方提供正确的收据。
来源和延伸阅读
- Apple Developer Documentation: Look Up Order ID
- Apple Developer Documentation: orderId
- Apple Developer Documentation: revocationReason
- Apple Developer Documentation: Identifying rate limits
- Apple Support: See your purchase history for the App Store, iTunes Store, and more
- Apple Support: Request a refund for apps or content that you bought from Apple
- Play Console Help: Refund orders and subscriptions
- Android Developers: Integrate the Google Play Billing Library into your app
RefundHalt
App Store 和 Google Play 退款自动驾驶
继续阅读
iOS 网页结账的退款不再归 Apple,而是归你,银行争议也一样
美国的 iPhone 应用现在可以把买家引导到网页结账。Apple 表示无法协助处理这类销售的退款,于是退款处理、拒付以及 $15 的争议费都转到了你身上。本文说明哪些地方变了、要花多少钱,以及如何减少争议。
付费应用的退款永远不会通知你的服务器,所以只能由应用自己发现
买断制付费应用的退款会绕过你的服务器监听的所有通知。Google 给买家两小时的退货期并卸载应用,Apple 可依据你签署的协议在 90 天内退款,两者都不会向你索取证据。本文说明每个商店会告诉你什么、退款让你损失什么,以及如何在应用内检测。