文章

在 App 中实施订阅优惠

向符合条件的订阅用户提供自动续期订阅产品折扣价。

概览

订阅优惠能够有效地赢回已流失的订阅用户或留存当前的订阅用户。您可以向已流失的或当前的订阅用户提供 macOS、iOS 和 Apple tvOS 上自动续期订阅的折扣或免费服务期。要实施这些优惠,请先在 App Store Connect 中完成设置,包括生成私钥。有关更多详细信息,请参阅“设置订阅优惠”。

您需要确定相关的条件,以判断哪些订阅用户有资格享受优惠。在您的 app 中,您在 App Store Connect 中设置的优惠详情会显示在 SKProduct(英文) 中的 discounts(英文) 数组下。要指明您想要向用户提供的优惠,请在 SKMutablePayment(英文) 对象中包含签名的 paymentDiscount(英文)

如需有关使用订阅优惠的业务指导,请参阅“自动续期订阅 > 订阅优惠”。

准备您的优惠

要显示订阅优惠,首先确定订阅用户的资格,从 App Store 获取产品详细信息,并在您的服务器上生成签名。

图 1

确定用户资格并准备优惠的步骤

确定用户资格并准备优惠的步骤。

确定资格

你将从两个方面确定用户是不是符合享受订阅优惠的条件:

  • App Store 将所有在 app 中持有现有或已过期订阅的顾客都判定为符合兑换订阅优惠的条件。您可以检查收据中是不是含有任何现有或已过期的订阅购买,以此识别这些当前或已流失的订阅用户。

  • 您可为特定的订阅优惠确定任何额外的资格条件。资格条件可以视各式各样的业务逻辑而定,这些业务逻辑由您的业务需求决定。

您可以考虑使用服务器对服务器通知 DID_CHANGE_RENEWAL_STATUS 来确定资格。这一通知由订阅的自动续期状态变化来触发。例如,当订阅用户在“管理订阅”中停用自动续订或联系 AppleCare 取消订阅时,您会收到通知。有关服务器通知的更多信息,请参阅“启用服务器对服务器通知 (英文)”。您的服务器可以向您的 app 通知用户是不是符合享受优惠的条件,以便 app 可以向顾客展示优惠。

您也可以考虑实施 DeviceCheck (英文) 来跟踪以前兑换过优惠的设备。DeviceCheck 让您既可以保障用户的隐私,同时又能定义用于确定资格的参数。

请求产品详情

在确定订阅用户符合享受优惠的条件后,下一步是从 App Store 请求包括优惠在内的产品详情。要获取这些详细信息,请使用 SKProductsRequest(英文) 以及订阅的产品标识符。

在响应时,App Store 会在 SKProduct(英文) 中返回本地化的信息。SKProductdiscounts(英文) 数组包含您在 App Store Connect 中为该产品配置的所有订阅优惠。SKProductDiscount(英文) 对象包含包括本地化价格在内的优惠详情。

您可以从 discounts(英文) 数组确定要向用户显示哪一种优惠。

创建签名

签名是您的服务器利用指定参数和您的私钥生成的唯一字符串。您需要将它包含在 SKPaymentDiscount(英文)signature(英文) 参数中,App Store 会使用它来验证订阅优惠。每个优惠都拥有唯一的签名,该签名具有时效性,并且只能兑换一次。

要生成签名,请向您的服务器发送安全请求。服务器需要知晓 applicationUsername(英文)productIdentifier(英文)identifier(英文)。如果服务器尚不清楚这些参数,您的 app 应在请求中提供它们。有关更多信息,请参阅“为订阅优惠生成签名”。

您的服务器应该会在响应时提供签名字符串,以及其他用于生成签名的值:noncetimestampkeyIdentifier。这些值用于补全 SKPaymentDiscount(英文) 对象中的参数,该对象嵌套在表示优惠的 SKMutablePayment(英文) 对象中。如果 App Store 确定签名与付款中的相应参数不匹配,交易会失败。

以下代码示例显示了如何从您的服务器请求签名并准备折扣优惠。

[an error occurred while processing this directive]

展示您的优惠

您可以通过不同的渠道向用户展示优惠,如电子邮件,但用户必须在您 app 的用户界面内与优惠互动。使用 SKProductDiscount(英文) 对象中的定价和期限,您可以于您选定的时间内在您的 app 中展示优惠。利用此对象中的详细信息,您可以确保向用户展示的优惠能准确地反映您计划提供的优惠。如需设计指导,请参阅“自动续期订阅 > 清晰地描述订阅”。

仅向符合条件的订阅用户展示优惠,以免误导用户或令他们产生疑惑。

完成交易

在用户选择享受订阅优惠后,接下来就是提交付款请求,验证收据,并解锁优惠。

图 2

创建已签名优惠的付款请求、验证收据以及解锁服务的步骤

从创建付款请求到解锁服务的步骤。

创建付款请求

当用户在 app 中发起优惠购买时,会将 SKMutablePayment(英文) 及已签名优惠发送到 App Store。创建 SKPaymentDiscount(英文) 对象,其中包含您生成的签名,以及 identifierkeyIdentifiernonce (一次性使用) 和 timestamp 参数。将这个对象作为 SKPaymentDiscount 对象添加到 SKMutablePayment(英文) 对象中。

SKMutablePayment(英文) 对象中注明相同的 applicationUsername(英文),通常是签名中包含的唯一用户名哈希值。将 SKMutablePayment 对象添加到队列中。

[an error occurred while processing this directive]

告知用户交易状态

App Store 验证优惠后,它会处理您的付款请求,并生成 SKPaymentTransaction(英文)。您的 app 用它来验证交易,并相应地解锁内容。

处理付款请求的交易状态,并根据需要通知顾客。如果交易成功,App Store 会自动更新相关的 app 收据,指示交易处于 SKPaymentTransactionState.purchased(英文) 状态。在设备端对收据进行 Base64 编码,然后将收据数据安全地发送到您的服务器。

验证收据

跟所有购买一样,从您的服务器调用 verifyReceipt 端点来通过 App Store 验证收据。App Store 会发送含有用户购买相关信息的 JSON 响应。有关更多信息,请参阅“通过 App Store 验证收据 (英文)”。

当订阅用户兑换优惠时,收据会包含购买交易中的 promotional_offer_id。此收据栏位是一个字符串,其中含有您在 App Store Connect 中配置的优惠 ID。您可以在收据中查看以往的交易,以识别用户兑换的优惠。

解锁服务

在验证用户购买了订阅产品后,在 app 中为用户解锁相应的订阅服务。根据需要,更新顾客的优惠资格条件。

当顾客兑换订阅优惠时,优惠期从下个账单活动开始。

  • 如果是升级或跨级到相同时限的不同订阅,订阅优惠会触发账单活动并立即生效。

  • 如果是降级或跨级到不同时限的不同订阅,订阅优惠期会在下一个续订日期生效。

  • 如果是同一订阅的推介促销优惠,此订阅优惠期会在下一个计划的账单活动时生效。

优惠期结束时,订阅优惠会以标准价格自动续订。

用户一次只能兑换一个订阅优惠,也只能有一个有效的订阅优惠。如果用户在当前优惠结束前接受另一项优惠,那么当前优惠会在下一个账单事件时取消,同时新的优惠将生效。

另请参阅

提供订阅优惠

设置订阅优惠

App Store Connect 中为自动续期订阅生成密钥和配置优惠。

为订阅优惠生成签名

使用您的私钥创建用于验证订阅优惠的签名。

使用 Node.js 生成订阅优惠签名 (英文)

使用私钥和轻量型加密库生成签名。

class SKPaymentDiscount (英文)

应用于付款的签名折扣。