开发者控制台

分级订阅的收据验证

分级订阅的收据验证

将实时通知 (RTN) 结合收据验证服务 (RVS) 使用,帮助您检测和验证级别变化:

  • 使用RTN,您可以检测应用的用户所做的订阅级别或期限更改。
  • 使用RVS,可以验证应用用户进行的购买。

适用于分级订阅的RTN

当级别发生变化时,实时通知提供实时服务器推送通知。下表提供了有关级别变化通知的详细信息。

通知类型 描述
SUBSCRIPTION_MODIFIED_DEFERRED 订阅计划已使用“延迟”按比例分配模式进行了修改。已计划在下一个续订日期更改订阅计划。当前计划在续订日期之前仍然有效。
SUBSCRIPTION_MODIFIED_IMMEDIATE 订阅计划已使用“立即”按比例分配模式进行了修改。现有计划已取消,并按比例退款,新计划立即激活。通知包含已取消收据ID。

使用RTN捕获这些事件,并使用RVS验证订阅的变化。有关通知类型的完整列表,请参阅支持的通知类型

RTN响应示例

根据计划变更的性质是立即生效还是延迟生效,亚马逊处理计划变更的方式有所不同。

  • 对于立即生效的计划变更:
    • 亚马逊会取消当前计划并立即激活新计划。
    • 亚马逊会将当前收据ID标记为已取消。
    • RTN有效负载的relatedReceipts字段包括已取消收据ID。
  • 对于延迟计划变更:
    • 当前收据仍然有效,亚马逊计划在即将到来的账单周期中让计划变更生效。
    • RTN有效负载中的relatedReceipts字段是一个空数组。

以下示例显示了SUBSCRIPTION_MODIFIED_IMMEDIATESUBSCRIPTION_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 订阅已被新的订阅取代。例如,如果客户换成新的级别,则会取消原有收据并提供新收据。

您可以在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日