带有附加内容的订阅

带有附加内容的订阅允许您将多个订阅产品捆绑在一起,以便一同购买、结算和管理。您现有的产品目录订阅可以无缝地作为附加内容提供,无需任何前期指定或额外配置。您可以为多个现有订阅产品启动购买流程,并将它们作为附加内容出售。

注意事项

使用带有附加内容的订阅功能时,请考虑以下几点

  • 带有附加内容的订阅仅支持自动续订的基本方案。

  • 购买中的所有商品必须具有相同的定期结算周期。例如,您不能同时拥有按年结算的订阅和按月结算的附加内容。

  • 带有附加内容的订阅购买最多可包含 50 个商品。

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

与 Play 结算库集成

本节介绍如何将带有附加内容的订阅功能与 Play 结算库 (PBL) 集成。本节假定您熟悉 PBL 的初始集成步骤,例如将 PBL 依赖项添加到您的应用中、初始化 BillingClient 以及连接到 Google Play。本节重点介绍针对带有附加内容的订阅的 PBL 集成方面。

启动购买流程

要启动带有附加内容的订阅的购买流程,请执行以下步骤

  1. 使用 BillingClient.queryProductDetailsAsync 方法获取所有订阅商品。

  2. 为每个商品设置 ProductDetailsParams 对象。

    ProductDetailsParams 对象表示的商品,同时指定了表示订阅商品的 ProductDetails,以及选择特定订阅基本方案优惠offerToken

  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 可能会在任何试用或 introductory 定价阶段之后插入按比例计算的费用。
  • 优惠资格将针对每个商品单独评估。

处理购买

处理带有附加内容的订阅与处理单商品购买相同,如将 Google Play 结算库集成到您的应用中所述。唯一的区别在于用户可通过一次购买获得多个权益。带有附加内容的订阅购买会返回多个商品,这些商品可以通过 Google Play 结算库中的 Purchase.getProducts() 获取,然后通过 Google Play Developer API 中的 purchases.subscriptionsv2.get 方法中的 lineItems 列表获取。

修改带有附加内容的订阅

对带有附加内容的订阅进行的任何更改都会导致升级或降级。如需了解更多信息,请参阅升级或降级订阅

要更改或恢复应用中现有的带有附加内容的订阅购买,您必须使用附加参数调用 launchBillingFlow API,并确保以下几点

  • 始终使用当前订阅购买的 purchase token 调用 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);

订阅修改场景

下表列出了带有附加内容的订阅的各种修改场景以及相应的行为。

现有商品 修改后的商品 是否需要设置 replacement mode? 行为
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

实时开发者通知

对于带有多个商品权益的带有附加内容的订阅购买,subscriptionId 字段未在 RTDN 中提供。您可以改为使用 Play Developer API 获取购买信息并查看关联的商品权益。

现有订阅者的价格变更

更改带有附加内容的订阅购买的现有订阅者的订阅价格与更改单商品订阅的价格类似,如更改订阅价格所述。但是,本节介绍了一些限制和功能差异。

终止旧版价格群组

终止旧版群组也会影响带有附加内容的订阅购买。适用以下规则

  • 所有未处理的 opt-in 提价都应与新价格具有相同的续订时间。如果带有附加内容的订阅购买中的商品存在尚未获得用户确认的 opt-in 提价,则对购买中其他商品进行的任何新的 opt-in 提价都将被忽略,除非其导致的新价格应用续订时间与处于 OUTSTANDING 状态的现有提价相同。一旦用户确认了提价,任何更新的价格变更都将被记录。并且用户只能一次性接受所有未确认的 opt-in 提价。

    示例

    • 考虑一个带有附加内容(商品 A 和 B)的订阅,该订阅每月 7 日续订。
    • 商品 A 正在进行从 $7 到 $10 的价格迁移,预计提价将于 7 月 7 日生效。
    • 商品 B 于 6 月 2 日开始新的价格迁移,从 $5 到 $6。由于 opt-in 提价在迁移开始后 37 天开始,因此商品 B 的最早提价日期为 8 月 7 日。

    在这种情况下,直到用户接受商品 A 的价格变更(直到其处于 CONFIRMED 状态),商品 B 的价格变更才会计入此订阅购买中,并且 SubscriptionPurchaseV2 不会返回商品 B 的价格变更详情。在用户确认商品 A 的价格变更后,商品 B 的价格变更才开始。用户仅在接受商品 A 的 opt-in 提价后才会收到商品 B 的 opt-in 提价。

  • Google Play 的电子邮件包含所有在同一天生效的提价或降价商品的列表。

取消带有附加内容的订阅

用户可以在 Play 订阅中心取消带有附加内容的订阅的整个购买,而您只能通过 Google Play Developer API 取消带有附加内容的订阅的整个购买。

当订阅购买在未撤销的情况下被取消时,购买中的所有商品都不会自动续订,但用户将继续拥有相应商品的访问权限,直到对应的结算周期结束。

撤销和退款带有附加内容的订阅

以下是一些关于撤销和退款订阅的指南

  • 使用 Play 管理中心针对特定订单发放基于金额的退款,同时不撤销对订阅的访问权限。

  • 调用 orders.refund 以全额退还用户已支付的特定订阅款项,同时不撤销对订阅的访问权限。

  • 调用 purchases.subscriptionsv2.revoke 以立即撤销对所有订阅商品的访问权限。使用此 API,您可以

    • 撤销对所有商品的访问权限并提供按比例计算的退款。

    • 使用按比例计算的退款撤销带有附加内容的订阅时,将针对每个商品的最新订单发放退款,退款金额基于距离下次续订剩余的时间按比例计算。

    • 撤销对所有商品的访问权限并提供全额退款

    • 对单个商品撤销访问权限并对其进行全额退款。

撤销带有附加内容的订阅中的单个商品

要在不撤销整个购买的情况下撤销带有附加内容的订阅中的单个订阅商品,请调用 purchases.subscriptionsv2.revoke,并在 RevocationContext 中设置 ItemBasedRefund 字段。应该被撤销和退款的商品的 productId 可以设置在 ItemBasedRefund 字段中。

ItemBasedRefund 字段可以针对包含一个或多个自动续订订阅商品的购买进行设置。

  • 如果在撤销 ItemBasedRefund 中指定的商品后,订阅购买中仍有有效的商品剩余,则只会撤销该商品并全额退款,不会中断订阅状态。
  • 如果在撤销 ItemBasedRefund 中指定的商品后,订阅购买中没有有效的商品剩余,则该商品将被撤销并全额退款,同时取消订阅。

注意事项

  • 使用 ItemBasedRefund 时,一次只能撤销一个商品。如果需要撤销不同的商品,可以多次调用该请求。
  • 当订阅购买处于任何付款被拒状态时,或 ItemBasedRefund 中指定的商品未拥有或已过期时,该商品的关闭将被阻止。
  • 预付费订阅不支持商品关闭。

付款被拒期间的商品过期

对于带有附加内容的订阅购买,某些续订可能只需要延长一部分商品权益,而不会影响具有未来到期日期的商品。

无论续订涉及哪些商品,如果续订付款被拒,整个订阅购买将进入宽限期和账号暂停期,如下述文档所述。

恢复期选择

由于宽限期本身仍会赋予用户权益,因此在带有附加内容的订阅购买付款被拒后,将选择所有有效商品中宽限期最短的商品,并将其宽限期和账号暂停期作为恢复期应用于此次续订。

有效商品包括在尝试续订之前处于带有附加内容的订阅购买中的商品,不包括任何新添加的商品(恢复后才获得权益),也不包括因移除或关闭而不再有效的商品。

选中宽限期最短的商品的账号暂停期设置。如果存在多个宽限期最短但账号暂停期不同的商品,则应用最长的账号暂停期。

宽限期

当订阅续订付款被拒时,订阅购买将进入宽限期状态。在宽限期内,用户将继续拥有前一个续订周期的所有有效商品的访问权限。宽限期结束后,如果付款方式尚未修复,整个订阅购买将进入账号暂停状态。如果在宽限期内有其他商品达到其续订日期,一旦订阅从付款被拒状态恢复,将为这些商品发起新的扣费尝试。

账号暂停

在订阅购买处于账号暂停期间,对所有订阅商品的访问权限都会暂停,直到付款恢复。

如果处于账号暂停状态的订阅得以恢复,订阅购买将继续保持原样。如果订阅未恢复,则付款被拒的商品将到期,而其他商品的访问权限将恢复,直到其结算周期结束。

示例

  • 用户有一个名为 My Base Plan 的订阅,每月 1 日续订;然后在 8 月 15 日,添加了一个每月 10 美元、带有七天免费试用的 Add on plan。这两个商品都没有设置宽限期,它们都具有 30 天的账号暂停期。

  • 8 月 22 日,系统向用户收取 2.90 美元 (10*9/31) 作为按比例计算到 8 月 31 日的费用,但用户的付款方式在此之前已过期,因此订阅于 8 月 22 日进入付款被拒状态。

当订阅因付款被拒而进入账号暂停状态时,用户无法访问带有附加内容的订阅中的任何商品。当订阅退出账号暂停状态时(无论是由于付款恢复还是被取消),未续订商品的剩余时间将退还给用户。

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

  • 如果账号在 8 月 25 日(即 9 月 1 日的更广泛续订日期之前)恢复,用户当天将重新获得对 My Base PlanAdd on plan 的访问权限。下一个结算日期将更改为 9 月 4 日。

  • 如果账号在 30 天后仍未恢复,订阅将于 9 月 21 日取消,用户将失去对 Add on plan 的访问权限,并恢复对 My Base Plan 的访问权限,直到 9 月 30 日。

在此示例中,您必须获取带有附加内容的订阅中所有商品的更新 expiryTime,因为某些商品在宽限期和账号暂停期后可能会恢复其权益。

财务报告和核对

使用收入报告将您的有效订阅与 Play 上的交易进行核对。每笔交易明细都包含一个订单 ID。对于包含多个商品的购买,收入报告和预计销售额报告将包含针对每个相关商品的每笔交易(如费用、税费和退款)的单独行。

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

  • 管理中心财务报告部分显示的收入统计信息按商品细分。

  • 订单管理会反映带有附加内容的订阅购买,并显示所购买商品的详细列表。通过订单管理,您可以撤销、取消或全额退还用户的购买。