Skip to main content
这一页讲周期性收费。订单、Session 和 Webhook 那套基础和一次性支付完全一样,先看过 Hosted Checkout 接入 会顺很多。

先选路径

三种场景,走的接口不一样:
POST /checkout/sessionPOST /subscription 不是同一个接口的两种写法。前者给客户一个可交互的收银台,后者是服务端在已有客户和支付工具时直接下单。

一、准备周期性商品和价格

订阅必须用预先注册的 Product 和周期价格。priceDataList 那种临时商品建不了订阅。
interval 支持 dayweekmonthyearquarterhalf_yearcustom
quarterhalf_year 是平台自己算周期边界的,你不用把它换算成 3 个月或 6 个月再传。只有 intervalcustom 时,intervalCount 才表示天数。
这一页的示例只用月付的 flat_rate 固定价。其他计费模式见 创建价格 的字段说明。

二、推荐路径:用 Checkout 创建首次订阅

结构和一次性支付一模一样——后端建 Session、前端打开收银台、Webhook 更新本地状态。只是把临时商品换成了周期价格。
金额和币种仍然要传,后端会校验它们和 Product/Price 一致。
创建 Session 的那一刻,订阅还不存在,钱也还没收到客户提交支付后,收银台按周期价格走订阅流程,产生 Subscription、Invoice 和 Order 三个对象。浏览器跳回 successUrl 只表示交互结束——最终状态要查接口,并结合验签后的 Webhook 更新。

三、服务端路径:直接创建订阅

客户已经有 Clink Customer 和可用支付工具时用这条。
customerIdcustomerEmailreferenceCustomerId 至少给一个。周期价格必须属于当前商户,并且支持你传的 paymentCurrency
某种支付方式能不能用于订阅,还受商户渠道配置和币种限制影响。上线前按你自己账户实际启用的方式逐一验证,别照抄一张通用清单。
返回里的 status 是数字,表示这一次付款的结果: 响应还会带回 subscriptionIdsessionIdpaymentInstrumentIdorderIdinvoiceId这五个都存进你自己的订阅记录——后面查询和对账时,只靠其中一个字段会不够用。

四、订阅状态怎么映射到权益

这是接订阅时最容易做错的地方。付款状态和权益状态是两件事。
不要拿 subscription.created 当作开通付费权益的信号。 它只说明订阅记录建出来了。免费试用由 subscription.trialing 驱动;首笔付款和续费要结合 subscription.activatedinvoice.paid 和查询结果做幂等流转。权益变化要落到你自己的订阅和账单记录上,不能只更新一个订单状态——订阅是持续关系,一个订单号装不下。

五、要订阅哪些事件

一次性支付那套 order.* 仍然有效,订阅再加下面这些。 生命周期 subscription.createdsubscription.trialingsubscription.activatedsubscription.past_duesubscription.incomplete_expiredsubscription.cancelled 套餐变更 subscription.updated.plan_changedsubscription.updated.plan_change_canceledsubscription.updated.renewedsubscription.updated.cancel_at_period_end_setsubscription.updated.cancel_at_period_end_revoked 账单 invoice.openinvoice.paidinvoice.void
订阅时必须写完整的事件名。subscription.*invoice.* 这类通配符不是能提交给 API 的值
事件会重试,也不保证顺序。处理器至少要做到:
  • event.id 原子去重
  • 乱序到达时按订阅状态优先级处理,别让旧事件覆盖新状态
  • 同一个 invoiceId 的履约动作只执行一次
验签、去重和订单匹配的写法见 Hosted Checkout 接入

六、取消

reason 必填,1 到 255 个字符。cancelReasonCode 可选,取值为 too_expensiveneed_more_featuresfound_alternativeno_longer_neededpoor_customer_servicepoor_usabilitypoor_qualityother_reasons cancelImmediately 省略或传 false 时,订阅在当前周期结束时取消;传 true 立即取消。
取消不等于退款。 立即取消不会自动退还本期已收的钱。要退款得单独调 退款接口

七、升降级

必须先预览再确认,两步都要传 quantity 第一步:预览
第二步:用预览返回的 priceSnapshotId 确认
用了优惠码的话,预览和确认要传同一个码,否则金额对不上。 immediate: true 的变更可能产生补差价付款并返回 actionfalse 表示预约到下一个账期边界生效。待生效的变更可以调 POST /subscription/{id}/update/cancel 撤销。
当前 API Reference 里 preview 和 confirm 的请求体示例漏了 quantity,但服务端把它列为必填。以这一页为准,两个请求都要传。

八、计划阶段

scheduledPhases 可以让订阅在未来的续费边界自动切套餐,最多 10 个阶段,sequenceeffectiveCycle 都从 1 开始且严格递增。 这是进阶能力,首次接入用不上。字段说明见 结账会话

接下来

优惠与促销码

给订阅加折扣,以及折扣持续几个账期。

上线检查

订阅相关的验收项。