开发者控制台

在Android应用中集成分级订阅

在Android应用中集成分级订阅

在您为这些IAP商品分配单独的SKU后,可使用修改订阅API在应用中实现分级订阅。修改订阅API包含在亚马逊Appstore SDK自定义版本中。

修改订阅API

实现流程与使用购买API类似。

当您调用purchase() 方法时,Appstore SDK会调用onPurchaseResponse() 回调。与之类似,当您调用modifySubscription() 方法时,Appstore SDK会调用onModifySubscriptionResponse() 回调。

购买API和修改订阅API之间的主要区别如下:

  • modifySubscription() 方法在请求中使用ProrationMode参数(一个指定订阅方案修改时间的值)和SKU参数,而purchase() 方法仅使用SKU。
  • ModifySubscriptionResponse对象使用收据列表,而PurchaseResponse对象仅使用一个收据。

修改订阅请求会使用客户转换订阅方案后新期限的SKU。它还会使用ProrationMode,这是一个枚举,其值为IMMEDIATEDEFERREDmodifySubscription() 方法会识别相应的客户订阅,并使用新的期限SKU对其进行修改。ProrationMode值指定修改生效的时间。ModifySubscriptionResponse对象会提供方案修改相关收据的列表。

修改订阅按比例分配模式

订阅的按比例分配模式是使用ProrationMode枚举设置的。本节将详细介绍ProrationMode的两个可能取值:IMMEDIATEDEFERRED

即时按比例分配模式

如果ProrationMode设置为IMMEDIATE,则客户的当前订阅方案将立即结束,新方案将立即生效。客户可获得已结束订阅剩余时间的退款,并按新订阅方案支付费用。客户还会收到一封电子邮件,其中会说明旧方案的退款金额及新方案的详情。

由于当前方案以按比例退款结束,而新方案以另一个订单开始,因此API将包含两个收据:

  • 订阅的最后一个有效收据,其中包含确认旧订阅方案终止的取消日期
  • 新更改方案的新收据

您必须处理这两个收据,从而立即向客户进行交付。

即时响应示例

在此示例中,客户从SkuX期限转换为了SkuY期限,立即生效。购买日期为1月16日,而最初购买SkuX的日期为1月2日。在此情景下,亚马逊返回的消息将包含以下内容:

receipts: [{
       "receiptId": "oeUY1ip2mJWgLoOuGtAxndQS1LDJRGvmKLr6kq4u9G8=:3:11",
       "sku": "baseSku",
       "itemType": "SUBSCRIPTION",
       "purchaseDate": "Thu Jan 16 09:25:25 GMT+05:30 2020",
       "termSku": "SkuY"
   }, {
       "receiptId": "1bxFJrJVLPr8qpub8SijMWdAqXqWWGNUYPDpynoSusE=:3:11",
       "sku": "baseSku",
       "itemType": "SUBSCRIPTION",
       "purchaseDate": "Thu Jan 02 12:41:44 GMT+05:30 2020",
       "endDate": "Thu Jan 16 09:25:26 GMT+05:30 2020",
       "termSku": "SkuX"
   }]

延迟按比例分配模式

如果ProrationMode设置为DEFERRED,则订阅方案会在下一次续订时更改。直到续订前,客户都可以继续使用当前方案。客户将在续订时支付新方案的费用。客户还会收到一封电子邮件,其中包含延迟订阅的详情和即将进行修改的日期。

由于之前的订阅方案仍然有效而没有终止,因此修改订阅请求对象仅包含有效收据。此收据包含延迟期限SKU和延迟日期。您必须使用收据中的数据进行验证,并在指定日期交付新方案的访问权限。续订后,同一收据ID仍然有效,但会使用最新订阅详情进行更新。

延迟响应示例

在此示例中,客户从SkuA转移到了SkuB期限,生效时间为deferredDate中指定续订时间。

receipts: [{
       "receiptId": "oeUY1ip2mJWgLoOuGtAxndQS1LDJRGvmKLr6kq4u9G9=:3:11",
       "sku": "baseSku",
       "itemType": "SUBSCRIPTION",
       "purchaseDate": "Thu Jan 16 10:25:25 GMT+05:30 2020",
       "deferredDate": "Thu Jan 23 10:25:26 GMT+05:30 2020",
       "deferredSku": "SkuA",
       "termSku": "SkuB"
   }]


实现修改订阅API

以下代码示例简述了如何正确处理应用中的修改订阅API请求和响应。

示例请求

RequestId requestId = PurchasingService.modifySubscription("SKU", ProrationMode);

示例响应

onModifySubscriptionResponse() 方法会处理来自修改订阅API的响应。该方法会使用getRequestStatus()将状态储存在ModifySubscriptionResponse.RequestStatus变量中。根据状态,它会使用getReceipts()输出收据或处理错误。

@Override
public void onModifySubscriptionResponse(ModifySubscriptionResponse response) {
    final String requestId = response.getRequestId().toString();
    final String userId = response.getUserData().getUserId();

    final ModifySubscriptionResponse.RequestStatus status = response.getRequestStatus();
    Log.d(TAG, "onModifySubscriptionResponse: requestId (" + requestId
            + ") userId ("
            + userId
            + ") modifySubscriptionRequestStatus ("
            + status
            + ")");
    Log.d(TAG, "ModifySubscriptionResponse " + response.toString());

    switch (status) {
        case SUCCESSFUL:
            for(Receipt receipt : response.getReceipts()) {
                Log.d(TAG, "onModifySubscriptionResponse: Json格式收据:" + receipt.toJSON());
                iapManager.handleReceipt(response.getRequestId().toString(), receipt, response.getUserData());
            }
            break;
        case INVALID_SKU:
            Log.d(TAG,
                    "onModifySubscriptionResponse: 无效SKU,onProductDataResponse应已将购买按钮禁用。");
            break;
        case FAILED:
        case NOT_SUPPORTED:
            Log.d(TAG, "onModifySubscriptionResponse: 失败,因此从本地储存中删除购买请求。");
            iapManager.purchaseFailed(response.getRequestId().toString());
            break;
    }
}


Last updated: 2024年12月3日