订阅加购服务

借助“附加订阅”,您可以将多个订阅商品打包在一起,以便一起购买、结算和管理。您可以将现有的商品目录订阅无缝地作为插件提供,而无需任何预先规范或额外配置。您可以启动包含多个现有订阅产品的购买流程,并将其作为附加服务进行销售。

注意事项

使用“订阅附加内容”功能时,请考虑以下几点:

  • 只有自动续订型基础方案支持附加服务订阅。

  • 购买交易中的所有商品都必须采用相同的周期性结算周期。例如,您不能将按年结算的订阅与按月结算的附加服务搭配使用。

  • 在购买了插件的情况下,订阅中最多可以包含 50 项内容。

  • 此功能不适用于印度 (IN) 和韩国 (KR) 地区。

与 Play 结算库集成

本部分介绍了如何将订阅附加内容功能与 Play 结算库 (PBL) 集成。本文假定您熟悉初始 PBL 集成步骤,例如向应用添加 PBL 依赖项、初始化 BillingClient连接到 Google Play。本部分重点介绍了与订阅附加项相关的 PBL 集成方面。

启动购买流程

如需为包含附加服务的订阅启动购买流程,请执行以下步骤:

  1. 使用 BillingClient.queryProductDetailsAsync 方法提取您的所有订阅项。

  2. 为每个项设置 ProductDetailsParams 对象。

    ProductDetailsParams 对象表示的项,既指定了指示订阅项的 ProductDetails,又指定了用于选择特定订阅的 offerTokenbase planoffer)。

  3. BillingFlowParams.Builder.setProductDetailsParamsList 方法中指定商品详情。BillingFlowParams 类用于指定购买流程的详细信息。

    以下示例展示了如何为包含多个项的订阅购买交易启动结算流程:

    Java

       BillingClient billingClient = ;
    
        // ProductDetails obtained from queryProductDetailsAsync().
        ProductDetailsParams productDetails1 = ...;
        ProductDetailsParams productDetails2 = ...;
        ArrayList productDetailsList = new ArrayList<>();
        productDetailsList.add(productDetails1);
        productDetailsList.add(productDetails2);
    
        BillingFlowParams billingFlowParams =
            BillingFlowParams.newBuilder()
               .setProductDetailsParamsList(productDetailsList)
               .build();
        billingClient.launchBillingFlow(billingFlowParams);

适用于购买交易中商品的规则

  • 为确保加购项的续订日期最终与基本商品保持一致,Google Play 可能会在任何试用期或优惠价阶段结束后按比例收取费用。
  • 系统会分别评估每项商品的优惠资格条件

处理购买交易

处理包含附加内容的订阅与处理单件商品购买交易相同,如将 Google Play 结算库集成到您的应用中中所述。唯一的区别在于,用户可以通过单次购买获得多项使用权。购买包含附加内容的订阅会返回多个项,您可以使用 Google Play 结算库中的 Purchase.getProducts() 检索这些项,然后再使用 Google Play Developer APIpurchases.subscriptionsv2.get 中的 lineItems 列表检索这些项。

修改包含插件的订阅

对包含插件的订阅进行任何更改都会导致升级或降级。如需了解详情,请参阅升级或降级订阅

如需在应用中更改或恢复现有包含插件的订阅购买交易,您必须使用其他参数调用 launchBillingFlow API,并确保以下几点:

  • 始终使用当前订阅购买交易的购买令牌调用 setOldPurchaseToken
  • 如需升级、降级或跨级升级基础项,请调用 setSubscriptionReplacementMode 来指定如何在旧订阅的项和新购买的包含插件的订阅之间处理方案更改。否则,无需设置此参数。
  • 当基本项未更改时,您仍然可以调用 setSubscriptionReplacementMode 来应用特定的按比例分配行为。如需了解在此情形下适用的规则,请参阅重新订阅或在同一订阅中切换方案
  • 新附加服务将立即生效,并按比例收费,以使下次续订日期与订阅中的基准项保持一致。
  • 已移除的插件将在当前结算周期结束时失效。
  • 启动结算流程时,您需要指定订阅中所有有效的项(包括插件,但不包括要移除的插件),以及所有新插件。

以下示例展示了如何在更改现有包含插件订阅的购买交易时调用 launchBillingFlow API:

Java

BillingClient billingClient = ;

int replacementMode =;

// ProductDetails obtained from queryProductDetailsAsync().
ProductDetailsParams productDetails1 = ...;
ProductDetailsParams productDetails2 = ...;
ProductDetailsParams productDetails3 = ...;

ArrayList newProductDetailsList = new ArrayList<>();
newProductDetailsList.add(productDetails1);
newProductDetailsList.add(productDetails1);
newProductDetailsList.add(productDetails1);

BillingFlowParams billingFlowParams =
    BillingFlowParams.newBuilder()
        .setSubscriptionUpdateParams(
          SubscriptionUpdateParams.newBuilder()
              .setOldPurchaseToken(purchaseTokenOfExistingSubscription)
              // No need to set if change does not affect the base item.
             .setSubscriptionReplacementMode(replacementMode)
             .build())
        .setProductDetailsParamsList(productDetailsList)
        .build();

billingClient.launchBillingFlow(billingFlowParams);

订阅修改场景

下表列出了包含插件的订阅的各种修改场景以及相应的行为。

现有商品 修改的内容 您需要设置替换模式吗? 行为
A(基准项)、B A(基准项) 商品 B 将被延迟移除。
A A(基准项)、B 系统会立即添加商品 B,并按比例收取费用。
A(基准项)、B A(基本项)、C
  • B 将被延迟移除。
  • 系统会立即添加 C,并按比例收费。
A(基准项)、B B(基准项) A 将被延迟移除。
A(基准项)、B C(基本项)
A(基准项)、B C(基本项)、B A -> C 的替换项取决于 setSubscriptionReplacementMode
A(基准项)、B C(基本项)、D

实时开发者通知

对于包含多个商品使用权的订阅加购交易,RTDN 中未提供 subscriptionId 字段。您可以改为使用 Play Developer API 获取购买交易并查看关联的商品使用权。

适用于现有订阅者的价格变动

如需更改包含附加购买项的订阅的现有订阅者的订阅价格,请参阅更改订阅价格中介绍的操作,方法类似。不过,存在一些限制和功能差异,如本部分所述。

停用旧价格同类群组

停用旧价格同类群组也会影响包含附加服务购买交易的订阅。以下规则适用:

  • 所有待处理的“用户选择接受才生效”类型的价格上调都应与新价格采用相同的续订时间。如果包含附加内容的订阅购买交易中某项商品采用了“用户选择接受才生效”类型的价格上调,但用户尚未确认,则系统会忽略该购买交易中其他商品的任何新“用户选择接受才生效”类型的价格上调,除非新价格上调的应用续订时间与待处理状态的现有价格上调相同。用户确认价格上调后,系统会注册任何较新的价格变动。用户只能一次性接受所有未经确认的“用户选择接受才生效”类型的价格上调。

    示例:

    • 假设有一个包含附加内容(商品 A 和 B)的订阅,每月 7 日续订。
    • 商品 A 的价格正在从 7 美元上调至 10 美元,价格上调预计将于 7 月 7 日生效。
    • 商品 B 的价格将从 5 美元上调至 6 美元,新价格将于 6 月 2 日生效。由于“用户选择接受才生效”类型的价格上调会在迁移后 37 天开始,因此商品 B 的价格最早会在 8 月 7 日上调。

    在此场景中,在用户接受商品 A 的价格变动(即商品 A 处于 CONFIRMED 状态)之前,系统不会为此订阅购买交易注册商品 B 的价格变动,并且 SubscriptionPurchaseV2 也不会返回商品 B 的价格变动详情。在用户确认商品 A 的价格变动后,商品 B 的价格变动将开始。只有在用户接受商品 A 的“用户选择接受才生效”类型的价格上调后,系统才会向其发送商品 B 的“用户选择接受才生效”类型的价格上调通知。

  • Google Play 的电子邮件会列出当天价格上调或下调的所有商品。

取消包含插件的订阅

用户可以在 Play 订阅中心取消包含附加内容的订阅的整个购买交易,而您只能使用 Google Play Developer API 取消包含附加内容的订阅的整个购买交易。

如果订阅购买交易被取消但未被撤消,则购买交易中的所有项都不会自动续订,但用户将继续拥有对相应内容的访问权限,直到相应结算周期结束。

撤消包含插件的订阅并退款

以下是关于撤消和退款订阅的一些准则:

  • 使用 Play 管理中心为特定订单发放金额退款,而无需撤消对订阅的访问权限。

  • 调用 orders.refund 可全额退还用户已支付的特定订阅款项,而无需撤消对订阅的访问权限。

  • 调用 purchases.subscriptionsv2.revoke 可立即撤消对所有订阅项的访问权限。借助此 API,您可以:

    • 撤消对所有内容的访问权限,并提供按比例退款。

    • 使用按比例退款功能撤消包含附加内容的订阅时,系统会针对每个商品的最新订单退款,退款金额会根据下次续订前的剩余时间按比例计算。

    • 撤消对所有内容的访问权限,并提供全额退款

    • 撤消对单个商品的访问权限,并全额退款。

撤消包含插件的订阅中的单个项

如需撤消包含插件订阅中的个别订阅项,而不撤消整个购买交易,请在 RevocationContext 中设置 ItemBasedRefund 字段,然后调用 purchases.subscriptionsv2.revoke。您可以在 ItemBasedRefund 字段中设置应撤消和退款的商品的 productId

ItemBasedRefund 字段可用于设置包含一个或多个自动续订型商品的购买交易。

  • 撤消 ItemBasedRefund 中指定的项后,如果订阅购买交易中仍有有效项,系统只会撤消该项并全额退款,而不会中断订阅状态。
  • 如果在撤消 ItemBasedRefund 中指定的项后,订阅购买交易中没有剩余的有效项,系统会撤消该项、全额退款,并取消订阅。

注意事项

  • 使用 ItemBasedRefund 时,一次只能撤消一项内容。 如果需要撤消不同的内容,可以多次调用该请求。
  • 如果订阅购买交易处于任何付款遭拒状态,或者 ItemBasedRefund 中指定的商品不属于您或已过期,系统会屏蔽商品拒绝。
  • 预付费订阅不支持拒收商品。

付款遭拒期间商品过期

对于购买了包含附加服务的订阅,某些续订可能只需延长部分项的使用权,而不会影响到未来到期的项。

无论续订涉及哪些项目,如果续订付款遭拒,整个订阅购买交易都将进入宽限期,并会在账号中暂扣一笔款项,如以下文档中所述。

恢复期选择

由于宽限期本身仍会授予用户使用权,因此在购买包含附加内容的订阅后,如果续订付款遭拒,系统会选择所有有效项中宽限期最短的项,并将其宽限期和账号保留期作为恢复期应用于此续订。

“有效内容”包括在尝试续订前购买的包含附加内容的订阅中有效的内容,不包括任何新添加的内容(只有在恢复后才能使用),也不包括因移除或拒绝而不再有效的任何内容。

系统会应用选择了最短宽限期的商品的账号预授权设置。如果有多个最低宽限期的项,但账号保全期限不同,则系统会应用最长的账号保全期限。

宽限期

订阅续订付款遭拒后,订阅购买交易将进入宽限期状态。在宽限期内,用户将继续拥有上一个续订周期内所有有效内容的访问权限。宽限期结束后,如果付款方式仍未解决,整个订阅购买交易将进入账号保留状态。如果任何其他商品在宽限期内到达续订日期,那么在付款遭拒问题解决后,系统会针对这些商品重新尝试扣款。

账号保留功能

在订阅购买交易处于账号冻结状态期间,所有订阅内容的访问权限都会被暂停,直至付款恢复为止。

如果账号保留状态的订阅被恢复,订阅购买交易将保持原样。如果订阅未恢复,付款遭拒的商品将过期,其他商品将在其结算周期的剩余时间内恢复访问权限。

示例:

  • 用户订阅了我的基础方案,该方案每月 1 日续订,然后在 8 月 15 日又订阅了 附加方案(每月 10 美元),并享受了 7 天免费试用。这两项都没有设置宽限期,并且都设有 30 天的账号保留期。

  • 8 月 22 日,系统会按比例向用户收取 2.90 美元(10*9/31),以覆盖 8 月 31 日之前的费用,但用户的付款方式在此之前过期,因此订阅在 8 月 22 日被拒绝付款。

如果订阅因付款遭拒而进入账号保留状态,用户将无法访问订阅中包含的任何附加内容。当订阅因付款已恢复或已取消而退出账号保留状态时,系统会将未续订内容的剩余时间返还给用户。

在前面的示例中,订阅于 8 月 22 日进入账号保留状态。

  • 如果账号在 9 月 1 日的更大范围续订日期之前的 8 月 25 日恢复,用户将在同一天重新获得对我的基础方案附加方案的访问权限。下一个结算日期已更改为 9 月 4 日。

  • 如果 30 天后仍未恢复账号,订阅将于 9 月 21 日取消,用户将无法再访问额外付费方案,但可以继续访问我的基础方案,直至 9 月 30 日。

在此示例中,您必须为包含附加服务的订阅中的所有项获取更新后的 expiryTime,因为部分项可能会在宽限期和账号冻结期结束后恢复其使用权。

财务报告和对账

使用收入报告对您的有效订阅与 Play 上的交易进行对账。每笔交易订单项都有一个订单 ID。如果购买交易包含多件商品,收入和估算销售报告中将针对每笔交易(例如涉及的每件商品的扣款、费用、税费和退款)包含单独的行。

对于 Play 管理中心内的信息中心:

  • 控制台的财务报告部分中显示的收入统计信息按项细分。

  • 订单管理会反映订阅附加内容的购买交易,并显示所购买内容的明细列表。在订单管理界面中,您可以撤消、取消或全额退款用户的购买交易。