文档地址:developer.apple.com/documentati…
通知消息结构
Apple 通知的 Json 结构如下,参数名已转为小驼峰,与官方文档可一一对应。
{
"autoRenewProductId":"xxx",
"autoRenewStatus":false,
"notificationType":"CANCEL",
"unifiedReceipt":{
"latestReceiptInfo":[
{
"cancelDateMs":1632729959000,
"cancelReason":"0",
"expiresDateMs":1664153326000,
"isInIntroOfferPeriod":false,
"isTrialPeriod":false,
"originalTransactionId":"60000995xxxx",
"productId":"xxx",
"purchaseDateMs":1632617326000
},
{
"expiresDateMs":1632617326000,
"isInIntroOfferPeriod":false,
"isTrialPeriod":true,
"originalTransactionId":"60000995xxxx",
"productId":"xxx",
"purchaseDateMs":1632358126000
}
]
}
}
通知类型及对应的业务场景
此处选取项目中重点使用的类型进行介绍
DID_CHANGE_RENEWAL_STATUS
DID_FAIL_TO_RENEW
DID_RECOVER
DID_RENEW
REFUND
REFUND 通知仅适用于消耗型项目、非消耗型项目和非续期订阅项目。如果是订阅型的内购,Apple 会以 Cancel 事件进行通知。
对于 REFUND 通知,可从响应中识别具体的交易、产品 ID 和相关日期:
- 通过筛选并按
purchase_date排序unified_receipt.latest_receipt_info中的product_id匹配的交易来找到最新的一笔交易信息。 - App Store 发放退款的日期在这笔交易的
cancellation_date_ms栏位中。 - 确认此交易已退款后,可以根据交易 Id 关联到业务方自有的订单并进行后续的退款处理。
补充说明:顾客会以多种方式请求退款,例如:
- 联系 Apple 顾客支持并要求退款
- 登录并使用 Apple 的自助服务工具 reportaproblem.apple.com (英文) 来请求退款
- 向付款方式发行方申请退款
CANCEL
CANCEL 事件用于自动续期型的产品的退款通知。
通过查找通知消息中 unified_receipt.latest_receipt_info 中的 cancellation_date 是否有值来确认苹果是否已执行退款。
此情况出现的可能场景:
- 用户在支付订阅后申请终止订阅,可获得部分退款
- 用户升级到了更高规格的产品