分级订阅的收据验证
将实时通知 (RTN) 结合收据验证服务 (RVS) 使用,帮助您检测和验证级别变化:
- 使用RTN,您可以检测应用的用户所做的订阅级别或期限更改。
- 使用RVS,可以验证应用用户进行的购买。
适用于分级订阅的RTN
当级别发生变化时,实时通知提供实时服务器推送通知。下表提供了有关级别变化通知的详细信息。
通知类型 | 描述 |
---|---|
SUBSCRIPTION_MODIFIED_DEFERRED |
订阅计划已使用“延迟”按比例分配模式进行了修改。已计划在下一个续订日期更改订阅计划。当前计划在续订日期之前仍然有效。 |
SUBSCRIPTION_MODIFIED_IMMEDIATE |
订阅计划已使用“立即”按比例分配模式进行了修改。现有计划已取消,并按比例退款,新计划立即激活。通知包含已取消收据ID。 |
使用RTN捕获这些事件,并使用RVS验证订阅的变化。有关通知类型的完整列表,请参阅支持的通知类型。
RTN响应示例
根据计划变更的性质是立即生效还是延迟生效,亚马逊处理计划变更的方式有所不同。
- 对于立即生效的计划变更:
- 亚马逊会取消当前计划并立即激活新计划。
- 亚马逊会将当前收据ID标记为已取消。
- RTN有效负载的
relatedReceipts
字段包括已取消收据ID。
- 对于延迟计划变更:
- 当前收据仍然有效,亚马逊计划在即将到来的账单周期中让计划变更生效。
- RTN有效负载中的
relatedReceipts
字段是一个空数组。
以下示例显示了SUBSCRIPTION_MODIFIED_IMMEDIATE
和SUBSCRIPTION_MODIFIED_DEFERRED
通知类型的RTN响应。
Example for SUBSCRIPTION_MODIFIED_IMMEDIATE
{
"Type" : "Notification",
"MessageId" : "723acf52-cb22-57f5-b13e-afa29908f61d",
"TopicArn" : "arn:aws:sns:us-east-1:033616359524:MyTopic",
"Message" : "{\"appPackageName\":\"com.example.amazonsdkapivalidator3\",\"notificationType\":\"SUBSCRIPTION_MODIFIED_IMMEDIATE\",\"appUserId\":\"io9oFdzmCSMuKk_pp9pYccoIHRfc6kSAAYaNo51xZrg=\",\"receiptId\":\"R4TWNm8Uspo4Ujio51B5_7xBnRFzr4B2k9Bv48_7mRY=:3:11\",\"relatedReceipts\":{"cancelledReceiptId": "IgThFebRSngPTn9JntrLMby52NqMjyMMQnrUFlczwV0=:3:11"},\"timestamp\":1752584166563,\"betaProductTransaction\":false}",
"Timestamp" : "2025-07-15T12:56:10.667Z",
"SignatureVersion" : "1",
"Signature" : "EXAMPLEw6JRN...",
"SigningCertURL" : "https://sns.us-east-1.amazonaws.com/SimpleNotificationService-9c6465fa7f48f5cacd23014631ec1136.pem",
"UnsubscribeURL" : "https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:033616359524:MyTopic:3c2cebb7-5dc3-4eca-9d55-4e8922144131"
}
以下是JSON格式Message
字段内容的详细展示。
{
"appPackageName": "com.example.amazonsdkapivalidator3",
"notificationType": "SUBSCRIPTION_MODIFIED_IMMEDIATE",
"appUserId": "io9oFdzmCSMuKk_pp9pYccoIHRfc6kSAAYaNo51xZrg=",
"receiptId": "R4TWNm8Uspo4Ujio51B5_7xBnRFzr4B2k9Bv48_7mRY=:3:11",
"relatedReceipts": {
"cancelledReceiptId": "IgThFebRSngPTn9JntrLMby52NqMjyMMQnrUFlczwV0=:3:11"
},
"timestamp": 1752584166563,
"betaProductTransaction": false
}
请注意,relatedReceipts
字段包括已取消收据ID。对于立即生效的计划变更,亚马逊会立即取消当前计划并激活新计划。
SUBSCRIPTION_MODIFIED_DEFERRED示例
{
"Type" : "Notification",
"MessageId" : "64140cd1-13e4-57d8-baf6-6c2141c2646f",
"TopicArn" : "arn:aws:sns:us-east-1:033616359524:MyTopic",
"Message" : "{\"appPackageName\":\"com.example.amazonsdkapivalidator3\",\"notificationType\":\"SUBSCRIPTION_MODIFIED_DEFERRED\",\"appUserId\":\"io9oFdzmCSMuKk_pp9pYccoIHRfc6kSAAYaNo51xZrg=\",\"receiptId\":\"PnkS4FtcuGLylYyc_vNjrN_ucm9hhaur43iCacRAd14=:3:11\",\"relatedReceipts\":{},\"timestamp\":1752584161620,\"betaProductTransaction\":false}",
"Timestamp" : "2025-07-15T12:56:06.409Z",
"SignatureVersion" : "1",
"Signature" : "EXAMPLEw6JRN...",
"SigningCertURL" : "https://sns.us-east-1.amazonaws.com/SimpleNotificationService-9c6465fa7f48f5cacd23014631ec1136.pem",
"UnsubscribeURL" : "https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:033616359524:MyTopic:3c2cebb7-5dc3-4eca-9d55-4e8922144131"
}
以下是JSON格式Message
字段内容的详细展示。
{
"appPackageName": "com.example.amazonsdkapivalidator3",
"notificationType": "SUBSCRIPTION_MODIFIED_DEFERRED",
"appUserId": "io9oFdzmCSMuKk_pp9pYccoIHRfc6kSAAYaNo51xZrg=",
"receiptId": "PnkS4FtcuGLylYyc_vNjrN_ucm9hhaur43iCacRAd14=:3:11",
"relatedReceipts": {},
"timestamp": 1752584161620,
"betaProductTransaction": false
}
注意relatedReceipts
数组是空的。对于延迟生效的计划变更,亚马逊会保留现有收据,并计划在即将到来的账单周期中让计划变更生效。
适用于分级订阅的RVS
对于采用分级订阅的应用,RVS的设置方法与其他应用相同。有关更多详细信息,请参阅适用于Appstore SDK IAP的收据验证服务。
对于采用分级订阅的应用,RVS会对已取消的订阅使用额外的cancelReason
响应代码。
取消原因响应代码
cancelReason
响应代码是一个长整数,可指示产品被取消的原因。可能的值为null、0、1、2或4,其中每个整数分别代表一项取消原因,如下表所述:
cancelReason代码 | 描述 |
---|---|
null |
购买未取消。 |
0 |
当前无法提供取消原因,将在之后提供。 |
1 |
客户取消了订单。 |
2 |
亚马逊系统取消了购买。例如,客户用于购买订阅的付款无效,并且未在宽限期内完成购买。 |
4 |
订阅已被新的订阅取代。例如,如果客户换成新的级别,则会取消原有收据并提供新收据。 |
cancelReason
响应代码3
是亚马逊内部使用的代码。您可以在RVS文档中找到完整的响应字段列表。
RVS响应示例
以下代码示范了一个完整的RVS响应:
{
"autoRenewing":false,
"betaProduct":true,
"cancelDate":1400784371000,
"cancelReason":4,
"countryCode":"US",
"freeTrialEndDate":null,
"gracePeriodEndDate":null,
"parentProductId":null,
"productId":"sub1",
"productType":"SUBSCRIPTION",
"purchaseDate":1400784241000,
"quantity":null,
"receiptId":"JyGJ5iEtYgFu1ngnQovTqSIHQxR53GsMLqkR1tKLp5c=:3:11",
"renewalDate":null,
"term":“1周”,
"termSku":"sub1-weekly",
"testTransaction":true
}
cancelReason
表示应用已更改为不同的级别,从而取消了之前的订阅。
如需查看更多RVS示例,请参阅适用于Appstore SDK IAP的RVS示例。
Last updated: 2025年7月22日