如何从苹果内购收据获取订阅支付历史及交易详情?
苹果内购订阅历史记录与交易详情获取指南
嘿,我刚好处理过类似的苹果内购订阅历史查询问题,给你分享一下实际操作中的经验和解决方案:
问题1:iOS 6风格收据转iOS 7风格?或获取指定订阅ID的完整历史记录
首先明确:iOS 6风格收据是仅包含当前订阅状态的老格式,而iOS 7风格收据会包含所有历史交易记录。你不需要转换已有的iOS 6收据,直接获取最新的iOS 7风格收据即可:
- 在React Native中,如果你使用
react-native-iap这类主流内购库,可以调用getReceiptData()方法获取base64编码的iOS 7风格收据(无论当前iOS系统版本如何,这个方法返回的都是包含历史的新格式)。 - 将获取到的收据发送至苹果的验证服务器(生产环境:
https://buy.itunes.apple.com/verifyReceipt;沙箱环境:https://sandbox.itunes.apple.com/verifyReceipt),请求体需要包含receipt-data字段,以及password(你的App Store Connect中的共享密钥)。 - 苹果返回的响应里,
latest_receipt_info字段就是所有历史交易的数组。你可以通过每个交易条目中的product_id(即你的订阅ID)来过滤数组,快速定位到指定订阅的所有历史支付记录。
如果你的App之前只存储了iOS 6风格收据,也可以把它发给苹果验证,不过苹果的响应不会自动补充历史交易——还是建议直接获取最新的iOS 7风格收据更可靠。
问题2:获取支付金额、货币、抽成比例等详细交易信息
苹果的收据响应和交易回调里其实藏着这些信息,只是需要针对性提取或提前存储:
支付日期、金额与货币
- 支付日期:在
latest_receipt_info的每个交易条目中,purchase_date_ms(时间戳)或purchase_date(格式化时间)字段就是支付完成的时间。 - 金额与货币:这里有两个可靠的获取途径:
- 当用户完成订阅支付时,通过
react-native-iap的purchaseUpdatedListener监听交易事件,回调中的product对象会包含price(支付金额)和currency(货币代码),你可以把这些信息和transactionId一起存储到你的后端数据库,后续查询时直接关联即可。 - 如果你依赖收据验证的响应,需要结合App Store Connect中对应
product_id的定价信息(注意不同地区的价格差异),不过这种方式不如交易时直接捕获准确,因为可能存在折扣、试用等特殊情况。
- 当用户完成订阅支付时,通过
折扣与抽成比例
- 折扣信息:收据的交易条目中,
is_trial_period字段标记是否为试用订阅,promotional_offer_id字段对应你设置的促销优惠ID,通过这些可以判断用户是否使用了折扣或试用。 - 抽成比例(15%/30%):苹果的收据不会直接返回抽成比例,但你可以通过两种方式判断:
- 如果你符合苹果的「App Store小企业计划」(年收入低于100万美元),那么所有符合条件的订阅抽成都是15%;否则默认30%。你可以根据订阅的购买时间和你的开发者计划状态来记录。
- 使用苹果的销售与趋势API,可以查询每笔交易的详细分成数据,不过需要在App Store Connect中配置API密钥。
总结步骤
- 在React Native中通过内购库获取iOS 7风格的最新收据。
- 将收据发送至苹果验证服务器,获取包含历史交易的响应。
- 用订阅ID过滤
latest_receipt_info数组,得到目标订阅的历史记录。 - 在交易完成时捕获并存储金额、货币等关键信息,或通过苹果开发者API补充抽成数据。
内容的提问来源于stack exchange,提问作者Greg




