as

Settings
Sign out
Notifications
Alexa
亚马逊应用商店
Ring
AWS
文档
Support
Contact Us
My Cases
开发
测试
应用发布
盈利
用户参与
设备规格
资源

设置附加订阅

设置附加订阅

以下步骤向您展示如何设置、集成和测试附加订阅。

先决条件

要使用附加订阅,必须具备以下条件:

  • 在开发者控制台中激活了附加订阅。

    此功能仅面向部分合作伙伴开放,因此必须由您的亚马逊代表为您激活。

  • 亚马逊应用商店SDK版本3.0.9或更高版本。

步骤1: 设置附加订阅

在亚马逊开发者控制台中,附加订阅的设置方法与基础订阅类似。有关如何设置新订阅的说明,请参阅新建应用内商品

设置附加订阅

  1. 登录开发者控制台,然后在导航栏中选择我的应用
  2. 在应用列表中找到您的应用,在应用内商品列中,选择<数量> 项目
  3. 在“应用内商品”屏幕上,选择添加新的IAP > Add an add-on subscription(添加附加订阅)。

    下拉列表中显示了Add an Add-on Subscription选项。
  4. 要定制附加订阅购买体验和订阅管理体验,请上传附加订阅图标和背景图片。

  5. Map add-on to live subscription(将附加映射至上线订阅)部分中,单击Map add-on to live subscription(将附加映射至上线订阅)。

    在此处提供信息,可以定义附加订阅与基础订阅之间的关系。

  6. 请填写所有必填字段。请务必使用最精细的级别来定义附加与基础订阅之间的关系。例如,可以在基础订阅期限级别上定义该关系。

    在您提供所有必需的信息之前,提交IAP按钮将一直处于非活动状态。

  7. 填写所有必填字段后,选择是仅将附加订阅提交至动态应用测试 (LAT),还是同时提交至LAT和当前上线应用。

    有关更多详细信息,请参阅提交新的或更新后的应用内商品

步骤2: 在应用中集成附加订阅

(采用测试模式或上线模式)设置并发布附加订阅后,必须升级应用中的亚马逊应用商店SDK集成。

在升级SDK集成之前,请查阅以下附加集成摘要表。

集成组件 类别 变更摘要
getUserData() SDK API 无变化。
getProductData() SDK API 经过增强,可发送给定SKU的附加关系。有关详细信息,请参阅实现getProductData() 方法以在应用中显示附加订阅
getPurchaseUpdates() SDK API 无变化。
purchase() SDK API 增强了对附加购买的验证。有关详细信息,请参阅在应用中实现用于购买附加订阅的代码
modifySubscription() SDK API 无变化。
notifyFulfillment() SDK API 无变化。
verifyReceiptId REST API操作 收据验证服务 (RVS) 增强了响应能力,可返回给定附加收据的基础收据。有关详细信息,请参阅处理和验证附加订阅购买
应用内购买 (IAP) 实时通知 通知 无变化。

本指南专门介绍如何在应用中集成应用内购买 (IAP) API以支持附加订阅。有关如何与IAP API完全集成的详尽步骤,请参阅在应用内集成IAP API

处理购买更新

附加订阅收据的处理方式与常规订阅收据相同。getPurchaseUpdates() 方法不进行任何更改即可支持附加订阅。调用getPurchaseUpdates() 时,响应返回附加收据的方式与基础收据相同。有关getPurchaseUpdates() 方法的详细实现方式,请参阅IAP实现文档中的实现getPurchaseUpdates方法

实现getProductData() 方法以在应用中显示附加订阅

要实现getProductData() 方法,请参阅IAP实现文档中的实现getProductData方法getProductData() 方法的请求参数没有变化。但是,响应还包含两个额外的字段,用于映射附加SKU和基础订阅SKU。

字段 数据类型 描述
addons List<String> 符合给定基础期限SKU条件的附加期限SKU列表。
bases List<String> 与给定附加期限SKU相关联的基础期限SKU列表。

getProductData() 方法可处理以下订阅关系场景:

  • 当您提供基础订阅的期限SKU时:
    • addons字段下返回相关附加订阅期限SKU列表。
  • 当您提供附加订阅的期限SKU时:
    • bases字段下返回兼容基础订阅期限SKU列表。

这些关系反映了您在开发者控制台中建立的映射,其中特定附加订阅期限与兼容基础订阅期限相关联。

使用此功能,您可以:

  • 仅向拥有特定基础订阅的客户显示相关附加订阅。
  • 确保附加订阅仅与其兼容基础订阅一起提供。
  • 在应用中保持适当的订阅依赖关系。

在应用中实现用于购买附加订阅的代码

要实现附加订阅的购买,请使用purchase() 方法并将附加期限SKU作为参数进行传递。附加订阅购买以现有IAP购买流程为基础,并包含额外的验证,用于验证客户的基础订阅是否处于有效状态。如果客户的基础订阅处于无效状态,则PurchaseResponse.RequestStatus的值为INACTIVE_BASE_SUBSCRIPTION。如果附加订阅购买成功,则其状态值为SUCCESSFUL。现有请求和响应结构没有变化。

以下示例展示了一个购买请求和响应。

示例请求

public void onBuyOrangeClick(final View view) {
    final RequestId requestId = PurchasingService.purchase("com.example.app.monthly");
    Log.d(TAG, "onBuyOrangeClick: requestId (" + requestId + ")");
}

示例响应

public void onPurchaseResponse(final PurchaseResponse response) {
    switch (status) {
        // ...
        case SUCCESSFUL:
            final Receipt receipt = response.getReceipt();
            iapManager.setAmazonUserId(response.getUserData().getUserId(), response.getUserData().getMarketplace());
            Log.d(TAG, "onPurchaseResponse: receipt json:" + receipt.toJSON());
            iapManager.handlePurchase(receipt, response.getUserData());
            iapManager.refresh();
            break;
        case ALREADY_PURCHASED:
            // 客户已经拥有购买商品的有效权利。
            // 应用和亚马逊应用商店不同步。重新同步亚马逊应用商店中的所有购买。
            PurchasingService.getPurchaseUpdates(true);
            break;
        case INVALID_SKU:
            Log.d(TAG, "onPurchaseResponse:无效SKU!onProductDataResponse应已禁用购买按钮。");
            final Set<String> unavailableSkus = new HashSet<String>();
            unavailableSkus.add(response.getReceipt().getSku());
            iapManager.disablePurchaseForSkus(unavailableSkus);
            break;
        case FAILED:
            // 客户在完成购买旅程之前退出
            Log.d(TAG, "onPurchaseResponse:失败,因此从本地储存中删除购买请求");
            iapManager.showPurchaseFailedMessage(response.getReceipt().getSku());
            break;
        case NOT_SUPPORTED:
            Log.d(TAG, "onPurchaseResponse:失败,因此从本地储存中删除购买请求");
            iapManager.showPurchaseFailedMessage(response.getReceipt().getSku());
            // 设备不支持IAP功能。
            // 对此设备禁用应用内购买。
            iapManager.disableAllPurchases();
            break;
        case INACTIVE_BASE_SUBSCRIPTION:
            Log.d(TAG, "onPurchaseResponse:失败,因此从本地储存中删除购买请求");
            // 开发者可以根据实现需求来自定义逻辑
            break;
    }
}

处理购买收据并履行购买

附加收据的处理方法与常规订阅收据相同。有关如何处理附加收据并履行购买的详细实现方法,请参阅IAP实现文档中的处理购买收据并履行购买

在履行商品之前,让后端服务器通过亚马逊收据验证服务 (RVS) 验证receiptId,从而验证购买所产生的附加收据。有关如何使用RVS验证附加收据的详细信息,请参阅处理和验证附加订阅购买

处理和验证附加订阅购买

对于附加订阅,遵循与常规订阅相同的RVS实现流程。有关收据处理和订阅验证的详细说明,请参阅收据验证服务概述。附加订阅的请求参数保持不变。当您处理附加订阅收据时,RVS响应会包含baseReceipts字段。此字段包含关联的基础订阅收据。在授予对附加和基础订阅这两种内容的访问权限之前,使用baseReceipts中列出的值来确认基础订阅的有效性。

字段 数据类型 描述
baseReceipts List<String> 与附加订阅对应的基础收据ID列表。

将履行结果发送给亚马逊并向用户授予商品

向客户授予订阅内容后,调用notifyFulfillment() 以获取附加订阅收据,其方法与基础订阅收据的获取方法相同。有关如何将履行结果发送给亚马逊的详细实现方法,请参阅IAP实现文档中的处理购买收据并履行购买

步骤3: 测试附加订阅

亚马逊提供了多种工具和服务来帮助您测试IAP实现。要了解相关工具以及查看建议的应用测试工作流程,请参阅IAP测试概述

适用于附加订阅的App Tester

要为应用设置和配置App Tester,请参阅App Tester用户指南。App Tester使用JavaScript对象表示法 (JSON) 文件中存储的数据响应API调用。该文件包含IAP商品的购买数据。您可以通过开发者控制台自动创建JSON文件。

设置App Tester

  1. 导出IAP商品的JSON文件:
    1. 在开发者控制台的应用主页面中,单击应用内商品选项卡以查看应用当前的应用内商品。
    2. 选择导出多个IAP > JSON,然后确认要导出商品。
    3. 单击链接下载文件。
  2. 要启用附加订阅测试,请在生成的JSON文件中手动添加addonsbases字段。

在配置App Tester之前,必须手动添加这些字段。addons字段表示适用于相应基础期限的附加订阅列表,bases字段定义了与附加订阅相关联的基础期限列表。

测试getProductData()

  1. 验证您用于App Tester的JSON文件是否包含要测试的SKU和产品定义。
  2. IAP API Response Settings(IAP API响应设置)部分中,使用GetProductData API旁边的下拉菜单:
    • 要测试SUCCESSFUL响应,请将首选项设置为DefaultSUCCESSFUL
    • 要测试FAILED响应,请将首选项设置为FAILED。​
  3. 调用getProductData()。​
  4. 使用onGetProductDataResponse回调来处理响应。
  5. 检查是否有addonsbases额外字段。

示例JSON响应

"your_item_SKU" : {
       ...
       "subscriptionParent": "com.amazon.subs.gold",
       "addons": ["com.example.iap.subscription.mymagazine.gold"],
       "bases": ["com.example.iap.subscription.mymagazine.silver"]
       ...
 }

测试purchase()

  1. 验证您用于App Tester的JSON文件是否包含要测试的SKU和产品定义。
  2. IAP API Response Settings部分中,使用Purchase API旁边的下拉菜单:
    • 要测试SUCCESSFUL响应,请将首选项设置为DefaultSUCCESSFUL
    • 如果基础订阅处于无效状态,要测试附加订阅购买,请将首选项设置为INACTIVE_BASE_SUBSCRIPTION
  3. 调用purchase() 方法。
  4. 使用onPurchaseResponse回调来处理响应。

    成功购买的内容会显示在App Tester的Manage Transactions(管理交易)选项卡上。

测试附加订阅的RVS响应

亚马逊提供了收据验证服务 (RVS),可用于从您的后端服务器验证购买。要了解有关此服务的更多信息,请参阅收据验证服务概述

使用RVS云沙盒验证App Tester生成的收据。有关详细信息,请参阅使用RVS云沙盒。验证附加收据的RVS响应是否包含baseReceipts字段,该字段应与所映射基础订阅的receiptId值相匹配。

使用动态应用测试来测试附加订阅

和其他IAP商品一样,可以使用动态应用测试 (LAT) 来测试附加订阅。在向客户提供附加订阅之前,可以先在LAT环境中测试购买用例。

有关用于测试附加订阅的用例,请参阅下表。

用例 预期结果
无需进行购买即可查看应用中提供的订阅商品。

此用例用于验证getProductData() 方法。
计划选取器页面列出所有IAP商品,包括您提供的基础订阅和附加订阅。
在购买基础订阅后购买附加订阅。 附加订阅购买成功完成。您收到一封确认电子邮件。
无需基础订阅即可购买附加订阅。 购买失败并显示错误。
购买附加订阅后,登录应用并查看附加内容。

此用例用于验证getPurchaseUpdate() 方法和RVS响应
您可以查看附加内容。
在亚马逊网站上通过关闭自动续订来取消附加订阅。

为了缩短取消操作的等待时间,可考虑使用加速订阅进行测试。
在“Your Subscription”(您的订阅)页面上,订阅状态为“will not renew automatically”(不会自动续订)。 亚马逊通过实时通知 (RTN) 向您发送有关取消的通知。
取消与有效附加订阅关联的基础订阅。

为了缩短取消操作的等待时间,可考虑使用加速订阅进行测试。
在“Your Subscription”页面上,基础订阅状态为“will not renew automatically”。 如果使用加速订阅,则15分钟后,基础订阅和附加订阅的订阅状态都会显示为“expired”(已过期)。亚马逊通过实时通知 (RTN) 向您发送有关取消的通知。

Last updated: 2026年5月20日