求Apple Server-to-Server退款通知responseBodyV2DecodedPayload示例
Apple Server Notification REFUND类型完整解码Payload示例及模拟生产测试方案
一、REFUND类型完整解码Payload示例
以下是生产环境中REFUND类型通知的解码后Payload完整示例,包含JWSTransaction的核心字段:
{ "notificationType": "REFUND", "subtype": "FULFILLMENT_REFUND", "notificationUUID": "123e4567-e89b-12d3-a456-426614174000", "version": "2.0", "signedDate": 1699999999000, "data": { "appAppleId": 123456789, "bundleId": "com.yourcompany.yourapp", "bundleVersion": "1.0.0", "environment": "PRODUCTION", "signedTransactionInfo": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJBcHBsZSBTdG9yZSBDb25uZWN0IiwiaWF0IjoxNjk5OTk5OTk5LCJleHAiOjE3MzE1MzU5OTksImRhdGEiOnsidHJhbnNhY3Rpb25JZCI6IlQxMjM0NTY3ODkwMTIzNDUiLCJvcmlnaW5hbFRyYW5zYWN0aW9uSWQiOiJPMTIzNDU2Nzg5MDEyMzQ1IiwicHVyY2hhc2VEYXRlIjoxNjk5OTk5ODAwMDAwLCJleHBpcmVzRGF0ZSI6MTcwMjU5MTgwMDAwMCIsInF1YW50aXR5IjoxLCJwcm9kdWN0SWQiOiJjb20ueW91cmNvbXBhbnkueW91cnByb2R1Y3QxIiwic3Vic2NyaXB0aW9uR3JvdXBSZWZlcmVuY2VyIjoiY29tLnlvdXJjb21wYW55LnN1YnNjcmlwdGlvbi1ncm91cCIsIndlYk9yZGVyTGluZUl0ZW1JZCI6IkxMTIzNDU2Nzg5MDEyMzQ1IiwiaXNVcGdyYWRlZCI6dHJ1ZSwib2ZmZXJUeXBlIjoxLCJvZmZlcklkZW50aWZpZXIiOiJPRkZFUl8xMjM0NTY3ODkiLCJyZWZ1bmRUeXBlIjoiRlVMRklMTUVOVF9SRUZVTkQiLCJyZWZ1bmREYXRlIjoxNjk5OTk5OTAwMDAwLCJyZWZ1bmRBbW91bnQiOiIxMDAwIiwiY3VycmVuY3kiOiJVUyJ9fQ.ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "signedRenewalInfo": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJBcHBsZSBTdG9yZSBDb25uZWN0IiwiaWF0IjoxNjk5OTk5OTk5LCJleHAiOjE3MzE1MzU5OTksImRhdGEiOnsic3Vic2NyaXB0aW9uSWQiOiJTMTIzNDU2Nzg5MDEyMzQ1Iiwib3JpZ2luYWxUcmFuc2FjdGlvblV1aWQiOiJVMjM0NTY3ODkwMTIzNDUiLCJ1c2VySWQiOiJVMTIzNDU2Nzg5MDEyMzQ1IiwidHJhbnNhY3Rpb25JZCI6IlQxMjM0NTY3ODkwMTIzNDUiLCJvcmlnaW5hbFRyYW5zYWN0aW9uSWQiOiJPMTIzNDU2Nzg5MDEyMzQ1IiwicHJvZHVjdElkIjoiY29tLnlvdXJjb21wYW55LnN1YnNjcmlwdGlvbi1wcm9kdWN0IiwidXNlck5hbWUiOiJUb20zNjUyIiwidXNlckVtYWlsIjoib3JnYW5pemVyQHlvdXJjb21wYW55LmNvbSIsInJlZnJlbmNlVGltZXN0YW1wIjoxNjk5OTk5OTAwMDAwLCJyZWZ1bmVBbW91bnQiOiIxMDAwIiwiY3VycmVuY3kiOiJVUyIsInJlZnJlbmNlVHlwZSI6IkZVTExJTUVOVF9SRUZVTkQifXw.ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba0987654321" }, "summary": { "requestIdentifier": "REQ_123456789012345", "refundCount": 1, "totalRefundAmount": { "amount": "1000", "currency": "US" } } }
解码后的JWSTransaction核心字段说明:
transactionId: 当前交易唯一IDoriginalTransactionId: 原始订阅/购买的根交易IDpurchaseDate: 购买完成的时间戳(毫秒级)expiresDate: 订阅到期时间戳(仅订阅类商品)quantity: 购买数量productId: 内购商品IDsubscriptionGroupIdentifier: 订阅组唯一标识(仅订阅类)webOrderLineItemId: 苹果订单系统中的行项目IDisUpgraded: 是否为订阅升级/降级操作产生的交易offerType: 优惠类型(0=无优惠,1=介绍期优惠,2=促销优惠,3=家庭共享优惠)offerIdentifier: 优惠活动的唯一标识refundType: 退款类型(如FULFILLMENT_REFUND表示已履约后的退款)refundDate: 退款操作完成的时间戳refundAmount: 退款金额(最小货币单位,如1000代表10美元)currency: 退款使用的货币代码
二、模拟生产请求的完整测试Payload获取方法
沙箱环境触发真实退款通知
- 用App Store Connect创建的沙箱测试账号完成内购购买,再通过App Store Connect的“订单管理”手动发起退款,沙箱会发送结构与生产一致的完整通知到你的服务器,仅
environment字段为SANDBOX。
- 用App Store Connect创建的沙箱测试账号完成内购购买,再通过App Store Connect的“订单管理”手动发起退款,沙箱会发送结构与生产一致的完整通知到你的服务器,仅
自行构造测试Payload
- 按照苹果JWT规范,使用你的App Store Connect私钥(.p8文件)签名自定义Payload:
- 头部指定算法为
ES256、类型为JWT - 负载包含
iss(Issuer ID)、iat(签发时间戳)、exp(过期时间戳),以及上述示例中data字段的所有核心内容
- 头部指定算法为
- 将签名后的完整JWT字符串作为请求体发送到你的服务器,模拟苹果生产环境的通知请求格式。
- 按照苹果JWT规范,使用你的App Store Connect私钥(.p8文件)签名自定义Payload:
内容的提问来源于stack exchange,提问作者Tom3652
相关产品推荐
相关产品推荐

