与 Stripe 的初始集成

Adapty 通过追踪通过 Stripe 完成的网页支付和订阅,支持 web2app 订阅流程。

该集成涵盖网页端发起的购买(Stripe Checkout、托管支付页面或自定义网页流程),并将其与移动应用访问权限及分析数据同步。

以下场景中该集成非常有用:

  • 自动为在网页端购买、随后安装应用并登录账户的用户提供付费功能访问权限
  • 在单一 Adapty 看板中汇总所有订阅分析数据(包括同期群、趋势预测及其他分析工具)

尽管网页端购买对于应用程序越来越普遍,但 Apple App Store 仅允许在美国对数字商品使用不同于应用内购买的系统。请确保不要在其他国家/地区的应用内宣传您的网页订阅,否则您的应用可能会被拒绝或封禁。

以下步骤概述了如何配置 Stripe 集成。

本集成专注于追踪和同步 Stripe 网页端购买。如果您需要将用户从应用引导至网页结账页面,请参阅 Web 付费墙

1. 将 Stripe 连接到 Adapty

该集成主要依赖 Adapty 通过 webhook 从 Stripe 拉取订阅数据。因此,您需要通过提供 API 密钥并在 Stripe 中使用 Adapty 的 webhook URL,将您的 Adapty 账户连接到 Stripe 账户。为了自动完成 webhook 配置,请在 Stripe 中安装 Adapty 应用:

以下步骤对 Stripe 的生产模式和测试模式是相同的,但每种模式需要使用不同的 API 密钥。

  1. 确定您是以测试模式还是正式模式连接 Stripe。如果您最初在测试模式下执行此操作,则需要再次为正式模式重复以下步骤。

  2. 前往 Stripe App Marketplace 并安装 Adapty 应用。请注意,沙盒模式不支持安装应用,您只能在生产模式或测试模式下执行此操作。

stripe1.png
  1. 授予应用所需权限。这将允许 Adapty 访问订阅数据和历史记录。然后,点击 Continue to app settings 继续。

在权限弹窗底部,您可以选择以正式模式还是测试模式安装应用。

stripe2.png
  1. 在弹窗中,生成一个新的受限密钥。您需要通过电子邮件、Touch ID 或安全密钥验证身份。密钥生成后将无法再次查看,请将其安全存储在密码管理器或密钥存储库中。
stripe4.png
  1. 从弹窗中复制生成的密钥,然后前往 Adapty 的 App Settings → Stripe。根据您的模式,将密钥粘贴到 Stripe App Restricted API Key 部分。请注意,测试模式和正式模式必须生成不同的密钥。
Stripe3.png

全部完成!接下来,在 Stripe 上创建您的产品并将其添加到 Adapty。

已弃用的安装流程
  1. 在 Stripe 中前往 Developers → API Keys
6549602-CleanShot_2023-12-06_at_17.29.122x.webp
  1. 点击 Secret key 标题旁边的 Reveal live (test) key button,复制后前往 Adapty 的 App Settings → Stripe,将密钥粘贴到此处:
2989508-CleanShot_2023-12-07_at_14.59.122x.webp
  1. 接下来,从 Adapty 同一页面底部复制 Webhook URL。在 Stripe 中前往 DevelopersWebhooks,点击 Add endpoint 按钮:
e7149f5-CleanShot_2023-12-07_at_17.31.392x.webp
  1. 将 Adapty 的 webhook URL 粘贴到 Endpoint URL 字段。然后在 webhook Version 字段中选择 Latest API version。接着选择以下事件:

    • charge.refunded
    • customer.subscription.created
    • customer.subscription.deleted
    • customer.subscription.paused
    • customer.subscription.resumed
    • customer.subscription.updated
    • invoice.created
    • invoice.updated
    • payment_intent.succeeded
cbc5404-CleanShot_2023-12-07_at_17.36.232x.webp
  1. 点击”Add endpoint”,然后点击”Signing secret”下方的”Reveal”。这是用于在 Adapty 端解码 webhook 数据的密钥,显示后请复制:
0460cbb-CleanShot_2023-12-07_at_17.52.582x.webp
  1. 最后,将此密钥粘贴到 Adapty 的 App Settings → Stripe 中的”Stripe Webhook Secret”字段:
055db20-CleanShot_2023-12-07_at_14.56.212x.webp

2. 在 Stripe 上创建产品

如果您在测试模式下进行此配置,请确保在继续此步骤之前将 Stripe 切换到测试模式。

前往 Stripe 的产品目录,创建您希望销售的产品及其定价方案。请注意,Stripe 允许每个产品拥有多个定价方案,这有助于在无需创建额外产品的情况下灵活定制您的产品组合。

b202e2e-CleanShot_2023-12-06_at_15.06.262x.webp

目前 Adapty 仅支持固定费率($9.99/月)或套餐定价($9.99/10 个单位),因为这些方式与应用商店的行为类似。阶梯定价基于用量的费用客户自定价选项暂不支持。

3. 将 Stripe 产品添加到 Adapty

产品是必填项!请务必在 Adapty 看板中创建您的 Stripe 产品。Adapty 仅追踪与这些产品关联的交易事件,请勿跳过此步骤——否则将无法创建交易事件。

我们以与 App Store 和 Google Play 相同的方式处理 Stripe:它只是您销售数字产品的另一个商店。因此配置方式类似:只需将 Stripe 产品(即其 product_idprice_id)添加到 Adapty 的产品部分:

457d1a0-CleanShot_2023-12-08_at_17.52.292x.webp

Stripe 中的产品 ID 格式为 prod_...,价格 ID 格式为 price_...。在 Stripe 的产品目录中打开任意产品即可轻松找到这些信息:

14a72d7-CleanShot_2023-12-06_at_17.32.512x.webp

添加完所有必要产品后,下一步是让 Stripe 知道是哪位用户在进行购买,以便 Adapty 能够正确识别!

4. 在网页购买中附加您的用户 ID

Adapty 依赖来自 Stripe 的 webhook 作为唯一信息来源,为用户提供和更新访问等级。但您必须在使用 Stripe 时从您的端提供额外信息,才能使该集成正常工作。

为确保跨平台(网页或移动端)访问等级一致,您需要确保有一个统一的用户 ID,Adapty 可以通过 webhook 识别该 ID。这可以是用户的电子邮件、电话号码或您所使用的授权系统中的任何其他 ID。

确定您希望用于标识用户的 ID。然后,找到代码中通过 Stripe 初始化支付的部分——将此用户 ID 以 customer_user_id 的形式添加到 Stripe Subscriptionsub_...)或 Checkout Session 对象(ses_...)的 metadata 中,如下所示:

{'customer_user_id': "YOUR_USER_ID"}

这一简单的添加是您在代码中唯一需要做的事情。之后,Adapty 将解析从 Stripe 收到的所有 webhook,提取此 metadata,并将订阅正确关联到您的客户。

用户 ID 是必填项

否则,我们无法匹配该用户并在移动端为其提供访问等级。

如果您没有在 metadata 中提供 customer_user_id,您可以选择让 Adapty 在其他位置查找 customer_user_id:可以是 Stripe 的 Customer 对象中的 email,或 Stripe 的 Session 中的 client_reference_id

了解更多关于配置用户画像创建行为的信息,请参阅下方说明

Stripe 中的 Customer 也是必填项

如果您使用 Checkout Sessions,请通过将 customer_creation 设置为 always确保创建 Stripe Customer

5. 为移动端用户提供访问权限

为确保来自网页端的移动用户能够访问付费功能,只需使用与上一步骤中相同的 customer_user_id 调用 Adapty.activate()Adapty.identify()(详情请参阅 识别用户 )。

6. 测试您的集成

请确保您已同时为沙盒环境和生产环境完成上述步骤。从 Stripe 测试模式发起的交易在 Adapty 中将被视为沙盒交易。

大功告成!

您的用户现在可以在网页端完成购买,并在您的应用中访问付费功能。您还可以在单一位置查看所有订阅分析数据。

用户画像创建行为

Adapty 必须将购买关联到客户用户画像,以便在移动端可用——因此默认情况下,它会在收到 Stripe 的 webhook 时创建用户画像。您可以选择在 Adapty 中用作客户用户 ID 的内容:

  1. 默认且推荐: 您在上述第 4 步的 metadata 中提供的 customer_user_id
  2. Stripe 的 Customer 对象中的 email(参见 Stripe 文档
  3. Stripe 的 Session 对象中的 client_reference_id(参见 Stripe 文档

您可以在 App Settings → Stripe 中配置您希望使用的 ID。

注意: 如果来自 Stripe 的特定交易不包含指定的 ID,我们将不会创建用户画像。该交易将保持匿名状态,直到被某个用户画像接收(例如,如果您之后使用 S2S validate 并手动告知我们此交易)。

该交易将显示在分析数据中,但不会出现在依赖用户画像计数的部分(LTV、同期群、转化率等),您也无法在事件流中查看它。

您还有第四个选项,即完全不创建用户画像,但由于上述分析数据的限制,不建议这样做。

当前限制

升级、降级与按比例计费

订阅变更(如升级或降级)可能会产生按比例计算的费用。Adapty 不会在收入计算中考虑这些费用。建议通过 Stripe 看板手动禁用这些选项。您也可以通过 Stripe API 将 proration_behaviour 属性值设置为 none 来禁用它们。

取消订阅

Stripe 有两种订阅取消选项:

  1. 立即取消:订阅立即取消,可选是否按比例退款
  2. 在周期结束时取消:订阅在当前计费周期结束时取消(类似于应用商店的应用内订阅)

Adapty 支持两种选项,但立即取消的收入计算将忽略按比例退款选项。

账单问题与宽限期

当客户遇到支付问题时,Adapty 将生成账单问题事件并撤销访问权限。我们目前暂不支持 Stripe 的宽限期——这将在未来版本中实现。

退款

Adapty 仅追踪全额退款。目前不支持按比例退款或部分退款。

交易 ID 唯一性

Adapty 使用 store_transaction_idstore_original_transaction_id 匹配用户画像和交易。这些 ID 在测试环境和生产环境中必须唯一

为何重要

如果同一交易 ID 同时存在于两个环境中,Adapty 会将其视为同一笔交易,导致:

  • 生产环境购买继承测试环境的访问等级和产品 ID
  • API 响应中出现错误的产品 ID 和环境信息
  • 用户画像关联和订阅事件受到干扰

如何确保唯一性

Stripe 的发票 ID 在测试环境和正式环境之间可能重叠。为防止跨环境冲突,请选择以下方案之一:

方案一:账户级编号加环境前缀

为每个环境分别配置前缀:

  1. 在 Stripe 看板中切换到测试模式。
  2. 前往 Settings → Billing → Invoices
  3. Invoice numbering 设置为 Sequentially across your account
  4. Invoice prefix 设置为 TEST-(或其他专用于测试环境的前缀)。
  5. 切换到正式模式,重复步骤 2-4,使用 LIVE-(或其他专用于正式环境的前缀)作为前缀。

方案二:客户级编号

Stripe settings -> Billing -> Invoices tab 中将 Invoice numbering 设置为 Sequentially for each customer (customer-level)

即使进行了上述配置,如果您删除某张发票,Stripe 可能会将该 ID 重新用于同一客户的新发票。因此,请尽量避免删除发票。

充分利用您的 Stripe 数据

完成 Stripe 集成后,Adapty 即可立即提供洞察数据。为充分利用您的 Stripe 数据,您可以设置额外的 Adapty 集成以转发 Stripe 事件——将所有订阅分析数据汇集到单一 Adapty 看板中。

为增强分析能力,您可以在 Stripe 的 metadata 中包含 variation_id,以将购买归因到特定付费墙实例。这在实施自建网页付费墙时特别有用,可以追踪哪个具体的付费墙展示带来了转化。

请注意,variation_id 仅从 Stripe Subscription(sub_...)和 Checkout Session(ses_...)对象的 metadata 中读取:

{
  'customer_user_id': "YOUR_USER_ID",
  'variation_id': "YOUR_VARIATION_ID"
}

可用于转发和分析 Stripe 事件的集成:

支持的 Stripe 事件

Adapty 支持以下 Stripe 事件:

  • charge.refunded
  • customer.subscription.created
  • customer.subscription.deleted
  • customer.subscription.paused
  • customer.subscription.resumed
  • customer.subscription.updated
  • invoice.created
  • invoice.updated
  • payment_intent.succeeded