ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Read the Docs 商业订阅管理完全指南:从 Stripe 账单门户到订阅生命周期

Read the Docs 商业订阅管理完全指南:从 Stripe 账单门户到订阅生命周期 后端文档【免费下载链接】readthedocs.orgThe source code that powers readthedocs.org项目地址https://gitcode.com/gh_mirrors/re/readthedocs.org点击查看免费下载本文围绕 readthedocs.org 仓库中 subscriptions.rst 所讲解的商业订阅管理功能展开介绍组织所有者如何在 Read the Docs 商业版中完成信用卡信息更新、套餐升降级、发票查看与下载、取消订阅等操作并结合仓库源码readthedocs/subscriptions/、readthedocs/organizations/揭示其背后的 Stripe 集成原理、订阅生命周期事件处理与组织禁用机制。读完本文你将掌握订阅管理页面的完整操作流程、月度/年度计费与折扣规则以及订阅取消后组织会发生什么。订阅管理一切从组织所有者开始Read the Docs 的订阅subscription挂在**组织Organization**这一层级上而不是挂在单个用户或单个项目上。也就是说一个组织拥有一份订阅组织内所有项目的计费与功能配额都由这份订阅决定。文档明确说明所有组织所有者organization owners都可以管理该组织的订阅。从源码结构看这一设计非常清晰Organization模型上存在stripe_customer与stripe_subscription两个外键字段分别指向 Stripe 的客户与订阅对象见 readthedocs/organizations/models.py订阅相关的视图、表单、任务、事件处理均集中在 readthedocs/subscriptions/ 目录下与组织的stripe_id、stripe_customer、stripe_subscription字段直接关联权限控制上订阅详情视图继承自OrganizationMixin见 readthedocs/subscriptions/views.py只有具备组织访问权限通常是所有者的用户才能看到订阅信息。权限提示原文档明确强调查看订阅信息需要组织所有者权限。如果你没有权限可以请组织现有的所有者代为完成所需的变更操作。此外Read the Docs 无法通过电子邮件请求取消订阅——电子邮件无法安全地验证用户身份。如果需要通过邮件沟通你必须先登录 Read the Docs 账号并提交正式的支持请求来完成身份验证。进入订阅管理页面的路径原文档给出了两条核心入口导航到订阅管理页面组织选择页面中的subscription_detail路由点击Manage Subscription管理订阅按钮。从路由定义看subscription_detail与stripe_customer_portal两个 URL 分别绑定DetailSubscription与StripeCustomerPortal视图见 readthedocs/subscriptions/urls.py。其中subscription_detail订阅详情页负责展示当前订阅的主产品、附加产品、功能特性列表以及订阅的结束日期stripe_customer_portal仅接受 POST 请求负责创建 Stripe Billing Portal 会话并将用户重定向到 Stripe 托管的账单门户。点击Manage Subscription后后端会调用 Stripe 的billing_portal.sessions.create接口携带当前组织的stripe_customer.id与回跳地址return_url指向订阅详情页随后将浏览器 302 跳转到 Stripe 门户 URL见 readthedocs/subscriptions/views.py。之后用户便可以在 Stripe 门户中独立完成以下常见操作更新信用卡信息升级、降级或取消当前套餐查看、下载并支付发票在发票上附加额外的税号VAT/EIN或联系邮箱地址。订阅详情页的构成DetailSubscription视图见 readthedocs/subscriptions/views.py是理解整套逻辑的关键。它在GET请求中渲染订阅详情并处理两类特殊场景升级回调当 URL 携带?upgradedtrue查询参数时页面会展示“您的套餐已升级”的成功提示。这个参数是 Stripe Checkout 的回跳标识源码注释明确说明。订阅不存在时的自动修复get_object方法被lru_cache装饰内部调用get_or_create_stripe_subscription。如果组织创建时发生异常导致没有订阅对象用户访问订阅页时会自动重试创建默认订阅见 readthedocs/subscriptions/utils.py。在渲染上下文时视图会遍历订阅下的所有items通过RTD_PRODUCTS配置将 Stripe 产品映射为本地RTDProduct对象区分出主产品main product与附加产品extra products例如额外的构建器并汇总该订阅包含的功能特性列表见 readthedocs/subscriptions/products.py。值得注意的一个细节是欠费past_due状态下的结束日期计算当 Stripe 将订阅标记为past_due时说明当期费用尚未支付。此时视图会去查找最近一笔已支付发票或最后一笔未支付发票用它的period_end作为订阅结束日期展示给用户见 readthedocs/subscriptions/views.py。这样用户看到的“结束日期”就是他们实际已付费周期的最后一天而非未来的名义周期结束日。取消订阅账单周期内仍有效次周期不再续费原文档对取消订阅给出了明确的行为说明取消订阅后你的订阅将在当前账单周期剩余时间内保持有效并且不会在下一个账单周期续费。这意味着取消是一个“软性”动作——你不会立即失去服务而是服务会在当前付费周期结束时终止。这是 Stripe 订阅模型的典型行为也与仓库中的事件处理逻辑一致。从实现角度看订阅取消由 Stripe 的customer.subscription.deletedwebhook 事件驱动。仓库在 readthedocs/subscriptions/event_handlers.py 中注册了对应的处理器其行为包括通知所有所有者遍历organization.owners.all()给每个所有者发送通知。通知类型分两种如果被取消的是试用订阅即订阅项的价格等于默认试用价格RTD_ORG_DEFAULT_STRIPE_SUBSCRIPTION_PRICE发送SubscriptionRequiredNotification“希望您喜欢 Read the Docs 的试用”否则发送SubscriptionEndedNotification“您的 Read the Docs 订阅已结束”。内部 Slack 告警如果配置了SLACK_WEBHOOK_RTD_NOTIFICATIONS_CHANNEL且该客户累计消费金额大于 0会向内部 Slack 频道推送一条包含组织名、套餐名、消费总额、客户起始时间、项目数、域名数、SSO 认证方式、团队数等信息的消息用于内部跟进流失客户见 readthedocs/subscriptions/event_handlers.py。订阅取消后组织会发生什么这是理解“取消订阅”后果的关键。仓库中存在一套禁用disable机制当订阅状态不再是active或trialing时customer.subscription.updated/deleted事件处理器会将organization.disabled置为True见 readthedocs/subscriptions/event_handlers.pydisabled字段的帮助文本写明“该组织的文档与构建已禁用”见 readthedocs/organizations/models.py常量DISABLE_AFTER_DAYS 30定义了订阅结束后的缓冲天数见 readthedocs/subscriptions/constants.py组织禁用并非即时生效而是给用户留出了续费窗口但存在一个例外如果组织的never_disable字段为True“即使订阅结束也永不禁用该组织”则跳过禁用逻辑见 readthedocs/subscriptions/event_handlers.py。此外customer.subscription.created事件处理器会在用户重新订阅时自动把被禁用的组织重新启用organization.disabled False并更新组织指向的最新订阅见 readthedocs/subscriptions/event_handlers.py。试用结束的自动取消仓库还有一个容易被忽略的细节试用订阅到期后会被自动取消。在customer.subscription.updated处理器中如果订阅使用的是默认试用价格且trial_end已过但状态还不是canceled系统会主动调用 Stripe 取消该订阅见 readthedocs/subscriptions/event_handlers.py。这是因为 Stripe 不会自动结束试用订阅需要业务侧手动处理。试用期长度由设置RTD_ORG_TRIAL_PERIOD_DAYS 30控制见 readthedocs/settings/base.py。计费方式月度与年度订阅原文档对计费方式的说明非常明确所有套餐均提供月度与年度两种计费方式年度套餐相比月度计费享有 2 个月的折扣即相当于每年只付 10 个月的费用所有套餐均支持信用卡计费Pro 与 Enterprise 套餐的年度订阅支持发票invoice-based与采购订单PO计费。官方建议Read the Docs 推荐所有用户使用信用卡支付因为这会极大简化计费流程原文档 tip 原文。从源码看价格体系来自 Stripe 侧PlanForm表单会查询get_listed_products()即RTD_PRODUCTS中listedTrue的产品再过滤出 Stripe 中activeTrue的Price按unit_amount升序排列展示为“产品名人类可读价格”的下拉选项见 readthedocs/subscriptions/forms.py。也就是说月度/年度价格、具体金额均由 Stripe 端配置应用侧只负责展示与传递价格 ID。产品与功能特性的映射关系定义在RTD_PRODUCTS设置中每个RTDProduct由以下字段构成见 readthedocs/subscriptions/products.py字段含义stripe_id对应 Stripe 产品 IDfeatures该产品包含的功能特性集合RTDProductFeaturelisted是否允许用户购买是否在 Plan 表单中展示extra是否为可叠加在主套餐之上的附加产品如额外构建器功能特性类型定义在 readthedocs/subscriptions/constants.py包括自定义域名cname、公共文档 CDN、自定义 SSL、支持 SLA、私有文档、Embed API、搜索分析、页面浏览分析、并发构建数、Google SSO、SAML SSO、自定义 URL、审计日志、页面级审计日志、重定向数量上限等 14 类。当组织同时拥有主套餐与附加产品时RTDProductFeature.__add__与__mul__运算符会把各订阅项的配额累加见 readthedocs/subscriptions/products.py例如两个构建器叠加后并发构建数翻倍。升级套餐的内部流程虽然日常的升级/降级在 Stripe Billing Portal 中完成但仓库也保留了一套基于Stripe Checkout的购买流程DetailSubscription.post→redirect_to_checkout见 readthedocs/subscriptions/views.py用户提交PlanForm选择一个plan价格视图校验当前订阅状态只有已取消canceled的订阅才能发起新购否则返回 404创建或复用 Stripe 客户get_or_create_stripe_customer调用 Stripe Checkout 创建订阅会话modesubscriptionpayment_method_types[card]line_items中放入所选价格success_url为订阅详情页并追加?upgradedtruecancel_url为订阅详情页本身重定向到 Checkout 页面完成支付。支付成功后Stripe 的customer.subscription.createdwebhook 会触发subscription_created_event把新订阅挂到组织上并自动重新启用被禁用的组织见 readthedocs/subscriptions/event_handlers.py。折扣与信用非营利与学术组织享 50% 折扣原文档在“Discounts and credits”一节明确说明Read the Docs一般不提供软件折扣但社区托管的广告支持服务|org_brand|商业品牌是例外唯一的标准折扣经认证的学术与非营利组织其所有商业套餐均可享受50% 折扣申请方式通过 support 页面联系官方支持团队提出申请。同时文档给出一个实用的选型建议对于开源项目社区托管community hosting通常是最合适的选择官方也推荐大多数学术项目使用社区托管而如果对文档的公开性有约束例如必须私有托管那么商业托管commercial hosting会更合适。从代码层面看“折扣”本身由 Stripe 侧的优惠/价格配置实现仓库源码中并没有硬编码的折扣逻辑——这与“价格与折扣由 Stripe 端管理”的整体架构一致。因此 50% 折扣的落地方式是联系支持团队完成认证后由官方在 Stripe 端为你的组织配置对应的优惠价格或优惠券。订阅状态机一张图理解生命周期综合源码中 readthedocs/subscriptions/event_handlers.py 与 readthedocs/organizations/models.py 的实现可以梳理出订阅的完整生命周期组织创建get_or_create_stripe_subscription自动为组织创建 Stripe 客户与默认试用订阅试用期 30 天价格来自RTD_ORG_DEFAULT_STRIPE_SUBSCRIPTION_PRICE见 readthedocs/subscriptions/utils.py试用期trialing试用到期前TrialEndingNotification会在试用创建满 24 天时向所有所有者发送“试用即将结束”的提醒邮件见 readthedocs/subscriptions/notifications.py 与 readthedocs/subscriptions/tasks.py试用到期未付费试用订阅被自动取消发送SubscriptionRequiredNotification正式订阅active正常计费功能特性按订阅项计算欠费past_due/未支付unpaid详情页展示最后一次实际付费的周期结束日取消canceled当前账单周期内继续可用周期结束后不再续费禁用disabled订阅非活跃状态后组织被标记禁用文档与构建停止服务缓冲期 30 天DISABLE_AFTER_DAYS期间OrganizationDisabledNotification每日任务会向所有者发送“组织即将被禁用”的警告邮件见 readthedocs/subscriptions/tasks.py重新订阅通过订阅详情页发起 Checkout 购买新订阅webhook 自动重新启用组织。Organization.get_stripe_subscription对订阅状态的选取还遵循一个优先级顺序unpaid→past_due→incomplete_expired→incomplete→active→trialing见 readthedocs/organizations/models.py即优先向用户展示最紧急的状态——欠费与未支付排在第一位因为用户需要先完成支付才能继续使用服务。常见问题与最佳实践结合原文档与源码汇总几个实用要点谁可以管理订阅只有组织所有者可以。个人用户或普通成员需要联系组织所有者代为操作。能否通过邮件取消订阅不能。出于身份验证安全考虑必须登录账号并通过官方支持渠道提交请求原文档明确说明。取消后立刻失效吗不是。当前账单周期内订阅保持有效下一周期才停止续费。年度订阅省多少相比按月支付年度订阅相当于每年省 2 个月费用即约 83 折的年付。哪些计费方式可用所有套餐支持信用卡Pro 与 Enterprise 的年度订阅额外支持发票与 PO 计费。学术/非营利组织有优惠吗经认证后有 50% 标准折扣通过 support 联系官方申请。订阅到期后文档会怎样组织会被标记禁用、文档与构建停止服务但存在 30 天缓冲期且never_disable组织不受影响重新订阅后自动恢复。总结Read the Docs 的订阅管理是一套以Stripe Billing Portal 为自助操作前台、以 webhook 事件为业务联动后台的完整体系用户在 Stripe 门户完成信用卡更新、套餐升降级、发票管理仓库侧则通过customer.subscription.*系列事件自动完成组织启用/禁用、所有者通知、试用到期清理、内部流失预警等工作。理解 readthedocs/subscriptions/ 下的views.py、event_handlers.py、utils.py、products.py与 readthedocs/organizations/models.py 中的disabled、never_disable、stripe_subscription字段就能完整把握从购买、续费到取消、禁用的订阅全生命周期。赞分享后端文档【免费下载链接】readthedocs.orgThe source code that powers readthedocs.org项目地址https://gitcode.com/gh_mirrors/re/readthedocs.org点击查看免费下载相关推荐bottom 温度单位怎么配置成华氏度或开尔文bottom 温度单位怎么配置成华氏度或开尔文 bottom 默认以摄氏度Celsius显示温度温度图组件的 y 轴默认以摄氏度为刻度上限为 100°后端文档RxJS Subscription 完全指南订阅生命周期、取消订阅与资源释放机制RxJS Subscription 完全指南订阅生命周期、取消订阅与资源释放机制 本指南围绕 rxjs.dev 官方文档 guide/subscription前端Zephyr 离线开发环境零门槛一步搭好Zephyr 离线开发环境零门槛一步搭好 展会现场只给了一台内网笔记本Zephyr 固件却必须当晚改完上板——离线开发真能跑通吗能。照下面步骤走从源码落操作系统嵌入式RTOS物联网上一篇RSUITE CheckPicker 多项选择器完全指南从基础用法到源码级原理下一篇暗黑破坏神2存档编辑器网页版角色修改工具完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表