Apple Stote Server Notifications 对接

2,370 阅读2分钟

文档地址: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 是否有值来确认苹果是否已执行退款。

此情况出现的可能场景:

  • 用户在支付订阅后申请终止订阅,可获得部分退款
  • 用户升级到了更高规格的产品