Clerk 如何用 Stripe Webhooks 玩转 User Metadata
Clerk 官方博客演示了如何结合 Clerk 的 User Metadata 与 Stripe Webhooks 搭建 SaaS 付费会员体系。Clerk 的 User Metadata 分为 public、private、unsafe 三类,分别对应前后端可读写、仅后端可读、需自行校验的不同访问级别。
Clerk 官方博客演示了如何结合 Clerk 的 User Metadata 与 Stripe Webhooks 搭建 SaaS 付费会员体系。Clerk 的 User Metadata 分为 public、private、unsafe 三类,分别对应前后端可读写、仅后端可读、需自行校验的不同访问级别。
Paddle 更新折扣(discount)实体,创建或更新时可写入 custom_data 结构化键值数据,并可在 API 响应和 webhook 中读取。
Paddle 更新平台对零金额订阅的处理:客户完成 $0 循环价格结账后,Paddle 只发送一封明确说明已保存支付方式的邮件,不再发送 $0 交易的收据。邮件中的取消链接改名为移除支付方式链接,取消页面也明确说明客户正在移除支付方式,此类订阅改为立即取消而非等到计费周期结束。API 的端点和字段没有变化,该变更现已生效。
Paddle 为 Paddle.js 新增 Paddle.PricePreview() 方法,可直接获取含折扣、税费和货币换算的本地化定价,无需再向 Paddle API 发起服务端请求。
Paddle 为平台加入客户端令牌(client-side token),可在 Paddle.Initialize() 中通过 token 参数完成认证,取代此前的 seller 参数。
Paddle 在交易实体的 payments[].method_details.card 中新增 cardholder_name 字段,返回客户结账时输入的持卡人姓名。该字段随 card 对象一并返回卡类型、后四位、到期月和年份,适用于账单信息页与更换支付方式流程。此变更已在 Paddle API v1 上线,属非破坏性更新,不影响现有集成。
Paddle 在 API v1 的 list subscriptions 操作中新增 scheduled_change_action 查询参数,用于筛选带有计划变更的订阅,包括计划暂停、计划取消以及已暂停但计划恢复的订阅。该参数支持逗号分隔传入多个变更动作,并可与 status 参数组合,找出已取消或计划取消、已暂停或计划暂停的全部订阅。此为向后兼容变更,不影响现有集成。
Paddle 将 transaction.checkout.url 改为可写字段,创建或更新交易时可传入已批准域名的 URL,用于生成该交易的支付链接。Paddle 返回的链接由传入 URL 或默认支付 URL 加上 _?
Paddle 在 API v1 中新增 effective_from 的 immediately 取值,可立即暂停或取消活跃订阅,此前只能在当前计费周期结束时生效。该字段默认值仍为 next_billing_period,请求体留空或省略该字段时行为不变。此次为非破坏性变更,不影响现有集成。
Paddle 为 Paddle.js 的 Paddle.Checkout.open() 和 Paddle.Initialize() 方法新增 showAddTaxId 参数,并配套 HTML 属性 data-show-add-tax-id,默认值均为 true,用于在结账页隐藏添加税号与公司信息的选项。该改动已在 Paddle.js 上线,无需手动升级即可使用,仍支持在打开结账页时预填公司信息。
Paddle 在 API v1 的 list subscriptions 操作中新增 collection_mode 查询参数,可按 automatic 或 manual 收款模式筛选订阅,例如返回通过发票手动收款的订阅。该参数用法与列出 transactions 时的 collection_mode 一致,属非破坏性变更,不影响现有集成。
Paddle 更新 API,在列出交易时可为 subscription_id 查询参数传入 null,用于筛选与订阅无关的单次购买交易,此前无法这样过滤。该改动在 Paddle API v1 中生效,属非破坏性变更,不影响现有集成。注意未完成结账和草稿发票的交易 subscription_id 同样为 null,可配合 status=completed 使用。
Paddle 发布了一个 wrapper,让开发者可以通过 npm、Yarn 等包管理器把 Paddle.js 作为模块加载,而不再需要手动引入脚本。该包内置 Paddle.js 方法的 TypeScript 类型定义,支持类型检查,初始化改用 initializePaddle 函数。
Paddle 为 Paddle.js 新增 Paddle.Checkout.updateCheckout() 方法,可更新未完成结账的 items、discount 和 customer 信息,并新增 checkout.updated 事件。
Paddle 为 Paddle.js 的 Paddle.Checkout.open() 和 Paddle.Initialize() 新增 showAddDiscounts 参数及 data-show-add-discounts HTML 属性,用于在结账页隐藏"添加折扣"选项,默认值为 true,需先在 Paddle 后台开启"允许买家添加折扣码"。
Paddle 现在支持 Apple Pay 和 Google Pay 的周期性交易,客户可以用这两种数字钱包支付订阅费用。此前它们只能用于 Paddle Checkout 的一次性购买,Paddle 会在首次付款后保存该支付方式并用于后续续费。
推荐理由:Paddle 把 Apple Pay 和 Google Pay 从一次性付款扩展到订阅续费,开发者无需改代码即可在后台开启。
Paddle.js 新增 checkout.warning 事件,当传入的预填数据无效或不完整、结账仍能打开但不会预填信息时触发,可用于获取出错详情。该事件对 inline checkout 集成尤其有用,便于展示自定义错误提示。此变更已在 Paddle.js 上线,无需手动升级,Paddle 会自动提供最新版本。
Paddle 在 API v1 中新增哥伦比亚比索(COP)作为支持的支付货币,开发者可为哥伦比亚客户以本币创建价格和价格覆盖。
Paddle 更新了 customer、address 和 business 实体,现在创建或更新这些实体时可以添加 custom_data 自定义键值数据。此前 custom_data 仅支持 transaction、subscription、product 和 price 实体。
Paddle 在 API v1 中新增 transaction.status 的 paid 值及对应的 transaction.paid 事件,交易在收款成功后先标记为 paid,异步处理完成后再变为 completed。
Paddle API 新增 list credit balances for a customer 操作,可查看客户当前可用余额与已使用余额。余额按币种分别记录,包含 available、reserved(已开票未付部分)和 used 三项,未产生过余额的客户不返回记录。该变更已在 Paddle API v1 上线,属非破坏性更新,不影响现有集成。
Paddle 在 API v1 中新增「激活试用订阅」操作,调用 POST /subscriptions/{subscription_id}/activate 即可立即将试用中的订阅转为付费,无需传入日期,剩余试用期直接截断。
Paddle 平台现已支持更新试用期订阅,可增删项目、修改数量、收取一次性费用以及更改下次账单日期,API 端点和字段无变化,该变更在 Paddle API v1 中为非破坏性更新。
Paddle 在 API v1 中新增 payout.created 和 payout.paid 两个可订阅事件,分别对应打款发起与到账,开发者可据此搭建记账或 Slack 通知等工作流。
Paddle 开发者更新日志显示,现在可订阅折扣通知,通过 discount.created 事件接收折扣创建提醒。示例事件包含折扣码 BF10OFF、10% off、状态 active、支持循环折扣且最多 3 个计费周期,到期时间为 2024-12-03。
Paddle 在 API v1 的「预览订阅变更」和「预览一次性扣费」两个操作的响应中新增 update_summary 对象,直接返回按比例计算的扣费或抵扣总额,开发者无需再自行累加调整项与 immediate_transaction、next_transaction 的金额来判断结果。
Hugging Face Hub 已上线 AWS Marketplace,用户可通过 AWS 账户订阅并直接支付 Hugging Face 的使用费用。订阅后,Inference Endpoints、Spaces 硬件升级和 AutoTrain 等服务的组织用量费用会自动出现在 AWS 账单上,而非由 Hugging Face 向组织绑定的信用卡扣款。
Paddle 面向 2023 年 8 月 8 日前注册的老客户推出 Paddle Billing,这是一套面向现代 SaaS 的计费与经常性收入管理功能,需在 Business Account > Account Settings > Get Paddle Billing 中由管理员手动开启,开启后不产生费用直到实际发生交易。
推荐理由:Paddle 官方说明新旧两套计费体系的数据隔离与共享边界,便于开发者判断是否现在开启。
Clerk 在 How We Roll 第 9 章拆解了认证系统所需的基础设施:自托管方案需自行处理邮件、短信、OAuth 与后台任务,而 Clerk 托管方案把前端与后端 API 跑在 Google Cloud Run 上。
Paddle API 新增 preview a one-time charge for a subscription 操作,通过 POST /subscriptions/{id}/charge/preview 可在实际计费前预览一次性费用总额。
Paddle API 新增 preview prices 操作,可传入商品列表与位置信息,返回按地区和货币格式化后的本地化价格,让定价页与 Paddle Checkout 显示一致。Paddle 现在建议多数定价页改用该操作,preview a transaction 未被弃用,仍适用于用户自选方案的进阶定价页。该变更已在 Paddle API v1 上线,属非破坏性更新,不影响现有集成。
Paddle 在 API v1 的 transaction origin 字段新增 subscription_charge 值,用于标记订阅一次性收费(one-time charge)生成的交易。
Paddle 更新了产品和价格实体,创建或更新时现在可以添加 custom_data 键值数据。此前该能力仅支持 transaction 和 subscription 实体,现在产品与价格也能用,且这两类实体会在 transaction previews 中返回,方便在定价页直接调用功能列表或标记。该变更已在 Paddle API 版本 1 上线,属于非破坏性更新,不影响现有集成。
Paddle 在 API v1 新增「get a transaction to update payment method」操作,通过 GET /subscriptions/{subscription_id}/update-payment-method-transaction 返回一笔交易。
Paddle 在 API v1 的 list prices 操作中新增 recurring 查询参数,设为 true 只返回经常性价格,false 只返回一次性价格。经常性价格的 billing_period 为对象,一次性价格则为 null。该变更为非破坏性更新,不影响现有集成,可用于判断订阅项应调用更新订阅还是一次性收费操作。
Paddle 在交易 API 响应中新增 adjustments_totals 字段,用于汇总一笔交易的所有调整金额,包含 subtotal、tax、total、fee、earnings 及 credit/refund/chargeback 明细。该字段与已有的 totals、adjusted_totals、payout_totals 并列返回,方便开发者直接读取调整后的汇总数据。
Paddle 在交易数据中新增 adjusted_totals 与 adjusted_payout_totals 字段,让开发者更直观地查看调整后的金额。以一笔订阅交易为例,原 total 为 43549(含税 3549、fee 2227),调整后 total 变为 10892、fee 557、earnings 9448,均以 USD 计价。
Paddle 在 API v1 中新增“重放通知”操作,可通过 POST /notifications/{notification_id}/replay 按 ID 重新发送通知。
Paddle 为 list notifications 操作新增 from、to 和 filter 查询参数,可按日期区间筛选通知,或用 Paddle ID 筛选与特定交易、订阅、客户相关的通知,且不限于客户事件本身。该变更已在 Paddle API v1 上线,属非破坏性更新,不影响现有集成。
Paddle.js 的 Paddle.Checkout.open() 方法新增 discountCode 参数,并配套新增 data-discount-code HTML 属性,让开发者在打开结账页时直接传入折扣码预填优惠,无需再调 API 或用 Paddle 后台查折扣 ID。